admin管理员组文章数量:1025235
I would like to know why this happens and what is the primitive value of "a"?
a = [1,2,3]
b = "1,2,3"
a==b //this returns true
As far as I know when doing this the primitive type of a is pared with b.
EDIT:
According to the section "Loose equality using ==" When you pare an object (a) with a string (b) the following rule is valid:
ToPrimitive(A) attempts to convert its object argument to a primitive value, by attempting to invoke varying sequences of A.toString and A.valueOf methods on A.
Undestanding how "ToPrimitive(A)" works was crucial.
I would like to know why this happens and what is the primitive value of "a"?
a = [1,2,3]
b = "1,2,3"
a==b //this returns true
As far as I know when doing this the primitive type of a is pared with b.
EDIT:
According to the section "Loose equality using ==" When you pare an object (a) with a string (b) the following rule is valid:
ToPrimitive(A) attempts to convert its object argument to a primitive value, by attempting to invoke varying sequences of A.toString and A.valueOf methods on A.
Undestanding how "ToPrimitive(A)" works was crucial.
Share Improve this question edited Sep 20, 2017 at 13:44 Bruno Casarotti asked Sep 20, 2017 at 13:13 Bruno CasarottiBruno Casarotti 6439 silver badges26 bronze badges 12-
2
==
specifically ignores the type of the values it pares. – JJJ Commented Sep 20, 2017 at 13:14 - you should check this out destroyallsoftware./talks/wat, it won't answer your question and it'll give you a dozen more. – Miniver Cheevy Commented Sep 20, 2017 at 13:15
- Ok but it fails when there is an object inside it – Bruno Casarotti Commented Sep 20, 2017 at 13:15
-
Generaly in js, using
===
is safer and less random than==
. But check Miniver Cheevy's link – m.nachury Commented Sep 20, 2017 at 13:16 - Use a===b. For the object, share example – Amit Kumar Singh Commented Sep 20, 2017 at 13:16
1 Answer
Reset to default 10It returns true
because you are not using the strict parison operator ===
.
When using ==
you are actually doing [1,2,3].toString() === '1,2,3'
Equality (==) (source)
The equality operator converts the operands if they are not of the same type, then applies strict parison. If both operands are objects, then JavaScript pares internal references which are equal when operands refer to the same object in memory.
Identity / strict equality (===) (source)
The identity operator returns true if the operands are strictly equal (see above) with no type conversion.
console.log('[1,2,3] == "1,2,3"', [1,2,3] == "1,2,3");
console.log('[1,2,3] === "1,2,3"', [1,2,3] === "1,2,3");
console.log('[1,2,3].toString() === "1,2,3"', [1,2,3].toString() === "1,2,3");
The Abstract Equality Comparison Algorithm (source)
The parison x == y, where x and y are values, produces true or false. Such a parison is performed as follows:
1.If Type(x) is the same as Type(y), then
____a. If Type(x) is Undefined, return true.
____b. If Type(x) is Null, return true.
____c. If Type(x) is Number, then
________i If x is NaN, return false.
________ii If y is NaN, return false.
________iii If x is the same Number value as y, return true.
________iv If x is +0 and y is −0, return true.
________v If x is −0 and y is +0, return true.
________vi Return false.
____d. If Type(x) is String, then return true if x and y are exactly the same sequence of characters (same length and same characters in corresponding positions). Otherwise, return false.
____e. If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.
____f Return true if x and y refer to the same object. Otherwise, return false.
2. If x is null and y is undefined, return true.
3. If x is undefined and y is null, return true.
4. If Type(x) is Number and Type(y) is String, return the result of the parison x == ToNumber(y).
5. If Type(x) is String and Type(y) is Number, return the result of the parison ToNumber(x) == y.
6. If Type(x) is Boolean, return the result of the parison ToNumber(x) == y.
7. If Type(y) is Boolean, return the result of the parison x == ToNumber(y).
8. If Type(x) is either String or Number and Type(y) is Object, return the result of the parison x == ToPrimitive(y).
9. If Type(x) is Object and Type(y) is either String or Number, return the result of the parison ToPrimitive(x) == y.
10. Return false.
I would like to know why this happens and what is the primitive value of "a"?
a = [1,2,3]
b = "1,2,3"
a==b //this returns true
As far as I know when doing this the primitive type of a is pared with b.
EDIT:
According to the section "Loose equality using ==" When you pare an object (a) with a string (b) the following rule is valid:
ToPrimitive(A) attempts to convert its object argument to a primitive value, by attempting to invoke varying sequences of A.toString and A.valueOf methods on A.
Undestanding how "ToPrimitive(A)" works was crucial.
I would like to know why this happens and what is the primitive value of "a"?
a = [1,2,3]
b = "1,2,3"
a==b //this returns true
As far as I know when doing this the primitive type of a is pared with b.
EDIT:
According to the section "Loose equality using ==" When you pare an object (a) with a string (b) the following rule is valid:
ToPrimitive(A) attempts to convert its object argument to a primitive value, by attempting to invoke varying sequences of A.toString and A.valueOf methods on A.
Undestanding how "ToPrimitive(A)" works was crucial.
Share Improve this question edited Sep 20, 2017 at 13:44 Bruno Casarotti asked Sep 20, 2017 at 13:13 Bruno CasarottiBruno Casarotti 6439 silver badges26 bronze badges 12-
2
==
specifically ignores the type of the values it pares. – JJJ Commented Sep 20, 2017 at 13:14 - you should check this out destroyallsoftware./talks/wat, it won't answer your question and it'll give you a dozen more. – Miniver Cheevy Commented Sep 20, 2017 at 13:15
- Ok but it fails when there is an object inside it – Bruno Casarotti Commented Sep 20, 2017 at 13:15
-
Generaly in js, using
===
is safer and less random than==
. But check Miniver Cheevy's link – m.nachury Commented Sep 20, 2017 at 13:16 - Use a===b. For the object, share example – Amit Kumar Singh Commented Sep 20, 2017 at 13:16
1 Answer
Reset to default 10It returns true
because you are not using the strict parison operator ===
.
When using ==
you are actually doing [1,2,3].toString() === '1,2,3'
Equality (==) (source)
The equality operator converts the operands if they are not of the same type, then applies strict parison. If both operands are objects, then JavaScript pares internal references which are equal when operands refer to the same object in memory.
Identity / strict equality (===) (source)
The identity operator returns true if the operands are strictly equal (see above) with no type conversion.
console.log('[1,2,3] == "1,2,3"', [1,2,3] == "1,2,3");
console.log('[1,2,3] === "1,2,3"', [1,2,3] === "1,2,3");
console.log('[1,2,3].toString() === "1,2,3"', [1,2,3].toString() === "1,2,3");
The Abstract Equality Comparison Algorithm (source)
The parison x == y, where x and y are values, produces true or false. Such a parison is performed as follows:
1.If Type(x) is the same as Type(y), then
____a. If Type(x) is Undefined, return true.
____b. If Type(x) is Null, return true.
____c. If Type(x) is Number, then
________i If x is NaN, return false.
________ii If y is NaN, return false.
________iii If x is the same Number value as y, return true.
________iv If x is +0 and y is −0, return true.
________v If x is −0 and y is +0, return true.
________vi Return false.
____d. If Type(x) is String, then return true if x and y are exactly the same sequence of characters (same length and same characters in corresponding positions). Otherwise, return false.
____e. If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.
____f Return true if x and y refer to the same object. Otherwise, return false.
2. If x is null and y is undefined, return true.
3. If x is undefined and y is null, return true.
4. If Type(x) is Number and Type(y) is String, return the result of the parison x == ToNumber(y).
5. If Type(x) is String and Type(y) is Number, return the result of the parison ToNumber(x) == y.
6. If Type(x) is Boolean, return the result of the parison ToNumber(x) == y.
7. If Type(y) is Boolean, return the result of the parison x == ToNumber(y).
8. If Type(x) is either String or Number and Type(y) is Object, return the result of the parison x == ToPrimitive(y).
9. If Type(x) is Object and Type(y) is either String or Number, return the result of the parison ToPrimitive(x) == y.
10. Return false.
本文标签: How and why 123quot13quot returns true in JavaScriptStack Overflow
版权声明:本文标题:How and why [1,2,3] == "1,2,3" returns true in JavaScript? - Stack Overflow 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/questions/1744350926a2092874.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论