undefined==null //true []==[] //false []==![] //true {}==!{} //false ![]=={} //false []==!{} //true [1,2]==![1] //false
ES5的數據類型分爲6種:Undefined
Null
String
Number
Boolean
Object
,若是再加上ES6Symbol
數據類型,一共7種;git
null
與undefined
的區別:github
null
描述一個空值(空的對象引用即空指針),null
被當作一個對象,typeOf null
輸出爲'Object'
(算是一個bug吧),Number(null)
輸出爲0
。undefined
是預約義的全局變量,表示「缺乏值」,typeOf undefined
輸出爲'undefined'
,Number(undefined)
輸出爲NaN
;null
是一個關鍵字,而undefined
並非一個關鍵字;js的數據類型其實能夠分爲兩種:原始類型
和引用類型
。原始類型
又稱簡單類型
和基本類型
,包括Undefined
、Null
、Boolean
、Number
和String
五種。引用類型
又稱複雜類型
,即Object
;原始類型
和引用類型
分別稱爲原始值
和複雜值
;算法
簡單的說:原始值
是固定而簡單的值,是存放在棧(stack)中的簡單數據段,也就是說,它們的值直接存儲在變量訪問的位置,原始類型
的值被稱爲原始值
函數
原始類型(primitive type)
有如下五種類型:Undefined
,Null
,Boolean
,Number
,String
.net
typeOf
運算符:指針
條件 | 返回值 |
---|---|
若是變量是undefined 類型 |
undefined |
若是變量是Boolean 類型 |
boolean |
若是變量是Number 類型 |
number |
若是變量是String 類型 |
string |
若是變量是Null 類型 |
object |
若是變量是引用類型 | object |
用Type(z)表明z的數據類型,比較運算 x==y,其中x和y是值,產生true或false。 1.Type(x)與Type(y)相同: a.若是Type(x)爲Undefined或Null,則返回true b.若是Type(x)爲Number,則: i.若x爲NaN,返回false ii.若y爲NaN,返回false iii.若x與y數值相等,返回true iiii.若x爲+0,y爲-0,返回true iv.若x爲-0,y爲+0,返回true v.返回false c.若是Type(x)爲String,則x和y對應位置的字符徹底同樣才返回true,不然返回false, d.若是Type(x)爲Boolean,則相同值返回true,不然false f.當x和y引用同一對象時,返回true,不然,返回false 2.x爲undefined,y爲null,返回true,反之亦然 3. Type(x)爲String,Type(y)爲Number,則返回比較ToNumber(x) == y,反之亦然 4.Type(x)爲Boolean,則返回比較ToNumber(x)==y的結果,反之亦然 5.Type(x)爲String或Number,Type(y)爲Object,則返回比較ToPrimitive(y) == x 6.返回false
再來看看ToBoolean
,ToNumber
,ToPrimitive
三個運算符的定義:code
輸入類型 | 結果 |
---|---|
Undefined |
false |
Null |
false |
Boolean |
不轉換 |
Number |
若是參數是-0 ,+0 或NaN ,結果爲false ,不然爲true |
String |
若是參數是空字符串(長度爲零),結果爲false ,不然爲true |
Object |
true |
輸入類型 | 結果 |
---|---|
Undefined |
NaN |
Null |
+0 |
Boolean |
參數爲true ,結果爲1 ,參數爲false ,結果爲+0 |
Number |
不轉換 |
String |
參見下文的文法和註釋 |
Object |
應用下步驟:一、設原始值爲ToPrimitive(輸入參數,暗示,數值類型)。二、返回ToNumber(原始值) |
ToPrimitive運算符接收一個值,和一個可選的指望類型做參數。ToPrimitive運算符把其值參數轉換爲非類型對象。若是對象有能力被轉換爲不止一種原語類型,可使用可選的 指望類型 來暗示那個類型。對象
輸入類型 | 結果 |
---|---|
Undefined |
不轉換 |
Null |
不轉換 |
Boolean |
不轉換 |
Number |
不轉換 |
String |
不轉換 |
Object |
返回該對象的默認值。對象的默認值由指望類型傳入做爲hint 參數調用對象內部方法[DefaultValue]獲得 |
** ToPrimitive
這個方法,參照火狐MDN上的文檔介紹,大體意思以下:blog
ToPrimitive(obj,preferredType)ip
JS引擎內部轉換爲原始值ToPrimitive(obj,preferredType)函數接受兩個參數,第一個obj爲被轉換的對象,第二個
preferredType爲但願轉換成的類型(默認爲空,接受的值爲Number或String)在執行ToPrimitive(obj,preferredType)時若是第二個參數爲空而且obj爲Date的實例時,此時preferredType會
被設置爲String,其餘狀況下preferredType都會被設置爲Number若是preferredType爲Number,ToPrimitive執
行過程如
下:
- 若是obj爲原始值,直接返回;
- 不然調用 obj.valueOf(),若是執行結果是原始值,返回之;
- 不然調用 obj.toString(),若是執行結果是原始值,返回之;
- 不然拋異常。
若是preferredType爲String,將上面的第2步和第3步調換,即:
- 若是obj爲原始值,直接返回;
- 不然調用 obj.toString(),若是執行結果是原始值,返回之;
- 不然調用 obj.valueOf(),若是執行結果是原始值,返回之;
- 不然拋異常
Ok,到如今,咱們須要瞭解,toString
方法和valueOf
方法;
toString
用來返回對象的字符串表示。
let obj = {name:"Tom"}; //"[object Object]" let obj = {}; //"[object Object]" let arr = [1,2]; //"1,2" let arr = []; //"" let str = "1"; //"1" let num = 1; //"1" let boo = true; //"true" let date = new Date(); //"date Sat Mar 24 2018 00:23:12 GMT+0800 (CST)" let nul = null; //報錯 let und; //報錯
valueOf
方法返回對象的原始值,多是字符串
、數值
或bool
值等,看具體的對象。
let obj = {name:"Tom"}; //{name:"Tom"} let arr = [1,2]; //[1,2] let str = "1"; //"1" let num = 1; //1 let boo = true; //true let date = new Date(); //1521822331609 let nul = null; //報錯 let und; //報錯
簡單理解:原始值指的是[Null
,Undefined
,String
,Boolean
,Number
]五種基本數據類型之一
==
運算的規則:1. undefined == null,結果是true。且它倆與全部其餘值比較的結果都是false。 2. String == Boolean,須要兩個操做數同時轉爲Number。 3. String/Boolean == Number,須要String/Boolean轉爲Number。 4. Object == Primitive(原始值),須要Object轉爲Primitive(具體經過valueOf和toString方法)。
undefined==null //true []==[] //false []==![] //true {}==!{} //false ![]=={} //false []==!{} //true [1,2]==![1] //false
undefined==null
結果爲true,不用解釋了,記住就好了
[]==[]
typeOf([])
獲得的是'object'
1-f
,引用同一類型的纔算相等false
[]==![]
!
取反運算符的優先級高於==
,所以先算出![]
這個得值,再去使用抽象相等算法進行比較ToBoolean
,再去取反ToBoolean([])
返回的是true
,所以![]
應該爲false
[]==![]
轉換爲了[]==false
4
條,則咱們能夠比較[]==ToNumber[false]
的值,則能夠獲得[]==0
5
條,比較ToPrimitive([])==0
[]
不是Date
類型,因此先獲得[].valueOf()
的值,爲[]
[].toString()
的值,爲""
的字符串[].valueOf().toString()
,獲得""
字符串,此時[]
轉換爲了原始值類型(即五種基本類型中的一種)了。3
,則能夠比較ToNumber("")==0
,到這裏[]==![]
轉化爲了0==0
true
{}==![]
1-5
步,能夠獲得{}==0
5
條,ToPrimitive({})==0
,獲得{}.valueOf().toString()
獲得一個字符串"[object Object]"
,是原始類型3
,最後比較ToNumber("[object Object]")==0
,轉變爲1==0
false
其他的栗子本身算一算吧
本身從新寫了寫一遍整理了一下思路,若是什麼地方沒有講清楚,請指出;
參考: