谢IT之家网友 ytmountain的原创投稿
国内软件的使用环境大家想必深有体会,特别是在竞争激烈的浏览器市场,各路牛鬼蛇神都想霸占用户的电脑。
更改默认浏览器有很多种方法,今天为大家介绍一下使用注册表编辑器手动改回默认浏览器的方法,当然也可以使用各种工具软件。
环境介绍:Windows 10专业版15063.483
操作步骤:
1、打开注册表编辑器(regedit.msc)
2、定位到以下子项:
\HKEY_CURRENT_USER\Software\Classes
3、在Classes下找到.htm/.html,这时你会看到所使用的默认浏览器,如图:
4、我的电脑使用的是firefox,所以此处显示为FirefoxHTML。如果改为系统默认,只需双击键值并输入Htmlfile即可。
81.在JavaScript中创建一个真正的private方法有什么缺点?
参考答案:每一个对象都会创建一个private方法的方法,这样很耗费内存
观察下面代码
var Employee=function(name, company, salary) {
this.name=name || "";
this.company=company || "";
this.salary=salary || 5000;
// Private method
var increaseSalary=function() {
this.salary=this.salary + 1000;
};
// Public method
this.dispalyIncreasedSalary=function() {
increaseSlary();
console.log(this.salary);
};
};
// Create Employee class object
var emp1=new Employee("John", "Pluto", 3000);
// Create Employee class object
var emp2=new Employee("Merry", "Pluto", 2000);
// Create Employee class object
var emp3=new Employee("Ren", "Pluto", 2500);在这里 emp1, emp2, emp3都有一个increaseSalary私有方法的副本。
所以我们除非必要,非常不推荐使用私有方法。
182.JavaScript怎么清空数组?
参考答案:
方法1
arrayList=[];
直接改变arrayList所指向的对象,原对象并不改变。
方法2
arrayList.length=0;
这种方法通过设置length=0 使原数组清除元素。
方法3
arrayList.splice(0, arrayList.length);
183.怎么判断一个object是否是数组(array)?
参考答案:
方法1
使用 Object.prototype.toString 来判断是否是数组
function isArray(obj){
return Object.prototype.toString.call( obj )==='[object Array]';
}
这里使用call来使 toString 中 this 指向 obj。进而完成判断
方法二
使用 原型链 来完成判断
function isArray(obj){
return obj.__proto__===Array.prototype;
}
基本思想是利用 实例如果是某个构造函数构造出来的那么 它的 __proto__是指向构造函数的 prototype属性。
方法3
利用JQuery
function isArray(obj){
return $.isArray(obj)
}
JQuery isArray 的实现其实就是方法1
184.什么是 undefined x 1 ?
在chrome下执行如下代码,我们就可以看到undefined x 1的身影。
参考答案:
var trees=["redwood", "bay", "cedar", "oak", "maple"];
delete trees[3];
console.log(trees);当我们使用 delete 操作符删除一个数组中的元素,这个元素的位置就会变成一个占位符。打印出来就是undefined x 1。 注意如果我们使用trees[3]==='undefined × 1'返回的是 false。因为它仅仅是一种打印表示,并不是值变为undefined x 1。
185.两种函数声明有什么区别?
var foo=function() {
// Some code
};
function bar() {
// Some code
};参考答案:
foo的定义是在运行时。想系统说明这个问题,我们要引入变量提升的这一概念。
我们可以运行下如下代码看看结果。
console.log(foo)
console.log(bar)
var foo=function() {
// Some code
};
function bar() {
// Some code
};输出为
undefined
function bar(){
// Some code
};
为什么那?为什么 foo 打印出来是 undefined,而 bar打印出来却是函数?
JavaScript在执行时,会将变量提升。
所以上面代码JavaScript 引擎在实际执行时按这个顺序执行。
// foo bar的定义位置被提升
function bar() {
// Some code
};
var foo;
console.log(foo)
console.log(bar)
foo=function() {
// Some code
};186.什么是跨域?跨域请求资源的方法有哪些?
参考答案:
(1)、porxy代理
定义和用法:proxy代理用于将请求发送给后台服务器,通过服务器来发送请求,然后将请求的结果传递给前端。
实现方法:通过nginx代理;
注意点:1、如果你代理的是https协议的请求,那么你的proxy首先需要信任该证书(尤其是自定义证书)或者忽略证书检查,否则你的请求无法成功。
(2)、CORS 【Cross-Origin Resource Sharing】
定义和用法:是现代浏览器支持跨域资源请求的一种最常用的方式。
使用方法:一般需要后端人员在处理请求数据的时候,添加允许跨域的相关操作。如下:
res.writeHead(200, {
"Content-Type": "text/html; charset=UTF-8",
"Access-Control-Allow-Origin":'http://localhost',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
'Access-Control-Allow-Headers': 'X-Requested-With, Content-Type'
});
(3)、jsonp
定义和用法:通过动态插入一个script标签。浏览器对script的资源引用没有同源限制,同时资源加载到页面后会立即执行(没有阻塞的情况下)。
特点:通过情况下,通过动态创建script来读取他域的动态资源,获取的数据一般为json格式。
实例如下:
<script>
function testjsonp(data) {
console.log(data.name); // 获取返回的结果
}
</script>
<script>
var _script=document.createElement('script');
_script.type="text/javascript";
_script.src="http://localhost:8888/jsonp?callback=testjsonp";
document.head.appendChild(_script);
</script>
缺点:
1、这种方式无法发送post请求(这里)
2、另外要确定jsonp的请求是否失败并不容易,大多数框架的实现都是结合超时时间来判定。
187.谈谈垃圾回收机制方式及内存管理
参考答案:
回收机制方式
1、定义和用法:垃圾回收机制(GC:Garbage Collection),执行环境负责管理代码执行过程中使用的内存。
2、原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。
3、实例如下:
function fn1() {
var obj={name: 'hanzichi', age: 10};
}
function fn2() {
var obj={name:'hanzichi', age: 10};
return obj;
}
var a=fn1();
var b=fn2();
fn1中定义的obj为局部变量,而当调用结束后,出了fn1的环境,那么该块内存会被js引擎中的垃圾回收器自动释放;在fn2被调用的过程中,返回的对象被全局变量b所指向,所以该块内存并不会被释放。
4、垃圾回收策略:标记清除(较为常用)和引用计数。
标记清除:
定义和用法:当变量进入环境时,将变量标记"进入环境",当变量离开环境时,标记为:"离开环境"。某一个时刻,垃圾回收器会过滤掉环境中的变量,以及被环境变量引用的变量,剩下的就是被视为准备回收的变量。
到目前为止,IE、Firefox、Opera、Chrome、Safari的js实现使用的都是标记清除的垃圾回收策略或类似的策略,只不过垃圾收集的时间间隔互不相同。
引用计数:
定义和用法:引用计数是跟踪记录每个值被引用的次数。
基本原理:就是变量的引用次数,被引用一次则加1,当这个引用计数为0时,被视为准备回收的对象。
188.内存管理
参考答案:
1、什么时候触发垃圾回收?
垃圾回收器周期性运行,如果分配的内存非常多,那么回收工作也会很艰巨,确定垃圾回收时间间隔就变成了一个值得思考的问题。
IE6的垃圾回收是根据内存分配量运行的,当环境中的变量,对象,字符串达到一定数量时触发垃圾回收。垃圾回收器一直处于工作状态,严重影响浏览器性能。
IE7中,垃圾回收器会根据内存分配量与程序占用内存的比例进行动态调整,开始回收工作。
2、合理的GC方案:(1)、遍历所有可访问的对象; (2)、回收已不可访问的对象。
3、GC缺陷:(1)、停止响应其他操作;
4、GC优化策略:(1)、分代回收(Generation GC);(2)、增量GC
189.开发过程中遇到的内存泄露情况,如何解决的?
参考答案:
1、定义和用法:
内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。C#和Java等语言采用了自动垃圾回收方法管理内存,几乎不会发生内存泄露。我们知道,浏览器中也是采用自动垃圾回收方法管理内存,但由于浏览器垃圾回收方法有bug,会产生内存泄露。
2、内存泄露的几种情况:
(1)、当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会作出恰当处理,此时要先手工移除事件,不然会存在内存泄露。
实例如下:
<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
var btn=document.getElementById("myBtn");
btn.onclick=function(){
document.getElementById("myDiv").innerHTML="Processing...";
}
</script>
解决方法如下:
<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
var btn=document.getElementById("myBtn");
btn.onclick=function(){
btn.onclick=null;
document.getElementById("myDiv").innerHTML="Processing...";
}
</script>
(2)、由于是函数内定义函数,并且内部函数--事件回调的引用外暴了,形成了闭包。闭包可以维持函数内局部变量,使其得不到释放。
实例如下:
function bindEvent(){
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
}
解决方法如下:
function bindEvent(){
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
obj=null;
}
190.IE与标准浏览器对事件处理的区别?
参考答案:
1.监听
标准
element.addEventListener('click',observer, useCapture);
element.removeEventListener('click',observer, useCapture);
IE
element.attachEvent('onclick',observer);
element.detachEvent('onclick',observer);
2.阻止冒泡
标准
event.stopPropagation();
IE
event.cancelBubble=true;
3.阻止默认
标准
event.preventDefault();
IE
event.returnValue=false;
4.event
标准
event
IE8以下
window.event
5.触发当前事件的源对象
event.target //Firefox,Chrome
event.srcElement //IE,Chrome
191.delete用法
参考答案:
用于对象属性的删除
var obj={
name: 'Lily'
};
delete obj.name;
obj.name //undefined
不能删除变量、原型中的变量、函数
192.如何删除一个cookie
参考答案:
1.将时间设为当前时间往前一点。
var date=newDate();
date.setDate(date.getDate() - 1);//真正的删除
setDate()方法用于设置一个月的某一天。
2.expires的设置
document.cookie='user='+ encodeURIComponent('name') + ';expires=' + newDate(0)
193.用正则把yya yyb yyc变成yya5 yyb6 yyc7?
参考答案:
j=5;
str.replace(/\w+/g, function(m) {
return m + j++;
});
// function的第一参数代表匹配正则的字符串,第二个代表第一个子表达式匹配的字符串,第三个代表第二个子表达式匹配的字符串。194.怎么判断两个json对象的内容相等?
参考答案:
obj={
a: 1,
b: 2
}
obj2={
a: 1,
b: 2
}
obj3={
a: 1,
b: 2
}
JSON.stringify(obj)==JSON.stringify(obj2); //true
JSON.stringify(obj)==JSON.stringify(obj3); //false195.获取一个月有多少天
今天遇到一个需求,已知月份,得到这个月的第一天和最后一天作为查询条件查范围内的数据
new Date(year, month, date, hrs, min, sec),new Date 可以接受这些参数创建一个时间对象 其中当我们把 date 设置为 0 的时候,可以直接通过 getDate() 获取到最后一天的日期然后得到我们要的最后一天
参考答案:
new Date(2019, 12, 0).getDate(); // 31
new Date(2018, 2, 0).getDate(); // 28
// 根据这个我们可以得到一个方法
function getMonthLength(month) {
const date=new Date(month);
const year=date.getFullYear();
// 月份是从 0 开始计算的
const _month=date.getMonth() + 1;
return new Date(year, _month, 0).getDate();
}196.关于函数的 length 属性
参考答案:
(()=> 1).length===0; // 输出true解析:
函数是有 length 属性的,函数的 length 属性就是函数参数的个数,函数的参数就是 arguments,而 arguments 也是一个类数组对象所以他是有 length 属性的
197.数组中字符串键值的处理
在 JavaScript 中数组是通过数字进行索引,但是有趣的是他们也是对象,所以也可以包含 字符串 键值和属性,但是这些不会被计算在数组的长度(length)内
如果字符串键值能够被强制类型转换为十进制数字的话,它就会被当做数字索引来处理
参考答案:
const arr=[];
arr[0]=1;
arr['1']='嘿嘿';
arr['cym']='cym';
console.log(arr); // [1, '嘿嘿', cym: 'cym']
console.log(arr.length); // 2198.什么是链表?
答案:链表是一种物理存储单元上非连续、非顺序的存储结构。链表由一系列结点组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
199.链表的基本特征
参考答案:
Object.fromEntries() 方法把键值对列表转换为一个对象。
参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries
*请认真填写需求信息,我们会在24小时内与您取得联系。