中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

javascript中的隱式轉換

發布時間:2020-06-17 13:38:49 來源:億速云 閱讀:151 作者:鴿子 欄目:web開發

我們在寫筆試題的時候,經常碰到涉及隱式轉換的題目,例如

"1" + 2
obj + 1
[] == ![] 
[null] == false

=== 和 ==

=== 叫做嚴格運算符,對象類型指向地址相同或原始類型( 數值、字符串、布爾值)值相同;==叫做相等運算符,類型不同會進行轉化再比較,undefined、null相等,對象類型還是比較引用。==運算符將原始值和其包裝對象視為相等,但===運算符將它們視為不等。 所有obj.a==null(相當于obj.a=== null || obj.a ===undefined)。

相等運算符就是常常引起JS隱式轉換的坑貨,它也常常出現在我們的面試題中,不過我們在現實開發中,為了避免不必要的問題要求使用嚴格運算符,但是了解還是很有必要的。

想要了解JS隱式轉換,就要先從三個知識點下手。

原始類型

原始類型(基本類型、基本數據類型、原始數據類型)是一種既非對象也無方法的數據。在 JavaScript 中,共有7種:string,number,bigint,boolean,null,undefined,symbol (ECMAScript 2016新增)

falsy 值 (虛值)

falsy 值 (虛值) 是在 Boolean 上下文中認定為 false 的值,在JavaScript只有 七個 falsy 值。

  1. false false 關鍵字
  2. 0 數值 zero
  3. 0n 當 BigInt 作為布爾值使用時, 遵從其作為數值的規則. 0n 是 falsy 值.
  4. 一個空字符串 (字符串的長度為零). JavaScript 中的字符串可用雙引號 "", 單引號 '', 或 模板字面量 `` 定義。
  5. null null - 缺少值
  6. undefined undefined - 原始值
  7. NaN NaN - 非數值

特別要說明的是,除了這七個對象全是真值,如new Number 和new Boolean 都是真值。

let b = new Boolean(false);i
f(b){
//會執行到這里。
}

四大轉換規則

  • toString規則:其他類型的值轉換為字符串類型的操作

    • null => "null"
    • undefined => "undefined"
    • true => "true"  false=>"false"
    • 10 => "10"  "1e21"=>"1e+21"
    • [1,2,3] => "1,2,3"
    • Object對象 => "[Object Object]"  其實是調用toString方法
  • ToPrimitive規則:對象類型數組轉為原始類型的操作

    • 當對象類型需要被轉為原始類型時,它會先查找對象的valueOf方法,如果valueOf方法返回原始類型的值,則ToPrimitive的結果就是這個值
    • 如果valueOf不存在或者valueOf方法返回的不是原始類型的值,就會嘗試調用對象的toString方法,也就是會遵循對象的ToString規則,然后使用toString的返回值作為ToPrimitive的結果
    • Date 是先toString再ValueOf
    • 如果在toString再ValueOf后都不能拿到原始類型,再判斷相等、加減時就拋出Uncaught TypeError: Cannot convert object to primitive value
  • ToNumber規則

    • null=> 0
    • undefined => NaN
    • "123"=>123  "12ssd"=>NaN  ""=>0
    • false => 0    true=>1
    • 數組、對象ToPrimitive
  • ToBoolean規則

    • js中七個falsy 值 (虛值) 為false,其他都為true

隱式轉換

有了對上面知識點的認識,我們可以來一舉拿下JS隱式轉換了。

  • == 的過程(優先換成數字、字符串)
  1. 首先看==前后有沒有NaN,有的話都是返回false。NaN不等于任何值,包括其本身
  2. 布爾值會轉成數字類型,true轉成1,false轉成0
  3. 數字和字符串比較,字符串會轉成數字
  4. undefined和null除了和undefined或null相等,和其他相比都是false
  5. 數字或者字符串和對象相比,對象使用ToPrimitive規則轉換。
  6. 當兩個操作數都是對象時,JavaScript會比較其內部引用,當且僅當他們的引用指向內存中的相同對象(區域)時才相等,即他們在棧內存中的引用地址相同。
  • +的過程(優先換成字符串、數字)
  1. 如果至少有一個操作數是對象,它會被轉換成原始值(字符串,數字或布爾);
  2. 轉換之后,如果至少有一個操作數是字符串類型,第二個操作數會被轉換成字符串,并且會執行連接。
  3. 在其他的情況下,兩個操作數都會轉換成數字并執行算數加法運算。
  • -的過程(轉換成數字) 這個就很簡單了,全部用ToNumber規則轉換成數字

檢測學習成果

我們根據以上所學看幾個筆試題。如果你都知道結果,就不用看我的廢解釋了。

[] == [] 
[] == ![] 
[null] == false

第一個,==左右都是對象,比較引用地址,這個兩個不同的實例,肯定不相等啊。 第二個,!的優先級高于==,所以先 [] 是真值,求非當讓是false了,轉成數字0,==左是對象右是數字,對象使用ToPrimitive規則轉換成"",再用ToNumber規則就轉成0了,判斷為相等。 第三個,[null]ToPrimitive再ToNumber規則就轉成0,false也轉成0。

var  a = 1;
var  b = "3";

var obj1 = {
    i:1,
    toString:function() {
        return "1";
    },
    valueOf:function() {
        return 1;
    }
};
var obj2 = {
    i:1,
    toString:function() {
        return "2";
    }
};
var obj3 = {
    i:1,
    valueOf:function() {
        return 3;
    }
};
var obj = {
    i:1,
};
var objE = {
    i:1,
    valueOf:function() {
        return [];
    },
    toString:function() {
        return {};
    }
};


a+b  
a + obj  
a + objE 

a+obj1  
a+obj2  
a+obj3  

b+obj1  
b+obj2  
b+obj3  

a==obj2  
a==obj1

這道題比較簡單你只要熟練掌握我上面說的那幾個知識點可以了。下面直接寫出結果啦。

a + b    //"13"
a + obj  //"1[object Object]"
a + objE //Uncaught TypeError: Cannot convert object to primitive value

a+obj1  //2
a+obj2  //"12"
a+obj3  // 4

b+obj1  //"31"
b+obj2  //"32"
b+obj3  //“33”

a==obj2  //false
a==obj1  //true

最后提一個比較奇葩的題目。

定義一個變量a,使得下面的表達式結果為true

  a == 1 && a == 2 && a == 3

這里我簡單提示下,a要是一個對象,重寫valueOf方法,讓它每次隱式轉換的時候,調用時i++。

valueOf()在Object上默認返回的是對象不是原始類型,它會再調用toString。所以只要重寫toString也可以。

以上就是前端筆試中的坑位-JS隱式轉換問題的詳細內容,更多請關注億速云其它相關文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

青冈县| 凤台县| 达州市| 台北县| 长兴县| 明水县| 仁布县| 新余市| 康保县| 青川县| 鹿泉市| 益阳市| 同德县| 元氏县| 乌兰浩特市| 谷城县| 周至县| 宜川县| 门头沟区| 富阳市| 射洪县| 曲靖市| 广元市| 策勒县| 米脂县| 甘孜县| 古蔺县| 利辛县| 南和县| 两当县| 宁明县| 林口县| 二手房| 达孜县| 全南县| 屏东县| 五华县| 新竹市| 周口市| 彰化县| 濉溪县|