2014-04-11 28 views
2

從我的理解: -primitive類型測試平等如何檢查原始的ID?

'lol' === 'lol' 
true 

真實的,因爲內容是相同的或真實的,因爲對象ID在內存中的是一樣的嗎?

身份 - 複合型測試

[1,2,3] === [1,2,3] 
false 

假的,因爲參考瓦爾的差異或差異,因爲對象ID在內存中的是差異?

我希望能夠區分:
A)基準變量
B)的標識符(命名空間)
C)在存儲器中的實際對象
d)的ID

是那些命令允許我單獨測試這些東西?

+0

也許你會發現這個有趣的:http://stackoverflow.com/a/13268731/783743 –

回答

4

JavaScript有兩種比較 - 嚴格和抽象。 ==運算符執行抽象比較,這意味着它可能會將值轉換爲其他類型,然後比較結果值。 ===運算符進行嚴格比較,這意味着它永遠不會轉換類型。我們確定兩個值是否嚴格相等的方式取決於值的類型,而不僅僅是它們在內存中的位置。我查看了這個文件,以確保所有的情況都正確無誤,所以這裏是Mozilla的Comparison Operators文章列表。

  • 兩個字符串在相應位置具有相同的字符序列,相同的長度和相同的字符時是嚴格相等的。
  • 兩個數字在數值上相等時(具有相同的數字值)嚴格相等。 NaN不等於任何東西,包括NaN。正和負的零相等。
  • 如果兩者都爲真或兩者都爲假,則兩個布爾操作數嚴格相等。
  • 對於嚴格或抽象比較,兩個不同的對象永遠不會相等。
  • 比較對象的表達式只有在操作數引用同一個對象時才爲真。
  • 空和未定義的類型是==(但不是===)。

所以這兩個字符串是嚴格相等的,因爲它們包含完全相同的字符序列。這兩個數組不相等(嚴格或抽象),因爲它們是兩個不同的對象。

對於基元或對象,JavaScript中沒有「ID」的概念。這些平等規則是產生你所看到的行爲的原因。

+0

我認爲你是不正確的伴侶。 ==根據http://eloquentjavascript.net/chapter4.html, 「」檢查身份,不等於「」JavaScript的==運算符,當比較對象時,只有在賦予給它的兩個值是完全相同的值時纔會返回true 。比較具有相同內容的不同對象將給出錯誤的「」 –

+1

+ 1簡明且寫得很好。這裏有一個參考 - 嚴格http://es5.github.io/#x11.9.6和抽象http://es5.github.io/#x11.9.3 –

+1

@ chopperdrawlion4'=='只檢查對象中的身份是除了null,undefined,數字,字符串和布爾值(在ES5中)之外的任何東西。這就是這個答案所說的,我引用「只有當操作數引用同一個對象時,比較對象的表達式纔是真實的。」這個答案說的是什麼,以及第四章中雄辯的JavaScript基本上是一樣的。如果您不確定任何事情,您可以隨時查看我在上次評論中引用的語言規範。 –

6

'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中沒有數組的基本形式。它們屬於通過參考類別並且記憶位置不同。

+0

所以你似乎在說'==='測試*內存位置*,而不是值相等。這對所有數據類型都適用嗎? –

+0

==檢查是否相等,而===檢查是否相等和標識。是的,它的全部有效 –

+0

那麼怎麼來: a = [1]; b = [1]; a == b false a === b false 我期望第一個測試是真實的,第二個是假的。這是差異,因爲它是一個複合類型? –