從我的理解: -primitive類型測試平等如何檢查原始的ID?
'lol' === 'lol'
true
真實的,因爲內容是相同的或真實的,因爲對象ID在內存中的是一樣的嗎?
身份 - 複合型測試
[1,2,3] === [1,2,3]
false
假的,因爲參考瓦爾的差異或差異,因爲對象ID在內存中的是差異?
我希望能夠區分:
A)基準變量
B)的標識符(命名空間)
C)在存儲器中的實際對象
d)的ID
是那些命令允許我單獨測試這些東西?
從我的理解: -primitive類型測試平等如何檢查原始的ID?
'lol' === 'lol'
true
真實的,因爲內容是相同的或真實的,因爲對象ID在內存中的是一樣的嗎?
身份 - 複合型測試
[1,2,3] === [1,2,3]
false
假的,因爲參考瓦爾的差異或差異,因爲對象ID在內存中的是差異?
我希望能夠區分:
A)基準變量
B)的標識符(命名空間)
C)在存儲器中的實際對象
d)的ID
是那些命令允許我單獨測試這些東西?
JavaScript有兩種比較 - 嚴格和抽象。 ==
運算符執行抽象比較,這意味着它可能會將值轉換爲其他類型,然後比較結果值。 ===
運算符進行嚴格比較,這意味着它永遠不會轉換類型。我們確定兩個值是否嚴格相等的方式取決於值的類型,而不僅僅是它們在內存中的位置。我查看了這個文件,以確保所有的情況都正確無誤,所以這裏是Mozilla的Comparison Operators文章列表。
所以這兩個字符串是嚴格相等的,因爲它們包含完全相同的字符序列。這兩個數組不相等(嚴格或抽象),因爲它們是兩個不同的對象。
對於基元或對象,JavaScript中沒有「ID」的概念。這些平等規則是產生你所看到的行爲的原因。
我認爲你是不正確的伴侶。 ==根據http://eloquentjavascript.net/chapter4.html, 「」檢查身份,不等於「」JavaScript的==運算符,當比較對象時,只有在賦予給它的兩個值是完全相同的值時纔會返回true 。比較具有相同內容的不同對象將給出錯誤的「」 –
+ 1簡明且寫得很好。這裏有一個參考 - 嚴格http://es5.github.io/#x11.9.6和抽象http://es5.github.io/#x11.9.3 –
@ chopperdrawlion4'=='只檢查對象中的身份是除了null,undefined,數字,字符串和布爾值(在ES5中)之外的任何東西。這就是這個答案所說的,我引用「只有當操作數引用同一個對象時,比較對象的表達式纔是真實的。」這個答案說的是什麼,以及第四章中雄辯的JavaScript基本上是一樣的。如果您不確定任何事情,您可以隨時查看我在上次評論中引用的語言規範。 –
'lol'==='lol'
給你真正的,因爲它是一個字符串literal.It屬於通過值類別和位置是相同的內存。
但是,如果你這樣做
var s1=new String('lol');
var s2=new String('lol');
s1===s2 //returns false
,因爲S1和S2字符串對象,並通過參考類別分爲合格。值指向內存中的不同位置
[1,2,3]===[1,2,3]
也會返回false,因爲數組默認情況下是Javascript中的對象。 JS中沒有數組的基本形式。它們屬於通過參考類別並且記憶位置不同。
所以你似乎在說'==='測試*內存位置*,而不是值相等。這對所有數據類型都適用嗎? –
==檢查是否相等,而===檢查是否相等和標識。是的,它的全部有效 –
那麼怎麼來: a = [1]; b = [1]; a == b false a === b false 我期望第一個測試是真實的,第二個是假的。這是差異,因爲它是一個複合類型? –
也許你會發現這個有趣的:http://stackoverflow.com/a/13268731/783743 –