1.箭頭函數和正常函數的區別?
箭頭函數,this代表上層對象,若無自定義上層,則代表window
普通函數,this代表當前對象
2,sort函數的理解
原理:sort函數內部是實現是通過遞歸+冒泡排序的做法
比如數組arr=[1,4,3,2]
sort()方法的比較邏輯爲:
第一輪:1和4比,1和3比,1和2比
第二輪:4和3比,4和2比
第三輪:3和2比
實現:
function compare(a,b){
return a - b
}
let arr = [1,4,3,2]
console.log(arr.sort(compare)) //[1, 2, 3, 4]
其次,sort()方法會接受一個比較函數compare(a, b),該函數要比較兩個值,然後返回一個用於說明這兩個值的相對順序的數字。
最後,永遠要記住一句話,凡是返回1或者大於0的正數的時候就要交換位置。(內部實現)
3,數組去重
(1),es6的去重方法(set數據結構)
function unique (arr) {
return Array.from(new Set(arr))
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]
不考慮兼容性,這種去重的方法代碼最少。這種方法還無法去掉“{}”空對象。
4,new一個函數,所經歷的過程?
主要分爲四步:創建一個空對象obj、將this指向這個空對象、將obj這個對象的_proto_指向構造函數的prototype,簡歷原型和對象的關係、執行構造函數中的代碼
var newFunc = function ( func ){
//1.新建一個空對象,並將 構造函數的原型對象賦給這個空對象
var obj = Object.create(func.prototype);
//2.執行構造函數,相應參數被傳入,並將this的上下文指向新創建的對象obj
var ret = func.call(obj);
//3.如果構造函數返回了對象,就捨棄之前創建的對象obj,newObj = ret
if(typeof ret === 'object') return ret;
//4.反之,newObj = obj
else return obj;
}
var foo = function(name){
this.name = name || "100";
}
var newObj = newFunc(foo);
5,使用var和不使用var的區別
理解:不使用var聲明變量的時候,變量是全局對象屬性。使用var在全局聲明的時候,var是全局變量
全局變量屬性和全局變量的區別?
全局變量屬性可以在從全局刪除,全局變量 delete運算符不可以從全局刪除
1,var 定義變量
var num
console.log(num) //undefined
console.log(window) //window下存在num屬性,但值爲undefined
2,不使用var定義變量
num
console.log(num) //ReferenceError: num is not defined
3,不使用var定義變量,但是給num賦值,JS不會報錯,它會認爲我們是要隱式聲明一個全局變量,這一點一定要注意。
num = 1
console.log(num) //1
console.log(window) //window下存在num屬性,值爲1