2012-11-23 74 views
0
var x = function() {}; 
var y = function() {}; 

alert(x === y); // is false; 

爲什麼x不等於y,如果它們都被初始化爲相同的值?爲什麼是一個空的函數!==一個空的函數?

+0

請用jQuery或您正在使用的任何框架標記您的問題,這樣有正確知識的人就會幫助您。這不是基於您的代碼示例的通用JavaScript問題。 – SAJ14SAJ

+0

好吧,這是一個通用的Javascript問題,因爲我問爲什麼設置x和y爲'function(){}'x === y'返回false。沒有框架與此有任何關係。我編輯我的問題,所以它更簡單。我認爲它與事實無關我想我是單元測試:) – Nope

+0

啊,現在這是清晰可讀的。我將不得不搜索標準文檔。我不確定===函數實際上是檢查內容而不是地址。我永遠不會嘗試這樣做。你究竟在努力實施什麼? – SAJ14SAJ

回答

4

從MDN:

如果兩個操作數都是對象,然後JavaScript的比較內部 引用時操作數指代相同的對象中 存儲器中是相等的。

顯然,您的對象是彼此不同的,並且指向不同的內存位置。等於比較運算符檢查兩個操作數是否引用同一個對象,而不是它們是否是副本。

考慮的是,(new Number(1)) != (new Number(1)),而1 == 1

+0

在對象上使用'==='時,我完全忘記了'指向內存部分中的ame對象。出於某種原因,我認爲,因爲他們都是空的職能,它會有所不同。即使現在使用Javascript一段時間後,我仍然有時候會因爲基礎知識而感到焦慮。感謝您的MDN,我現在應該記住它和簡短的樣本。 – Nope

+0

+1。我只接受了其他答案的答案,因爲它是MDN中「memeory」中的相同對象,它使分數下降。 – Nope

+0

很高興你有你需要去的地方。 – SAJ14SAJ

8

當你在JavaScript中比較對象,你正在檢查,看看他們是同一個對象,而不是他們是否相同的對象

+0

+1。感謝您的快速和現實的解釋。我仍然有點困惑,直到我再次看到MDN,才明白'same'和'identical'之間的區別。當然,你的解釋絕對正確。 – Nope

2

因爲他們是不一樣的函數對象。比較器不查看函數體。

2

ECMA標準給出了some precise rules關於JavaScript中嚴格相等的工作原理。基本上,正如@Quentin所說,如果您要比較兩個對象(除了Number,String,Boolean,null或undefined),它只會返回true,如果它們是相同的對象。這裏情況不同。

考慮以下代碼:

var x = function() {}; 
var y = function() {}; 
x.something = "this is x"; 
y.something = "this is not x"; 
alert(x.something === y.something); 

這會給false

+0

+1代碼顯示了爲什麼它們不能爲真。 – Nope

1

Spec-11.9.6來自:

全等比較算法

比較X === y,其中x和y是數值,產生真或假 。這種比較如下進行:

1.如果Type(x)與Type(y)不同,則返回false。

2.如果Type(x)是Undefined,則返回true。

3.如果Type(x)爲Null,則返回true。如果X和Y指的是同一個對象

...

7.Return如此。否則,返回false。

相關問題