ECMAScript中的三個基本的操作符,許多細節(jié)雖然不算復(fù)雜笋熬,不好好整理一下也會感覺概念有一些不清晰热某。時常回顧胳螟,以免生疏昔馋。
typeof
typeof
操作符的作用是返還當(dāng)前參數(shù)的數(shù)據(jù)類型,記住以下這幾個稍微特殊的情況糖耸,基本沒有什么大問題秘遏。
typeof 'a' // string
typeof 1 // number
typeof NaN // number
typeof function() {} // function
typeof undefined // undefined
typeof Symbol() // symbol ES6新加入的數(shù)據(jù)類型
// 除此之外,其他數(shù)據(jù)類型均返還object
typeof [1]
typeof { a: 5 }
typeof (new Date())
typeof null
值得注意的是嘉竟,typeof null === Oeject
是和我們正常的理解所違背的邦危,據(jù)說這是當(dāng)初開發(fā)ECMAScript的一個失誤,飽受業(yè)界的詬病舍扰。但是我們作為ECMAScript的使用者倦蚪,還是應(yīng)該牢記這一特性。
instanceof
講道理边苹,理解instanceof
還是先從定義入手比較合適陵且。
The instanceof operator tests whether an object has in its prototype chain the prototype property of a constructor. 來源:MDN
作為一名英語渣,我一般這么去理解:“后者的 prototype
是否處于前者的原型鏈(這里指隱式原型)上”个束。因此我們可以得出使用instanceof
的一個前提條件——后者必須有prototype
屬性慕购。
誰有prototype
屬性呢?
雖然只有構(gòu)造函數(shù)的prototype
才有意義播急,但是JavaScript語言本身并沒有區(qū)別函數(shù)與構(gòu)造函數(shù)的概念脓钾,所以嚴(yán)格意義上來說,有且僅有非原生函數(shù)與原生構(gòu)造函數(shù)可以作為instanceof
操作符的后者桩警。
// 非Object數(shù)據(jù)類型可训,皆為false
1 instanceof Object
'str' instanceof Object
true instanceof Object
NaN instanceof Object
undefined instanceof Object
// 雖然typeof null === Oeject是事實標(biāo)準(zhǔn),但很明顯null instanceof Object === false才符合開發(fā)人員的邏輯預(yù)期
null instanceof Object
Object.create(null) instanceof Object
// 任意Object類型的數(shù)據(jù)類型 instanceof Object捶枢,皆為true(除了樓上兩個null)
Boolean instanceof Object // true
Number instanceof Object // true
String instanceof Object // true
// 實例與構(gòu)造函數(shù)的情況
function A () {}
var a = new A()
a instanceof A // true
=== 與 ==
人們總是覺得===
和==
的區(qū)分很簡單握截,恩,確實很簡單烂叔。
1 == '1' // true
1 === '1' // false
// 很簡單對吧谨胞?恩,把下面的也記住了
true == 1
true == '1'
false == 0
false == '0' // true
// 上述這四個家伙皆為true蒜鸡,除此之外胯努,誰來都不好使
true == 'true'
false == 'false'
false == null
false == NaN
false == undefined // false
另外牢裳,我們所討論的===
和==
,有一個重要的前提是——基本數(shù)據(jù)類型叶沛。任何非基本數(shù)據(jù)類型作===
和==
運算蒲讯,比較的都是內(nèi)存地址。換言之灰署,任何兩個非同一引用的非基本數(shù)據(jù)類型相比較判帮,皆為false
。
var a = {}
var b = {}
a === b // false
a == b // false