前端面試知識點1

W3C標準盒模型和IE盒模型的區別

W3C標準盒模型的高寬的內容區是僅僅由width,height決定的,不包含邊框,內外邊距

IE盒子模型的盒子包括了邊框內邊距,意思就是說,如果你設置了width:500px;但是如果你還設置了border: 5px; padding: 100px;那麼你的內容區的寬度只有290px;

QuerySelectorAll和getElementsBy系列的區別

  • w3c標準
  • 瀏覽器兼容
    • querySelectorAll:IE8+
    • getElements系列:IE9+(getElementsByClassName只被IE9+支持)
  • 接收參數
  • 返回值
    • querySelectorAll返回的是靜態節點列表-NodeList,對文檔的任何操作都不會對其產生影響
    • getElement系列的返回四一 動態節點列表-HTMLCollection,每一次調用這個列表都會重新對文檔進行查詢

NodeList 與 HTMLCollection 區別

  1. HTMLCollection 是元素集合而 NodeList 是節點集合(即可以包含元素,文本節點,以及注釋等等)。
  2. node.childNodes,querySelectorAll(雖然是靜態的) 返回的是 NodeList,而 node.children 和 node.getElementsByXXX 返回 HTMLCollection。

動態作用域和靜態作用域的區別

當函數中遇到既不是形參也不是函數內部定義的局部變數的變數時

  • 靜態作用域會根據函數定義的環境中去查詢,js的變數是遵循靜態作用域的,

  • 動態作用域會根據函數調用的環境中去,關於this的執行是基於動態域查詢的

var foo = 1;function static() { console.log(foo);}(function() { var foo = 2; static();}());//列印1

var foo = 1;var obj = { foo: 2, bar: function() { console.log(this.foo); }};obj.bar();//列印2

數據類型的檢測方式

  • typeof
    • 返回值為number,string,boolean,undefined,function,object
    • typeof NaN //numbertypeof abc //Stringtypeof abc++// abc++ 是NaN,而typeof NaN是number

  • instanceof
    • 只要在當前實例的原型鏈上,用instanceof檢測出來的結果都是true,所以在類的原型繼承中,最後檢測出來的結果未必都是正確
    • 123 instanceof String; //falsenew String(123) instanceof String //true

    • 使用instanceof檢測基本類型
      • 不合適,還是用typeof吧
    • 判斷實例
      • function Foo(){};var foo = new Foo();console.log(foo instanceof Foo)

    • 判斷繼承關係
      • function Parent() {}function Child() {}Child.prototype = new Parent();Child.prototype.constructor = Child;var child = new Child();console.log(child instanceof Child); //trueconsole.log(child instanceof Parent); //trueconsole.log(child instanceof Object); //trueconsole.log(Child instanceof Function); //trueconsole.log(Function instanceof Object); //true console.log(Child instanceof Child); //false

  • constructor:檢測數據類型
    • console.log((1).constructor === Number); //trueconsole.log("a".constructor === String); //trueconsole.log([].constructor === Array); //trueconsole.log({}.constructor === Object); //true

    • 功能還是挺全面的,不過也有它的局限性
      • 如果我們把類的原型進行重寫了,在重寫的過程中,很有可能把之前 constructor 給覆蓋掉,這樣檢測出的結果就不準確了
      • 並且 constructor 檢測不出 null,undefined 的類型,所以判斷類型用 constructor 也不太好用
  • Object.prototype.toStrong.call【是檢測數據類型最準確最常用的方式】

    • function toString(obj){return Object.prototype.toString.call(obj).slice(8,-1);}console.log(toString(abc) === String); console.log(toString(1) === Number);console.log(toString(false) === Boolean);console.log(toString(null) === Null);console.log(toString(undefined) === Undefined);console.log(toString([]) === Array);console.log(toString({}) === Object);console.log(toString(function(){}) === Function)

函數和對象的關係

  • 首先函數是一種對象

  • 對象都是通過函數創建的

    • 對象字面量的創建方式其實是一種語法糖

JS 如何判斷函數是 new 調用還是普通調用

  • 通過instanceof判斷
    • function fn(){if(this instanceof arguments.callee){console.log("通過new調用");}else{console.log("普通調用");}}

  • 通過constructor判斷
  • function fn(){if(this.constructor === arguments.callee){console.log("通過函數調用");}else{console.log("普通調用");}}

推薦閱讀:

瀏覽器新生態(技術周刊 2018-02-12)
js內存堆棧,遞歸原理以及淺拷貝和深拷貝的理解
前端日刊-2018.02.04
前端日刊-2018.01.15
jquery中img的load事件執行問題

TAG:前端開發 | 面試 |