<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        來探討下JS類型轉換的哪些坑

        來源:懂視網 責編:小采 時間:2020-11-27 20:26:04
        文檔

        來探討下JS類型轉換的哪些坑

        來探討下JS類型轉換的哪些坑:為啥要說這個東西?一道面試題就給我去說它的動機。題如下:var bool = new Boolean(false); if (bool) { alert('true'); } else { alert('false'); }運行結果是true。其實啥類型轉換啊,操作符優先級啊,這些東西都是最最基
        推薦度:
        導讀來探討下JS類型轉換的哪些坑:為啥要說這個東西?一道面試題就給我去說它的動機。題如下:var bool = new Boolean(false); if (bool) { alert('true'); } else { alert('false'); }運行結果是true。其實啥類型轉換啊,操作符優先級啊,這些東西都是最最基

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

        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

        文檔

        來探討下JS類型轉換的哪些坑

        來探討下JS類型轉換的哪些坑:為啥要說這個東西?一道面試題就給我去說它的動機。題如下:var bool = new Boolean(false); if (bool) { alert('true'); } else { alert('false'); }運行結果是true。其實啥類型轉換啊,操作符優先級啊,這些東西都是最最基
        推薦度:
        標簽: 轉換 js 類型
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲综合色7777情网站777| 亚洲va中文字幕无码| 亚洲国产精品VA在线看黑人| 少妇亚洲免费精品| 午夜亚洲福利在线老司机| 美国毛片亚洲社区在线观看| 国产又大又粗又硬又长免费| 亚洲Aⅴ在线无码播放毛片一线天| 成年女人毛片免费播放视频m| 一级毛片免费播放视频| 天堂亚洲免费视频| 一区二区三区免费看| 怡红院亚洲怡红院首页| 免费视频精品一区二区三区 | 中文字幕人成无码免费视频| 亚洲国产成人精品无码区在线网站| 亚洲一区免费视频| 天堂亚洲国产中文在线| 四虎影视永久免费视频观看| 无码的免费不卡毛片视频| 久久亚洲精品中文字幕三区| 在线成人爽a毛片免费软件| 亚洲日本久久久午夜精品 | 国产亚洲AV手机在线观看| 国产免费无码AV片在线观看不卡| 亚洲色图综合网站| 永久免费观看的毛片的网站| 三级片免费观看久久| 亚洲国产精品一区二区久久| 无限动漫网在线观看免费| 免费一级特黄特色大片| 亚洲av成人无码久久精品| 日本一区二区三区免费高清| 国产亚洲综合一区二区三区| 亚洲国产精品福利片在线观看| 久久午夜免费视频| 最近免费字幕中文大全| 亚洲午夜一区二区电影院| 男人的天堂亚洲一区二区三区| 一级人做人a爰免费视频| 18亚洲男同志videos网站|