前言
首先需要知道的是,js中有6個值為false,分別是: 0, '', null, undefined, NaN 和 false, 其他(包括{}, [], Infinity)為true.
可以使用Boolean()函數或是兩次取非就能獲得對象的布爾值,例如Boolean(undefined)和!!undefined同樣能取得布爾值false,
對於0, '', null, undefined, NaN,{}, [], Infinity求布爾值,分別是false false false false false true true true.
因此我們知道的一點是:對象的布爾值是true,即使是對象{}。
boolean類型的特殊性
JS比較規則:
- 如果比較的兩者中有bool,會把 bool 先轉換為對應的 number,即 0 和 1
- 如果比較的雙方中有一方為number一方為string,會把string轉換為數字
- 把string直接轉換為bool的時候,空字符串‘'轉換為 false,除此外的一切字符串轉換為 true
例:
if ('0') alert("'0' is true"); if ('0' == false) alert("'0' is false"); 運行結果:兩次都會alter
示例:
‘true’==true;為什么返回false
相等操作符
在轉換不同的數據類型時,相等和不相等操作符遵循下列基本規則:
1. 如果有一個操作數是布爾值,則在比較相等性之前先將其轉換為數值——false轉換為0,而true轉換為1;
2. 如果一個操作數是字符串,另一個操作數是數值,在比較相等性之前先將字符串轉換為數值;
3. 如果一個操作數是對象,另一個操作數不是,則調用對象的valueOf()方法,用得到的基本類型值按照前面的規則進行比較;
首先 'true' == true 符合規則 1,這樣就轉化成了對 'true' == 1 進行求值
此時表達式符合規則 2
2. 如果一個操作數是字符串,另一個操作數是數值,在比較相等性之前先將字符串轉換為數值;
也就是說需要將 'true' 轉換成數值之后,再與數字 1 進行比較。把 'true' 轉換成數值是使用 Number 函數
Number 類型
Number()函數的轉換規則如下。
1. 如果是Boolean值,true和false將分別被轉換為1和0。
2. 如果是數字值,只是簡單的傳入和返回。
3. 如果是null值,返回0。
4. 如果是undefined,返回NaN。
5. 如果是字符串,遵循下列規則:
5.1 如果字符串中只包含數字(包括前面帶加號或負號的情況),則將其轉換為十進制數值, 即"1"會變成1,"123"會變成123,而"011"會變成11(注意:前導的零被忽略了);
5.2 如果字符串中包含有效的浮點格式,如"1.1",則將其轉換為對應的浮點數值(同樣,也會忽略前導零);
5.3 如果字符串中包含有效的十六進制格式,例如"0xf",則將其轉換為相同大小的十進制整數值;
5.4 如果字符串是空的(不包含任何字符),則將其轉換為0;
5.5 如果字符串中包含除上述格式之外的字符,則將其轉換為NaN。
按照規則 5 和規則 5.5,Number('true') 的值為 NaN,也就是說現在的問題變成了對 NaN == 1 進行求值。
還是在這一節中,提到了
其次,NaN與任何值都不相等,包括NaN本身。
也就是說 NaN == 1 的值是 false。
最后捋一遍,'true' == true --> 'true' == 1 --> NaN == 1 --> false
!和!!的區別及用法
1. !可將變量轉換成boolean類型,null、undefined和空字符串取反都為false,其余都為true。
!null=true
!undefined=true
!''=true
!100=false
!'abc'=false
2. !!常常用來做類型判斷,在第一步!(變量)之后再做邏輯取反運算
let a; if(a!=null&&typeof(a)!=undefined&&a!=''){ //a有內容才執行的代碼
} if(!!a){ //a有內容才執行的代碼...
}
上面兩種寫法實現的功能一樣,下面一種明顯更簡單

1.對null的"非"返回true var temp = null; alert(temp); 結果:null
var temp = null; alert(!temp); 結果:true
var temp = null; alert(!!temp); 結果:false
2.對undefined的"非"返回true var temp; alert(temp); 結果:undefined var temp; alert(!temp); 結果:true
var temp; alert(!!temp); 結果:false
3.對空字符串的"非"返回true var temp=""; alert(temp); 結果:空 var temp=""; alert(!temp); 結果:true
var temp=""; alert(!!temp); 結果:false
4.對非零整型的"非"返回false var temp=1; alert(temp); 結果:1
var temp=1; alert(!temp); 結果:false
var temp=1; alert(!!temp); 結果:true
5.對0的"非"返回true var temp = 0; alert(temp); 結果:0
var temp = 0; alert(!temp); 結果:true
var temp = 0; alert(!!temp); 結果:false
6.對字符串的"非"返回false var temp="ab"; alert(temp); 結果:ab var temp="ab"; alert(!temp); 結果:false
var temp="ab"; alert(!!temp); 結果:true
7.對數組的"非"返回false var temp=[1,2]; alert(temp); 結果:1,2
var temp=[1,2]; alert(!temp); 結果:false
var temp=[1,2]; alert(!!temp); 結果:true
==和===的區別
1. ===:稱為等同符,當兩邊值的類型相同時,直接比較值,若類型不相同,直接返回false;
2. ==:稱為等值符,當等號兩邊的類型相同時,直接比較值是否相等,若不相同,則先轉化為類型相同的值,再進行比較;
類型轉換規則:
1)如果等號兩邊是boolean、string、number三者中任意兩者進行比較時,優先轉換為數字進行比較。
2)如果等號兩邊出現了null或undefined,null和undefined除了和自己相等,就彼此相等
注意:NaN==NaN //返回false,NaN和所有值包括自己都不相等。
關於 null 和 undefined 有一些有趣的特性:
如果對值為 null 的變量使用 typeof 操作符的話,得到的結果是 object ;
而對 undefined 的值使用 typeof,得到的結果是 undefined 。
如 typeof null === "object" //true; typeof undefined === "undefined" //true null == undefined //true,但是 null !== undefined //true
typeof和instanceof用法:
typeof用以獲取一個變量或者表達式的類型,typeof一般只能返回如下幾個結果:
number,boolean,string,function(函數),object(NULL,數組,對象),undefined。
如:
alert(typeof (123));//typeof(123) 返回"number"
alert(typeof ("123"));//typeof("123") 返回"string"
我們可以使用typeof來獲取一個變量是否存在,如if(typeof a!="undefined"){},而不要去使用if(a)因為如果a不存在(未聲明)則會出錯,
正因為typeof遇到null,數組,對象時都會返回object類型,所以當我們要判斷一個對象是否是數組時
或者判斷某個變量是否是某個對象的實例則要選擇使用另一個關鍵語法instanceof
instanceof用於判斷一個變量是否某個對象的實例,如var a=new Array(); alert(a instanceof Array); 會返回true,
同時alert(a instanceof Object)也會返回true;這是因為Array是object的子類。
再如:function test(){};var a=new test();alert(a instanceof test)會返回true。
console.log(true instanceof Boolean); 返回false
console.log(new Boolean(true) instanceof Boolean); 返回true