var bool = new Boolean(false); if (bool) { alert('true'); } else { alert('false'); }
運行結果是true!!!
其實啥類型轉換啊,操作符優先級啊,這些東西都是最最基本的。
犀牛書上有詳細的介紹。但我很少去翻犀牛書的前5章。。
比如說優先級那塊兒,很多書都教育我們,“不用去背誦優先級順序,不確定的話,加括號就行了。“
平常我們寫代碼時也確實這么做的。
但現實是啥呢?面試時會出這種題,讓你來做。。
真不知道這種題的意義是啥。。
抱怨到此為止,本文嘗試來解決類型轉換問題,爭取把《JS權威指南》49頁那個表背下來。
都有哪些東西是假值?
共6個:
0或+0、-0,NaN "" false undefined null
上面的順序是按照基本類型來排列的。
除此之外的一律不是!!哪怕是如下形式:
Infinity '0'、'false'、" "(空格字符) 任何引用類型:[],{},function(){}
if (a && b)的正確理解方式是:a && b進行表達式求值后,然后再轉換為Boolean類型。
&&是種短路語法,求值后不一定是個Boolean類型,更不是兩邊轉化布爾值再運算。
比如 2&&3 的結果是3,不是true。
所以if(a && b),我們平常理解的那種,"如果a和b同時為真的話",是一種錯誤的描述方式。
其他基本類型轉化為字符串,基本和預期的一樣:
console.log("" + null); // "null" console.log("" + undefined); // "undefined" console.log("" + false); // "false" console.log("" + true); // "true" console.log("" + 0); // "0" console.log("" + NaN); // "NaN" console.log("" + Infinity); // "Infinity"
其他基本類型轉化為數字,需要特殊記憶:
console.log(+null); // 0 console.log(+undefined); // NaN console.log(+false); // 0 console.log(+true); // 1 console.log(+""); // 0 console.log(+'1'); // 1 console.log(+'1x'); // NaN
其中null,空字符是0,undefined是NaN。
以上,基本類型轉換都說明白了。
下面來看看引用類型轉換為基本類型。
引用類型轉換為布爾,始終為true
引用類型轉換為字符串
1.優先調用toString方法(如果有),看其返回結果是否是原始類型,如果是,轉化為字符串,返回。 2.否則,調用valueOf方法(如果有),看其返回結果是否是原始類型,如果是,轉化為字符串,返回。 3.其他報錯。
引用類型轉化為數字
1.優先調用valueOf方法(如果有),看其返回結果是否是基本類型,如果是,轉化為數字,返回。 2.否則,調用toString方法(如果有),看其返回結果是否是基本類型,如果是,轉化為數字,返回。 3.其他報錯。
首先我們看看常見引用類型toString和valueOf返回什么?
var a = {}; console.dir(a.toString()); // "[object Object]" console.dir(a.valueOf()); // 對象本身 var b = [1, 2, 3]; console.dir(b.toString()); // "1,2,3" console.dir(b.valueOf()); // 對象本身 var c = [[1],[2]]; console.dir(c.toString()); // "1,2" console.dir(c.valueOf()); // 對象本身 var d = function() {return 2}; console.dir(d.toString()); // "function() {return 2}" console.dir(d.valueOf()); // 對象本身
因此對應的轉換為字符串和數字的情形是:
var a = {}; console.dir(a + ""); // "[object Object]" console.dir(+a); // NaN var b = [1, 2, 3]; console.dir(b + ""); // "1,2,3" console.dir(+b); // NaN var c = [[1],[2]]; console.dir(c + ""); // "1,2" console.dir(+c); // NaN var d = function() {return 2}; console.dir(d + ""); // "function () {return 2}" console.dir(+d); // NaN
再來個報錯的情形:
var a = {}; a.toString = function() {return {};} console.log("" + a); // 報錯 console.log(+a) // 報錯
以上類型轉換規律基本說完。
最后來說一下萬惡的“==”
面試題如下:
var a = false; var b = undefined; if (a == b) { alert('true'); } else { alert('false'); }
本以為會彈出true的。天那!為啥是false?
哈哈。。
雙等號,如果兩邊類型不同,會有隱式轉換發生。犀牛書75頁總結如下:
1,null和undefined,相等。 2,數字和字符串,轉化為數字再比較。 3,如果有true或false,轉換為1或0,再比較。 4,如果有引用類型,優先調用valueOf。 5,其余都不相等。
因此有:
console.log(undefined == false); // false console.log(null == false); // false console.log(0 == false); // true console.log(NaN == false); // false console.log("" == false); // true
0 == false之所以為true根據第3條。
"" == false之所以為true根據第3條,變成了"" == 0,再根據第2條。
第4條再來一個例子:
console.log([[2]] == 2)
其上結果為true,原因如下:
[[2]]的valueOf是對象本身,不是基本類型。
嘗試調用toString的結果是'2'。
因此變成了'2'和數字2的比較。根據第2條,相等。WTF!!
最后說句,使用"==="就沒有這些問題了。
本文完。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com