国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

一篇文章搞定JavaScript類型轉(zhuǎn)換(面試常見)

2024-05-06 16:34:43
字體:
供稿:網(wǎng)友

為啥要說這個東西?一道面試題就給我去說它的動機(jī)。

題如下:

var bool = new Boolean(false);if (bool) { alert('true');} else { alert('false');}

運(yùn)行結(jié)果是true!?。?/strong>

其實(shí)啥類型轉(zhuǎn)換啊,操作符優(yōu)先級啊,這些東西都是最最基本的。犀牛書上有詳細(xì)的介紹。但我很少去翻犀牛書的前5章。。。

比如說優(yōu)先級那塊兒,很多書都教育我們,“不用去背誦優(yōu)先級順序,不確定的話,加括號就行了。“平常我們寫代碼時也確實(shí)這么做的。

但現(xiàn)實(shí)是啥呢?面試時會出這種題,讓你來做。。。真不知道這種題的意義是啥。。。

抱怨到此為止,本文嘗試來解決類型轉(zhuǎn)換問題,爭取把《JS權(quán)威指南》49頁那個表背下來。

都有哪些東西是假值?

共6個:

0或+0、-0,NaN""falseundefinednull

上面的順序是按照基本類型來排列的。

除此之外的一律不是?。∧呐率侨缦滦问剑?/p>

Infinity'0'、'false'、" "(空格字符)任何引用類型:[],{},function(){}

if (a && b)的正確理解方式是:a && b進(jìn)行表達(dá)式求值后,然后再轉(zhuǎn)換為Boolean類型。

&&是種短路語法,求值后不一定是個Boolean類型,更不是兩邊轉(zhuǎn)化布爾值再運(yùn)算。

比如 2&&3 的結(jié)果是3,不是true。

所以if(a && b),我們平常理解的那種,"如果a和b同時為真的話",是一種錯誤的描述方式。

其他基本類型轉(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);     // 0console.log(+undefined);   // NaNconsole.log(+false);     // 0console.log(+true);     // 1console.log(+"");      // 0console.log(+'1');      // 1console.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.其他報錯。

引用類型轉(zhuǎn)化為數(shù)字

1.優(yōu)先調(diào)用valueOf方法(如果有),看其返回結(jié)果是否是基本類型,如果是,轉(zhuǎn)化為數(shù)字,返回。

2.否則,調(diào)用toString方法(如果有),看其返回結(jié)果是否是基本類型,如果是,轉(zhuǎn)化為數(shù)字,返回。

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());  // 對象本身

因此對應(yīng)的轉(zhuǎn)換為字符串和數(shù)字的情形是:

var a = {};console.dir(a + "");     // "[object Object]"console.dir(+a);       // NaNvar b = [1, 2, 3];console.dir(b + "");     // "1,2,3"console.dir(+b);       // NaNvar c = [[1],[2]];console.dir(c + "");     // "1,2"console.dir(+c);       // NaNvar 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)       // 報錯

以上類型轉(zhuǎn)換規(guī)律基本說完。

最后來說一下萬惡的“==”

面試題如下:

var a = false;var b = undefined;if (a == b) { alert('true');} else { alert('false');}

本以為會彈出true的。天那!為啥是false?

哈哈。。。

雙等號,如果兩邊類型不同,會有隱式轉(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); // falseconsole.log(null == false);   // falseconsole.log(0 == false);     // trueconsole.log(NaN == false);    // falseconsole.log("" == false);    // true

0 == false之所以為true根據(jù)第3條。

"" == false之所以為true根據(jù)第3條,變成了"" == 0,再根據(jù)第2條。

第4條再來一個例子:

console.log([[2]] == '2')

其上結(jié)果為true,原因如下:

[[2]]的valueOf是對象本身,不是基本類型。

嘗試調(diào)用toString的結(jié)果是'2'。

因此變成了'2'和數(shù)字2的比較。根據(jù)第2條,相等。WTF!!

最后說句,使用"==="就沒有這些問題了。

以上所述是小編給大家介紹的一篇文章搞定JavaScript類型轉(zhuǎn)換(面試常見),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對VeVb武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 中超| 稷山县| 通许县| 治县。| 长葛市| 沙田区| 宜章县| 梨树县| 循化| 长阳| 天津市| 安阳市| 连江县| 正宁县| 神池县| 旬阳县| 喀喇沁旗| 通许县| 岢岚县| 呼图壁县| 喀什市| 萨迦县| 湖北省| 元氏县| 日土县| 钦州市| 大洼县| 广河县| 托克托县| 丽江市| 松原市| 会昌县| 象州县| 宁南县| 石楼县| 黔西| 开封县| 共和县| 射阳县| 荔浦县| 大同市|