謝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.鏈表的基本特征
參考答案:
Object.fromEntries() 方法把鍵值對列表轉換為一個對象。
參考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries
*請認真填寫需求信息,我們會在24小時內與您取得聯系。