1、原始類型(基本類型)有哪些?null是對象嗎?
number、string、null、undefined、Boolean、symbol(ES6新增)
原始類型儲存的是值,是沒有函數(shù)可以調(diào)用的。'1'.tostring()做了隱式轉(zhuǎn)換,轉(zhuǎn)換為了String類型,就是字符串的對象包裝類型,所以可以調(diào)用tostring()函數(shù)
null不是對象,雖然typeof null 會輸出object,但是這是js的一個悠久bug。在js最初版本中使用的是32位系統(tǒng),為了性能考慮使用低位儲存變量的類型信息,000開頭的是對象。而null表示為全零,所以將它錯誤的判斷為object。雖然現(xiàn)在的內(nèi)部類型代碼判斷已經(jīng)改變,但是這個bug一直流傳下來
2、對象類型(引用類型)與原始類型有什么區(qū)別?函數(shù)參數(shù)是對象會發(fā)生什么問題?
對象類型儲存的是個地址,原始類型儲存的是值
3、typeof 是否能正確判斷類型?instanceof 能正確判斷對象的原理是什么?
typeof能判斷除null之外的所有基本類型
instanceof正確判斷對象是因為內(nèi)部機(jī)制通過原型鏈來判斷的
valueof()返回對象的原始值
4、如何正確判斷this的指向?箭頭函數(shù)的this是什么?
function foo(){
console.log(this.a) //this--->window
}
a=1
foo()
const obj = {
a:2,
foo:foo
}
obj.foo() //this--->obj
const c =new foo() //---> c
- 對于直接調(diào)用foo函數(shù)的,不管foo()位于什么位置,this指向都是window
- 對于obj.foo(),誰調(diào)用了foo(),this指向就是誰。所以這種情況下this就是obj
-
對于new的方式來說,this被永遠(yuǎn)綁定在了c上,不會被任何方式改變
this指向流程圖,圖中流程只針對單個規(guī)則:
但是可能會發(fā)生多個規(guī)則同時出現(xiàn)的情況,這時候不同的規(guī)則之間會根據(jù)優(yōu)先級最高的來決定 this 最終指向哪里。
new的方式優(yōu)先級>bind/apply()/call() >obj.foo() > foo()
箭頭函數(shù)的this一旦綁定,就不會被任何方式改變
this指向流程圖
