面試題:js篇

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章