您好,登錄后才能下訂單哦!
我們在寫筆試題的時候,經常碰到涉及隱式轉換的題目,例如
"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 值 (虛值) 是在 Boolean 上下文中認定為 false 的值,在JavaScript只有 七個 falsy 值。
特別要說明的是,除了這七個對象全是真值,如new Number 和new Boolean 都是真值。
let b = new Boolean(false);i f(b){ //會執行到這里。 }
toString規則:其他類型的值轉換為字符串類型的操作
ToPrimitive規則:對象類型數組轉為原始類型的操作
Uncaught TypeError: Cannot convert object to primitive value
ToNumber規則
ToBoolean規則
有了對上面知識點的認識,我們可以來一舉拿下JS隱式轉換了。
== 的過程
(優先換成數字、字符串)+的過程
(優先換成字符串、數字)-的過程
(轉換成數字)
這個就很簡單了,全部用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隱式轉換問題的詳細內容,更多請關注億速云其它相關文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。