Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
謝IT之家網(wǎng)友 ytmountain的原創(chuàng)投稿
國內(nèi)軟件的使用環(huán)境大家想必深有體會,特別是在競爭激烈的瀏覽器市場,各路牛鬼蛇神都想霸占用戶的電腦。
更改默認瀏覽器有很多種方法,今天為大家介紹一下使用注冊表編輯器手動改回默認瀏覽器的方法,當然也可以使用各種工具軟件。
環(huán)境介紹:Windows 10專業(yè)版15063.483
操作步驟:
1、打開注冊表編輯器(regedit.msc)
2、定位到以下子項:
\HKEY_CURRENT_USER\Software\Classes
3、在Classes下找到.htm/.html,這時你會看到所使用的默認瀏覽器,如圖:
4、我的電腦使用的是firefox,所以此處顯示為FirefoxHTML。如果改為系統(tǒng)默認,只需雙擊鍵值并輸入Htmlfile即可。
81.在JavaScript中創(chuàng)建一個真正的private方法有什么缺點?
參考答案:每一個對象都會創(chuàng)建一個private方法的方法,這樣很耗費內(nèi)存
觀察下面代碼
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怎么清空數(shù)組?
參考答案:
方法1
arrayList=[];
直接改變arrayList所指向的對象,原對象并不改變。
方法2
arrayList.length=0;
這種方法通過設(shè)置length=0 使原數(shù)組清除元素。
方法3
arrayList.splice(0, arrayList.length);
183.怎么判斷一個object是否是數(shù)組(array)?
參考答案:
方法1
使用 Object.prototype.toString 來判斷是否是數(shù)組
function isArray(obj){
return Object.prototype.toString.call( obj )==='[object Array]';
}
這里使用call來使 toString 中 this 指向 obj。進而完成判斷
方法二
使用 原型鏈 來完成判斷
function isArray(obj){
return obj.__proto__===Array.prototype;
}
基本思想是利用 實例如果是某個構(gòu)造函數(shù)構(gòu)造出來的那么 它的 __proto__是指向構(gòu)造函數(shù)的 prototype屬性。
方法3
利用JQuery
function isArray(obj){
return $.isArray(obj)
}
JQuery isArray 的實現(xiàn)其實就是方法1
184.什么是 undefined x 1 ?
在chrome下執(zhí)行如下代碼,我們就可以看到undefined x 1的身影。
參考答案:
var trees=["redwood", "bay", "cedar", "oak", "maple"];
delete trees[3];
console.log(trees);
當我們使用 delete 操作符刪除一個數(shù)組中的元素,這個元素的位置就會變成一個占位符。打印出來就是undefined x 1。 注意如果我們使用trees[3]==='undefined × 1'返回的是 false。因為它僅僅是一種打印表示,并不是值變?yōu)閡ndefined x 1。
185.兩種函數(shù)聲明有什么區(qū)別?
var foo=function() {
// Some code
};
function bar() {
// Some code
};
參考答案:
foo的定義是在運行時。想系統(tǒng)說明這個問題,我們要引入變量提升的這一概念。
我們可以運行下如下代碼看看結(jié)果。
console.log(foo)
console.log(bar)
var foo=function() {
// Some code
};
function bar() {
// Some code
};
輸出為
undefined
function bar(){
// Some code
};
為什么那?為什么 foo 打印出來是 undefined,而 bar打印出來卻是函數(shù)?
JavaScript在執(zhí)行時,會將變量提升。
所以上面代碼JavaScript 引擎在實際執(zhí)行時按這個順序執(zhí)行。
// foo bar的定義位置被提升
function bar() {
// Some code
};
var foo;
console.log(foo)
console.log(bar)
foo=function() {
// Some code
};
186.什么是跨域?跨域請求資源的方法有哪些?
參考答案:
(1)、porxy代理
定義和用法:proxy代理用于將請求發(fā)送給后臺服務(wù)器,通過服務(wù)器來發(fā)送請求,然后將請求的結(jié)果傳遞給前端。
實現(xiàn)方法:通過nginx代理;
注意點:1、如果你代理的是https協(xié)議的請求,那么你的proxy首先需要信任該證書(尤其是自定義證書)或者忽略證書檢查,否則你的請求無法成功。
(2)、CORS 【Cross-Origin Resource Sharing】
定義和用法:是現(xiàn)代瀏覽器支持跨域資源請求的一種最常用的方式。
使用方法:一般需要后端人員在處理請求數(shù)據(jù)的時候,添加允許跨域的相關(guān)操作。如下:
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
定義和用法:通過動態(tài)插入一個script標簽。瀏覽器對script的資源引用沒有同源限制,同時資源加載到頁面后會立即執(zhí)行(沒有阻塞的情況下)。
特點:通過情況下,通過動態(tài)創(chuàng)建script來讀取他域的動態(tài)資源,獲取的數(shù)據(jù)一般為json格式。
實例如下:
<script>
function testjsonp(data) {
console.log(data.name); // 獲取返回的結(jié)果
}
</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、這種方式無法發(fā)送post請求(這里)
2、另外要確定jsonp的請求是否失敗并不容易,大多數(shù)框架的實現(xiàn)都是結(jié)合超時時間來判定。
187.談?wù)劺厥諜C制方式及內(nèi)存管理
參考答案:
回收機制方式
1、定義和用法:垃圾回收機制(GC:Garbage Collection),執(zhí)行環(huán)境負責(zé)管理代碼執(zhí)行過程中使用的內(nèi)存。
2、原理:垃圾收集器會定期(周期性)找出那些不在繼續(xù)使用的變量,然后釋放其內(nèi)存。但是這個過程不是實時的,因為其開銷比較大,所以垃圾回收器會按照固定的時間間隔周期性的執(zhí)行。
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為局部變量,而當調(diào)用結(jié)束后,出了fn1的環(huán)境,那么該塊內(nèi)存會被js引擎中的垃圾回收器自動釋放;在fn2被調(diào)用的過程中,返回的對象被全局變量b所指向,所以該塊內(nèi)存并不會被釋放。
4、垃圾回收策略:標記清除(較為常用)和引用計數(shù)。
標記清除:
定義和用法:當變量進入環(huán)境時,將變量標記"進入環(huán)境",當變量離開環(huán)境時,標記為:"離開環(huán)境"。某一個時刻,垃圾回收器會過濾掉環(huán)境中的變量,以及被環(huán)境變量引用的變量,剩下的就是被視為準備回收的變量。
到目前為止,IE、Firefox、Opera、Chrome、Safari的js實現(xiàn)使用的都是標記清除的垃圾回收策略或類似的策略,只不過垃圾收集的時間間隔互不相同。
引用計數(shù):
定義和用法:引用計數(shù)是跟蹤記錄每個值被引用的次數(shù)。
基本原理:就是變量的引用次數(shù),被引用一次則加1,當這個引用計數(shù)為0時,被視為準備回收的對象。
188.內(nèi)存管理
參考答案:
1、什么時候觸發(fā)垃圾回收?
垃圾回收器周期性運行,如果分配的內(nèi)存非常多,那么回收工作也會很艱巨,確定垃圾回收時間間隔就變成了一個值得思考的問題。
IE6的垃圾回收是根據(jù)內(nèi)存分配量運行的,當環(huán)境中的變量,對象,字符串達到一定數(shù)量時觸發(fā)垃圾回收。垃圾回收器一直處于工作狀態(tài),嚴重影響瀏覽器性能。
IE7中,垃圾回收器會根據(jù)內(nèi)存分配量與程序占用內(nèi)存的比例進行動態(tài)調(diào)整,開始回收工作。
2、合理的GC方案:(1)、遍歷所有可訪問的對象; (2)、回收已不可訪問的對象。
3、GC缺陷:(1)、停止響應(yīng)其他操作;
4、GC優(yōu)化策略:(1)、分代回收(Generation GC);(2)、增量GC
189.開發(fā)過程中遇到的內(nèi)存泄露情況,如何解決的?
參考答案:
1、定義和用法:
內(nèi)存泄露是指一塊被分配的內(nèi)存既不能使用,又不能回收,直到瀏覽器進程結(jié)束。C#和Java等語言采用了自動垃圾回收方法管理內(nèi)存,幾乎不會發(fā)生內(nèi)存泄露。我們知道,瀏覽器中也是采用自動垃圾回收方法管理內(nèi)存,但由于瀏覽器垃圾回收方法有bug,會產(chǎn)生內(nèi)存泄露。
2、內(nèi)存泄露的幾種情況:
(1)、當頁面中元素被移除或替換時,若元素綁定的事件仍沒被移除,在IE中不會作出恰當處理,此時要先手工移除事件,不然會存在內(nèi)存泄露。
實例如下:
<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)、由于是函數(shù)內(nèi)定義函數(shù),并且內(nèi)部函數(shù)--事件回調(diào)的引用外暴了,形成了閉包。閉包可以維持函數(shù)內(nèi)局部變量,使其得不到釋放。
實例如下:
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與標準瀏覽器對事件處理的區(qū)別?
參考答案:
1.監(jiān)聽
標準
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.觸發(fā)當前事件的源對象
event.target //Firefox,Chrome
event.srcElement //IE,Chrome
191.delete用法
參考答案:
用于對象屬性的刪除
var obj={
name: 'Lily'
};
delete obj.name;
obj.name //undefined
不能刪除變量、原型中的變量、函數(shù)
192.如何刪除一個cookie
參考答案:
1.將時間設(shè)為當前時間往前一點。
var date=newDate();
date.setDate(date.getDate() - 1);//真正的刪除
setDate()方法用于設(shè)置一個月的某一天。
2.expires的設(shè)置
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的第一參數(shù)代表匹配正則的字符串,第二個代表第一個子表達式匹配的字符串,第三個代表第二個子表達式匹配的字符串。
194.怎么判斷兩個json對象的內(nèi)容相等?
參考答案:
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.獲取一個月有多少天
今天遇到一個需求,已知月份,得到這個月的第一天和最后一天作為查詢條件查范圍內(nèi)的數(shù)據(jù)
new Date(year, month, date, hrs, min, sec),new Date 可以接受這些參數(shù)創(chuàng)建一個時間對象 其中當我們把 date 設(shè)置為 0 的時候,可以直接通過 getDate() 獲取到最后一天的日期然后得到我們要的最后一天
參考答案:
new Date(2019, 12, 0).getDate(); // 31
new Date(2018, 2, 0).getDate(); // 28
// 根據(jù)這個我們可以得到一個方法
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.關(guān)于函數(shù)的 length 屬性
參考答案:
(()=> 1).length===0; // 輸出true
解析:
函數(shù)是有 length 屬性的,函數(shù)的 length 屬性就是函數(shù)參數(shù)的個數(shù),函數(shù)的參數(shù)就是 arguments,而 arguments 也是一個類數(shù)組對象所以他是有 length 屬性的
197.數(shù)組中字符串鍵值的處理
在 JavaScript 中數(shù)組是通過數(shù)字進行索引,但是有趣的是他們也是對象,所以也可以包含 字符串 鍵值和屬性,但是這些不會被計算在數(shù)組的長度(length)內(nèi)
如果字符串鍵值能夠被強制類型轉(zhuǎn)換為十進制數(shù)字的話,它就會被當做數(shù)字索引來處理
參考答案:
const arr=[];
arr[0]=1;
arr['1']='嘿嘿';
arr['cym']='cym';
console.log(arr); // [1, '嘿嘿', cym: 'cym']
console.log(arr.length); // 2
198.什么是鏈表?
答案:鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結(jié)構(gòu)。鏈表由一系列結(jié)點組成,結(jié)點可以在運行時動態(tài)生成。每個結(jié)點包括兩個部分:一個是存儲數(shù)據(jù)元素的數(shù)據(jù)域,另一個是存儲下一個結(jié)點地址的指針域。
199.鏈表的基本特征
參考答案:
Object.fromEntries() 方法把鍵值對列表轉(zhuǎn)換為一個對象。
參考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。