摘要:今天在看廖雪峰大神的博客意外地發(fā)現(xiàn)是不能用或操作符直接比較兩個數(shù)組是否相等的。目前沒有內(nèi)置的操作符判斷對象的內(nèi)容是否相同。另外一種方法判斷數(shù)組的長度循環(huán)遍歷數(shù)組的值進(jìn)行比較以上就是我的總結(jié),有不對的地方請指出。
今天在看廖雪峰大神的博客意外地發(fā)現(xiàn)javascript是不能用 "=="或"==="操作符直接比較兩個數(shù)組是否相等的。
先看案例:
var a = [1,2,3,4,5]; var b = a.slice(); console.log(a); // [1,2,3,4,5] console.log(b); // [1,2,3,4,5] console.log(a === b); // false console.log(a == b); // false console.log([] == []); // false console.log( [] === []); // false為什么都輸出false呢?先弄清楚以下幾點(diǎn):
javascript包括兩個不同類型的值:基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。
基本數(shù)據(jù)類型指的是簡單的數(shù)據(jù)段,引用數(shù)據(jù)類型指的是有多個值構(gòu)成的對象。
常見的基本數(shù)據(jù)類型:Number、String 、Boolean、Null和Undefined。
var a = 10; var b = a; b = 20; console.log(a); // 10
上面b獲取的是a值的一份拷貝,雖然兩個變量的值相等,但是兩個變量保存了兩個不同的基本數(shù)據(jù)類型值。b只是保存了a賦值的一個副本,所以,b的改變,對a沒有影響。
引用類型數(shù)據(jù):也就是對象類型Object type,比如:Object、Array、Function、Data等。javascript的引用數(shù)據(jù)類型是保存在堆內(nèi)存中的對象。
講到這里應(yīng)該理解為什么輸出的是false了:因為數(shù)組是兌現(xiàn),==或===操作符只能比較兩個對象是否是同一個實例,也就是是否是同一個對象引用。目前JavaScript沒有內(nèi)置的操作符判斷對象的內(nèi)容是否相同。
那么該如何去判斷數(shù)組是否相等呢?有一種做法是將數(shù)組轉(zhuǎn)換成字符串:
JSON.stringify(a1) === JSON.stringify(a2)
或
a1.toString() === a2.toString();
請不要使用這種方法?。。?/strong>
這種方法在某些情況下是可行的,當(dāng)兩個數(shù)組的元素順序相同且元素都可以轉(zhuǎn)換成字符串的情況下確實可行。
這樣的代碼存有隱患,比如數(shù)字被轉(zhuǎn)換成字符串,數(shù)字“1”和字符串“1”會被認(rèn)為相等,可能造成調(diào)試?yán)щy,不推薦使用。
另外一種方法:
function equar(a, b) { // 判斷數(shù)組的長度 if (a.length !== b.length) { return false } else { // 循環(huán)遍歷數(shù)組的值進(jìn)行比較 for (let i = 0; i < a.length; i++) { if (a[i] !== b[i]) { return false } } return true; } } var s = equar([1, "2", 3], [1, 2, 3]); var t = equar([1, 2, 3], [1, 2, 3]); console.log(s); // false console.log(t); // true
以上就是我的總結(jié),有不對的地方請指出。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/98112.html
摘要:本章將介紹基本的數(shù)據(jù)結(jié)構(gòu)。松鼠人一般在晚上八點(diǎn)到十點(diǎn)之間,雅克就會變身成為一只毛茸茸的松鼠,尾巴上的毛十分濃密。我們將雅克的日記表示為對象數(shù)組。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項目原文:Data Structures: Objects and Arrays 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用谷歌翻譯 部分參考了《Jav...
摘要:短路運(yùn)算返回值是什么又稱為短路或,短路如果左側(cè)為真,則不再進(jìn)行右側(cè)運(yùn)算,同時返回左側(cè)表達(dá)式運(yùn)算結(jié)果。上面是不存在的,所有結(jié)果為,轉(zhuǎn)成就是,那么就會運(yùn)算,把賦值給的同時,返回值也是,所以打印返回結(jié)果是函數(shù)內(nèi)部變量有哪些 DOM元素e的e.getAttribute(propName)和e.propName有什么區(qū)別和聯(lián)系 e.getAttribute(),是標(biāo)準(zhǔn)DOM操作文檔元素屬性的方...
摘要:數(shù)值類型引用類型有種通過復(fù)制數(shù)值傳值的數(shù)據(jù)類型。我們稱之為原始基本數(shù)據(jù)類型還有三種通過引用傳值的數(shù)據(jù)類型。當(dāng)?shù)仁竭\(yùn)算符和用于引用型變量時,他們會檢查引用。這是中的地方在內(nèi)存中的映射包含了函數(shù)的引用,其他變量則包含基本數(shù)據(jù)類型的數(shù)據(jù)。 本文旨在了解如何復(fù)制對象、數(shù)組和函數(shù)以及如何將它們傳遞到函數(shù)中。知道引用類型復(fù)制的是什么。了解原始值是通過復(fù)制值來復(fù)制及傳遞的。 數(shù)值類型 & 引用類型 ...
摘要:最近開始看源碼,并將源碼解讀放在了我的計劃中。后文中均假設(shè)比較的兩個參數(shù)為和。,如果和均是類型或者類型,我們可以用來判斷是否。 Why underscore 最近開始看 underscore.js 源碼,并將 underscore.js 源碼解讀 放在了我的 2016 計劃中。 閱讀一些著名框架類庫的源碼,就好像和一個個大師對話,你會學(xué)到很多。為什么是 underscore?最主要的原...
摘要:如果有一方是布爾值,則轉(zhuǎn)換為,轉(zhuǎn)換為,再進(jìn)行判斷。等同運(yùn)算符類型不同返回類型相同如果同為數(shù)字字符串則比較值如果同為布爾值,相同則為不同為如果兩個操作數(shù)同為引用類型,且引用的為同一個對象函數(shù),數(shù)組,則相同。 本文主要記錄平時開發(fā)遇到的知識點(diǎn)和小技巧 相等判斷(==) 類型相同: 判斷其值是否相同 類型不同: 1. 如果數(shù)字和字符串比較, 則字符串會被隱式轉(zhuǎn)換為數(shù)字,在做判斷。 2....
閱讀 2340·2021-11-22 14:56
閱讀 1478·2021-09-24 09:47
閱讀 913·2019-08-26 18:37
閱讀 2832·2019-08-26 12:10
閱讀 1528·2019-08-26 11:55
閱讀 3150·2019-08-23 18:07
閱讀 2306·2019-08-23 14:08
閱讀 612·2019-08-23 12:12