整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

IT之家学院:使用注册表手动恢复被篡改的默认浏览器

IT之家学院:使用注册表手动恢复被篡改的默认浏览器

谢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); //false


195.获取一个月有多少天

今天遇到一个需求,已知月份,得到这个月的第一天和最后一天作为查询条件查范围内的数据

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); // 2


198.什么是链表?

答案:链表是一种物理存储单元上非连续、非顺序的存储结构。链表由一系列结点组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。


199.链表的基本特征

参考答案:

  • 每个元素除了存储数据,需要有额外的内存存储一个引用(地址),来指向下一个元素;
  • 每个元素占用的内存空间并不要求是连续的;
  • 往往使用链表的第一个节点(根节点)来代表整个链表;
  • 长度是可变的,随时可以增加和删除元素;
  • 插入和删除元素的效率极高;
  • 由于要存储下一个元素的地址,会增加额外的内存开销;
  • 通过下标查询链表中的某个节点,效率很低,因此链表的下标遍历效率低。

bject.fromEntries

Object.fromEntries() 方法把键值对列表转换为一个对象。

参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries

代码案例