一篇文章搞定JavaScript類型轉(zhuǎn)換(面試常見)
為啥要說這個(gè)東西?一道面試題就給我去說它的動(dòng)機(jī)。
題如下:
var bool = new Boolean(false); if (bool) { alert('true'); } else { alert('false'); }
運(yùn)行結(jié)果是true!?。?/strong>
其實(shí)啥類型轉(zhuǎn)換啊,操作符優(yōu)先級(jí)啊,這些東西都是最最基本的。犀牛書上有詳細(xì)的介紹。但我很少去翻犀牛書的前5章。。。
比如說優(yōu)先級(jí)那塊兒,很多書都教育我們,“不用去背誦優(yōu)先級(jí)順序,不確定的話,加括號(hào)就行了?!捌匠N覀儗懘a時(shí)也確實(shí)這么做的。
但現(xiàn)實(shí)是啥呢?面試時(shí)會(huì)出這種題,讓你來做。。。真不知道這種題的意義是啥。。。
抱怨到此為止,本文嘗試來解決類型轉(zhuǎn)換問題,爭取把《JS權(quán)威指南》49頁那個(gè)表背下來。
都有哪些東西是假值?
共6個(gè):
0或+0、-0,NaN "" false undefined null
上面的順序是按照基本類型來排列的。
除此之外的一律不是?。∧呐率侨缦滦问剑?/p>
Infinity '0'、'false'、" "(空格字符) 任何引用類型:[],{},function(){}
if (a && b)的正確理解方式是:a && b進(jìn)行表達(dá)式求值后,然后再轉(zhuǎn)換為Boolean類型。
&&是種短路語法,求值后不一定是個(gè)Boolean類型,更不是兩邊轉(zhuǎn)化布爾值再運(yùn)算。
比如 2&&3 的結(jié)果是3,不是true。
所以if(a && b),我們平常理解的那種,"如果a和b同時(shí)為真的話",是一種錯(cuò)誤的描述方式。
其他基本類型轉(zhuǎn)化為字符串,基本和預(yù)期的一樣:
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"
其他基本類型轉(zhuǎn)化為數(shù)字,需要特殊記憶:
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。
以上,基本類型轉(zhuǎn)換都說明白了。
下面來看看引用類型轉(zhuǎn)換為基本類型。
引用類型轉(zhuǎn)換為布爾,始終為true
引用類型轉(zhuǎn)換為字符串
1.優(yōu)先調(diào)用toString方法(如果有),看其返回結(jié)果是否是原始類型,如果是,轉(zhuǎn)化為字符串,返回。
2.否則,調(diào)用valueOf方法(如果有),看其返回結(jié)果是否是原始類型,如果是,轉(zhuǎn)化為字符串,返回。
3.其他報(bào)錯(cuò)。
引用類型轉(zhuǎn)化為數(shù)字
1.優(yōu)先調(diào)用valueOf方法(如果有),看其返回結(jié)果是否是基本類型,如果是,轉(zhuǎn)化為數(shù)字,返回。
2.否則,調(diào)用toString方法(如果有),看其返回結(jié)果是否是基本類型,如果是,轉(zhuǎn)化為數(shù)字,返回。
3.其他報(bào)錯(cuò)。
首先我們看看常見引用類型toString和valueOf返回什么?
var a = {}; console.dir(a.toString()); // "[object Object]" console.dir(a.valueOf()); // 對(duì)象本身 var b = [1, 2, 3]; console.dir(b.toString()); // "1,2,3" console.dir(b.valueOf()); // 對(duì)象本身 var c = [[1],[2]]; console.dir(c.toString()); // "1,2" console.dir(c.valueOf()); // 對(duì)象本身 var d = function() {return 2}; console.dir(d.toString()); // "function() {return 2}" console.dir(d.valueOf()); // 對(duì)象本身
因此對(duì)應(yīng)的轉(zhuǎn)換為字符串和數(shù)字的情形是:
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
再來個(gè)報(bào)錯(cuò)的情形:
var a = {}; a.toString = function() {return {};} console.log("" + a); // 報(bào)錯(cuò) console.log(+a) // 報(bào)錯(cuò)
以上類型轉(zhuǎn)換規(guī)律基本說完。
最后來說一下萬惡的“==”
面試題如下:
var a = false; var b = undefined; if (a == b) { alert('true'); } else { alert('false'); }
本以為會(huì)彈出true的。天那!為啥是false?
哈哈。。。
雙等號(hào),如果兩邊類型不同,會(huì)有隱式轉(zhuǎn)換發(fā)生。犀牛書75頁總結(jié)如下:
1,null和undefined,相等。
2,數(shù)字和字符串,轉(zhuǎn)化為數(shù)字再比較。
3,如果有true或false,轉(zhuǎn)換為1或0,再比較。
4,如果有引用類型,優(yōu)先調(diào)用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根據(jù)第3條。
"" == false之所以為true根據(jù)第3條,變成了"" == 0,再根據(jù)第2條。
第4條再來一個(gè)例子:
console.log([[2]] == '2')
其上結(jié)果為true,原因如下:
[[2]]的valueOf是對(duì)象本身,不是基本類型。
嘗試調(diào)用toString的結(jié)果是'2'。
因此變成了'2'和數(shù)字2的比較。根據(jù)第2條,相等。WTF!!
最后說句,使用"==="就沒有這些問題了。
以上所述是小編給大家介紹的一篇文章搞定JavaScript類型轉(zhuǎn)換(面試常見),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
小程序如何獲取多個(gè)formId實(shí)現(xiàn)詳解
這篇文章主要介紹了小程序如何獲取多個(gè)formId實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09JavaScript日期和時(shí)間的格式化及其它常用處理方法
這篇文章主要給大家介紹了關(guān)于JavaScript日期和時(shí)間的格式化及其它常用處理方法,JavaScript中可以使用Date對(duì)象來表示日期和時(shí)間,如果需要格式化日期和時(shí)間,可以使用Date對(duì)象的幾個(gè)方法和一些字符串操作方法來實(shí)現(xiàn),需要的朋友可以參考下2023-09-09UEditor 自定義圖片視頻尺寸校驗(yàn)功能的實(shí)現(xiàn)代碼
UEditor支持單圖、多圖以及視頻上傳,編輯器配置項(xiàng)支持文件格式、文件大小校驗(yàn),對(duì)于文件寬高尺寸校驗(yàn)暫不支持。本文給大家介紹UEditor 自定義圖片視頻尺寸校驗(yàn)功能的實(shí)現(xiàn)代碼,感興趣的朋友一起看看吧2020-10-10opencv 識(shí)別微信登錄驗(yàn)證滑動(dòng)塊位置
這篇文章主要介紹了opencv 識(shí)別微信登錄驗(yàn)證滑動(dòng)塊位置及各自的優(yōu)缺點(diǎn),需要的朋友可以參考下2018-08-08gojs實(shí)現(xiàn)螞蟻線動(dòng)畫效果
這篇文章介紹了gojs實(shí)現(xiàn)螞蟻線動(dòng)畫效果的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01javascript實(shí)現(xiàn)在某個(gè)元素上阻止鼠標(biāo)右鍵事件的方法和實(shí)例
這篇文章主要介紹了javascript實(shí)現(xiàn)在某個(gè)元素上阻止鼠標(biāo)右鍵事件的方法和實(shí)例,需要的朋友可以參考下2014-08-08JavaScript實(shí)現(xiàn)網(wǎng)頁版五子棋游戲
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)網(wǎng)頁版五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07