2013-07-10 130 views
2

=====之間的區別是,前者檢查後者是否檢查值的值只(1 == "1"將返回true)和另外檢查類型(1 === "1"將返回false因爲number是不是字符串)。javascript對象比較:等於VS嚴格等於

比較對象意味着比較對象引用(對象變量將內部地址保存到它們引用的對象以及正在比較這些地址)。如果兩個對象具有完全相同的鍵和值,函數等,但它們是單獨的對象,則==將返回false,因此===也將返回false。

的問題是:這有什麼區別,如果我使用=====比較操作關於JavaScript對象? PS如果我錯了任何地方,請糾正我,並解釋(我會接受它作爲問題的答案)

編輯:這不是關於JavaScript基元,所以比較對象和基元是離題。

+3

可能重複[是否重要的​​是等於我在Javascript比較運算符](http://stackoverflow.com/questions/359494/does-it-matter-which-equals-operator-vs-i-use-在-javascript比較) – taylorc93

+1

@ taylorc93我只問對象的情況下,不是所有類型(包括原語)。 – ducin

+0

也意識到===也有文檔的目的。使用===如果重要的是要表明它嚴格相等並且不僅僅等於 – mplungjan

回答

2

簡單比較用戶定義的對象(我假設你問的是他們,而不是關於諸如字符串和數字的基元),永遠不會返回true,所以沒有意義使用它。您可以通過比較它們的原型和構造函數來檢查兩個對象是否具有相同的類型,但是當您使用==或===時,它又是無所謂的。唯一的區別是比較可能會返回true。但是,這當然不說有關實例的屬性什麼,用相同的原型和構造兩個實例可以有不同的屬性

function cat1() { 
    this.name = "blacky"; 
    this.age = 9; 
} 

function cat2() { 
    this.name = "blacky"; 
    this.age = 9; 
} 


var anton = new cat1() 
var john = new cat2() 
var kevin = new cat1() 

console.log(anton == kevin) // false 
console.log(anton == john) // false 
console.log(anton === john) // false 
console.log(anton === kevin) // false 
console.log(anton.__proto__ == kevin.__proto__) // true 
console.log(anton.constructor == kevin.constructor) // true 
console.log(anton.constructor == john.constructor) // false 
console.log(anton.__proto__ == john.__proto__) // false 

要總結的話,回答你的問題是:沒有,它不管您是使用==還是===來比較對象,都不會產生任何影響,因爲比較它們始終返回false。如果要比較用戶定義的(不是原始的)類型,則應直接使用返回每個對象的原型的對象的方法對其進行比較。

+1

這不使用非標準__proto__來檢查對象是否屬於某種類型?它不檢查對象值。如果我有兩個與d1完全不同的值的日期對象.__ proto __ === d2 .__ proto__將返回true,因爲它們都是日期 – HMR

+3

感謝上帝,有人理解我的問題。謝謝你正確地閱讀這個問題。就像我想的那樣,如果2個變量引用同一個對象,則與==和===進行比較將始終返回true。如果它們引用內存中的不同對象,則兩個比較都將返回false。總是。這就是問題所在。 '__proto__'是一個不同的話題,我理解它們;)順便說一句,'__proto__'是非標準的,我們應該避免使用它。 – ducin

+0

@tkoomzaaskz:FWIW,'__proto__'在ECMAScript 6中設置爲標準化。 –