最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年01月21日 15:15:24   作者:小不了  
這篇文章主要介紹了一篇文章搞定JavaScript類型轉(zhuǎn)換(面試常見),非常不錯,具有參考借鑒價值,需要的朋友參考下吧

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

題如下:

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

運行結(jié)果是true?。?!

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

比如說優(yōu)先級那塊兒,很多書都教育我們,“不用去背誦優(yōu)先級順序,不確定的話,加括號就行了?!捌匠N覀儗懘a時也確實這么做的。

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

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

都有哪些東西是假值?

共6個:

0或+0、-0,NaN
""
false
undefined
null

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

除此之外的一律不是??!哪怕是如下形式:

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

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

&&是種短路語法,求值后不一定是個Boolean類型,更不是兩邊轉(zhuǎ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);     // 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.其他報錯。

引用類型轉(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);       // 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)       // 報錯

以上類型轉(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); // 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條再來一個例子:

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

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

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

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

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

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

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

相關(guān)文章

  • 基于JS實現(xiàn)右側(cè)緩慢彈窗動態(tài)效果

    基于JS實現(xiàn)右側(cè)緩慢彈窗動態(tài)效果

    在現(xiàn)代Web開發(fā)中,動態(tài)交互效果是提升用戶體驗的重要手段之一,其中,從頁面右側(cè)緩慢滑出的彈窗效果因其不遮擋主要內(nèi)容、易于用戶操作而備受歡迎,本文將詳細介紹如何使用JavaScript結(jié)合CSS3動畫實現(xiàn)這一效果,并探討其在實際項目中的應(yīng)用,需要的朋友可以參考下
    2025-02-02
  • js event事件的傳遞與冒泡處理

    js event事件的傳遞與冒泡處理

    與Netscape相反,IE中的事件傳遞方向是從事情發(fā)生的對象開始,然后依次由該對象向所在的父節(jié)點傳遞。
    2009-12-12
  • nodejs創(chuàng)建web服務(wù)器之hello world程序

    nodejs創(chuàng)建web服務(wù)器之hello world程序

    本文給大家分享nodejs創(chuàng)建web服務(wù)器之hello world程序,node真的很好用,不僅用v8引擎來解析了javascript外,還提供了高度優(yōu)化的應(yīng)用庫,真的很好,有需要的朋友一起來學(xué)習(xí)吧
    2015-08-08
  • 前端在瀏覽器端播放直播流協(xié)議的2種方式講解

    前端在瀏覽器端播放直播流協(xié)議的2種方式講解

    直播依賴錄播所需要的播放技術(shù),同時依賴HTTP FLV或者WebSocket中的一種協(xié)議來傳輸FLV,這篇文章主要給大家介紹了關(guān)于前端在瀏覽器端播放直播流協(xié)議的2種方式,需要的朋友可以參考下
    2024-07-07
  • IE6下拉框圖層問題探討及解決

    IE6下拉框圖層問題探討及解決

    有關(guān)IE6下拉框圖層問題,一直困擾著大家,下面有個不錯的方法大家可以嘗試操作下
    2014-01-01
  • 微信公眾平臺開發(fā)教程(六)獲取個性二維碼的實例

    微信公眾平臺開發(fā)教程(六)獲取個性二維碼的實例

    二維碼的用處有很多,本篇文章主要介紹了微信公眾平臺開發(fā)教程(六)獲取個性二維碼的實例,有興趣的可以了解一下。
    2016-12-12
  • 詳解JS設(shè)計模式之橋接模式用法

    詳解JS設(shè)計模式之橋接模式用法

    javascript橋接橋接設(shè)計模式(Bridge Pattern)是一種結(jié)構(gòu)型設(shè)計模式,它用于將抽象部分與其具體實現(xiàn)部分分離,使它們可以獨立地變化,本文將通過代碼示例詳解的給大家介紹一下JS橋接模式,需要的朋友可以參考下
    2023-08-08
  • 微信小程序?qū)崿F(xiàn)登錄界面

    微信小程序?qū)崿F(xiàn)登錄界面

    這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)登錄界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • js獲取input標(biāo)簽的輸入值實現(xiàn)代碼

    js獲取input標(biāo)簽的輸入值實現(xiàn)代碼

    input標(biāo)簽的輸入值通過js進行獲取,部分標(biāo)簽和類是封裝在框架內(nèi)的,其效果和html標(biāo)簽差不多,具體實現(xiàn)如下,感興趣的朋友可以參考下,希望對大家有所幫助
    2013-08-08
  • javascript實現(xiàn)可鍵盤控制的抽獎系統(tǒng)

    javascript實現(xiàn)可鍵盤控制的抽獎系統(tǒng)

    這篇文章主要為大家詳細介紹了javascript實現(xiàn)可鍵盤控制的抽獎系統(tǒng)的相關(guān)資料,需要的朋友可以參考下
    2016-03-03

最新評論

平江县| 永和县| 百色市| 巴彦淖尔市| 东乡族自治县| 澄城县| 吕梁市| 遵义市| 类乌齐县| 鲁甸县| 遵义市| 文山县| 东乡族自治县| 蒲江县| 砀山县| 小金县| 黑山县| 渝中区| 盘山县| 南宫市| 古丈县| 昂仁县| 达拉特旗| 松潘县| 鹿邑县| 潞西市| 菏泽市| 安宁市| 迭部县| 富平县| 安阳县| 诏安县| 常宁市| 鹰潭市| 乾安县| 宿松县| 克什克腾旗| 柞水县| 漯河市| 大安市| 泰顺县|