我想請教一下奇怪的事情,即:
var x = "pl";
var y = ["pl"];
[x] == y; // false - why?
x == y; // true - how ?
x === y; // false - okay
有人能解釋一下嗎?
在此先感謝。比較這將永遠是假的,除非對象實際上相同的對象,或如果對象被強制轉換爲 -
我想請教一下奇怪的事情,即:
var x = "pl";
var y = ["pl"];
[x] == y; // false - why?
x == y; // true - how ?
x === y; // false - okay
有人能解釋一下嗎?
在此先感謝。比較這將永遠是假的,除非對象實際上相同的對象,或如果對象被強制轉換爲 -
,因爲你比較兩個數組(這是對象)第一個是假的不同類型的價值,如第二次比較。
在第二次比較中,y被強制爲字符串值,然後發現等於"pl"
。
例如,下面的代碼:
["pl"] + "foo" → "plfoo"
順便說一句,這就是爲什麼你應該總是使用===
而不是==
- 它不會導致任何奇怪的強制。這就是爲什麼第三次比較是錯誤的。
在陣列(抽象相等比較)
[x] == y; // false - why?
[x]
和y
不指代相同的對象。 Arrays是objects和==
運算符測試它們是相同的對象,而不是簡單的兩個對象具有相同的值的所有屬性。爲了確定中的對象相等方式,您必須手動枚舉每個對象的屬性並測試每個值。
據==
使用The Abstract Equality Comparison Algorithm:如果x和y是指相同的對象
返回真。否則,返回false。
字符串陣列(抽象相等比較)
x == y; // true - how ? oO
y
,陣列,因爲你比較它與x
,一個字符串時使用==
被強制爲一個字符串。
據==
使用The Abstract Equality Comparison Algorithm:
如果Type(x)是String或數目和類型(y)爲對象,返回 比較X == ToPrimitive(Y)的結果。
字符串數組(全等比較)
x === y; // fasle - okey
===
,不像==
,將不要挾y
成字符串......所以,你要比較的字符串的目的。
據===
使用The Strict Equality Comparison Algorithm:
如果Type(x)是從式(y)的不同,返回false。
[x] == y;
[ 'PL'] == [ 'P1'] - 在存儲器上比較2個不同的陣列參
x == y;
同爲 「PL」 == [ 「P1」]的ToString()。 JS第二個參數轉換爲字符串,因爲第一個也是字符串
OK,然後解釋:「你好」,「約翰」] ==「你好,約翰」 //真正 – cojack
'[X] ==ÿ '進行淺層比較,並且由於兩者不引用相同的數組,所以它返回false。 – spinningarrow
@cojack'['a','b','c']。toString()'→''a,b,c'' – jrajav