摘要:前言相信大家在代碼中經常看見和,但大家真的弄懂了比較運算符和其中的隱式轉換嘛今天就重新認識下比較運算符。
前言
相信大家在代碼中經常看見 "==" 和 "===",但大家真的弄懂了比較運算符和其中的隱式轉換嘛? 今天就重新認識下比較運算符。
說明: 嚴格匹配,不會類型轉換,必須要數據類型和值完全一致
先判斷類型,如果類型不是同一類型的話直接為false; 1 對于基本數據類型(值類型): Number,String,Boolean,Null和Undefined:兩邊的值要一致,才相等 console.log(null === null) // true console.log(undefined === undefined) // true 注意: NaN: 不會等于任何數,包括它自己 console.log(NaN === NaN) // false 2 對于復雜數據類型(引用類型): Object,Array,Function等:兩邊的引用地址如果一致的話,是相等的 arr1 = [1,2,3]; arr2 = arr1; console.log(arr1 === arr2) // true相等運算符 ==
非嚴格匹配: 會類型轉換,但是有前提條件一共有五種情況
(接下來的代碼以 x == y 為示例)
x和y都是null或undefined:
規則: 沒有隱式類型轉換,無條件返回true
console.log ( null == undefined );//true console.log ( null == null );//true console.log ( undefined == undefined );//true
x或y是NaN : NaN與任何數字都不等
規則:沒有隱式類型轉換,無條件返回false
console.log ( NaN == NaN );//false
x和y都是string,boolean,number
規則:有隱式類型轉換,會將不是number類型的數據轉成number
console.log ( 1 == true );//true (1) 1 == Number(true) console.log ( 1 == "true" );//false (1) 1 == Number("true") console.log ( 1 == ! "true" );//false (1) 1 == !Boolean("true") (2) 1 == !true (3) 1 == false (4)1 == Number(false) console.log ( 0 == ! "true" );//true console.log(true == "true") // false
x或y是復雜數據類型 : 會先獲取復雜數據類型的原始值之后再左比較
復雜數據類型的原始值: 先調用valueOf方法,然后調用toString方法
valueOf:一般默認返回自身
數組的toString:默認會調用join方法拼接每個元素并且返回拼接后的字符串
console.log ( [].toString () );//空字符串 console.log ( {}.toString () );//[object Object] 注意: 空數組的toString()方法會得到空字符串, 而空對象的toString()方法會得到字符串[object Object] (注意第一個小寫o,第二個大寫O喲) console.log ( [ 1, 2, 3 ].valueOf().toString());//‘1,2,3’ console.log ( [ 1, 2, 3 ] == "1,2,3" );//true (1)[1,2,3].toString() == "1,2,3" (2)"1,2,3" == "1,2,3" console.log({} == "[object Object]");//true
x和y都是復雜數據類型 :
規則只比較地址,如果地址一致則返回true,否則返回false
var arr1 = [10,20,30]; var arr2 = [10,20,30]; var arr3 = arr1;//將arr1的地址拷貝給arr3 console.log ( arr1 == arr2 );//雖然arr1與arr2中的數據是一樣,但是它們兩個不同的地址 console.log ( arr3 == arr1 );//true 兩者地址是一樣 console.log ( [] == [] );//false console.log ( {} == {} );//false
經典面試題
注意:八種情況轉boolean得到false: 0 -0 NaN undefined null "" false document.all() console.log([] == 0); //true // 分析:(1) [].valueOf().toString() == 0 (2) Number("") == 0 (3) false == 0 (4) 0 == 0 console.log(![] == 0); //true // 分析: 邏輯非優先級高于關系運算符 ![] = false (空數組轉布爾值得到true) console.log([] == []); //false // [] 與右邊邏輯非表達式結果比較 //(1) [] == !Boolean([]) (2) [] == !true (3)[] == false (4) [].toString() == false (5)"" == false (6)Number("0") == Number(false) console.log([] == ![]); //true onsole.log({} == {}); //false // {} 與右邊邏輯非表達式結果比較 //(1){} == !{} (2){} == !true (3){} == false (4){}.toString() == false (5)"[object Object]" == false (6)Number("[object Object]") == false console.log({} == !{}); //false
{{BANNED}}面試題
var a = ??? if(a == 1 && a == 2 && a == 3 ){ console.log(1) } //如何完善a,使其正確打印1 //答案 var a = { i : 0, //聲明一個屬性i valueOf:function ( ) { return ++a.i; //每調用一次,讓對象a的i屬性自增一次并且返回 } } if (a == 1 && a == 2 && a == 3){ //每一次運算時都會調用一次a的valueOf()方法 console.log ( "1" ); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/102942.html
摘要:具體的行為取決于參數的類型。說到,就不得不提一下方法,方法自帶隱式類型轉換,該方法在測試其參數之前,會先調用方法將其轉換為數字。全等運算符會先進行數據類型判斷,并且不會發生隱式類型轉換。 類型轉換還不行?還非得隱式?這是什么高級玩意? 廢話不多說,我們先上一盤?,額,不對,先看一個例子吧。 3 + true 實際上在大多數編程語言中,都會認為上面這個表達式是錯誤的。因為布爾表達式與算術...
摘要:結合實際中的情況來看,有意或無意中涉及到隱式類型轉換的情況還是很多的。此外當進行某些操作時,變量可以進行類型轉換,我們主動進行的就是顯式類型轉換,另一種就是隱式類型轉換了。 前言 相信剛開始了解js的時候,都會遇到 2 ==2,但 1+2 == 1+2為false的情況。這時候應該會是一臉懵逼的狀態,不得不感慨js弱類型的靈活讓人發指,隱式類型轉換就是這么猝不及防。結合實際中的情況來看...
摘要:隱式類型轉換通常在邏輯判斷或者有邏輯運算符時被觸發。一元加號執行字符串的類型轉換。邏輯運算符和將值轉為型,但是會返回原始值不是。計算從表達式開始,該表達式通過方法轉換為空字符串,然后轉換為。總結查看原文關注每日一道面試題詳解 類型轉換是將值從一種類型轉換為另一種類型的過程(比如字符串轉數字,對象轉布爾值等)。任何類型不論是原始類型還是對象類型都可以進行類型轉換,JavaScript 的...
摘要:看下面的代碼和會對操作數執行條件判斷,如果操作數不是布爾值,會先執行類型轉換后再執行條件判斷。大家記住這個規則布爾值如果與其他類型進行抽象比較,會先用將布爾值轉換為數字再比較。 在上一篇中我們聊過了 JS 類型轉換的規則和我發現的一些常見書籍中關于類型轉換的一些小錯誤,當碰到顯示類型轉換的時候大家可以按照這些規則去拆解出答案。但 JS 中存在一些很隱晦的隱式類型轉換,這一篇就來談下我對...
閱讀 3012·2021-11-22 12:06
閱讀 599·2021-09-03 10:29
閱讀 6526·2021-09-02 09:52
閱讀 2013·2019-08-30 15:52
閱讀 3411·2019-08-29 16:39
閱讀 1191·2019-08-29 15:35
閱讀 2061·2019-08-29 15:17
閱讀 1416·2019-08-29 11:17