最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Javascript array equal to zero but not itself - Stack Overflow

programmeradmin3浏览0评论

I've been playing around with arrays in JavaScript and cannot figure out why this happens:

console.log(0 == 0)
//true

console.log([] == 0)
//true

console.log(0 == [])
//true

console.log([] == [])
//false

console.log([] == ![])
// true

I've been playing around with arrays in JavaScript and cannot figure out why this happens:

console.log(0 == 0)
//true

console.log([] == 0)
//true

console.log(0 == [])
//true

console.log([] == [])
//false

console.log([] == ![])
// true

The empty array is equal enough to zero both left and right, but why isn't it equal to itself?

I realise that paring two objects would not result true, but why are they coerced to 0 (or falsy, which shouldn't be the case) if you pare them to 0, while threated as an object if you pare them to the other array?

Share Improve this question edited Dec 28, 2016 at 11:22 Randy asked Dec 28, 2016 at 11:11 RandyRandy 9,8495 gold badges42 silver badges58 bronze badges 7
  • 1 stackoverflow./questions/30820611/… – sinisake Commented Dec 28, 2016 at 11:14
  • 1 Possible duplicate of Why are two identical objects not equal to each other? – baao Commented Dec 28, 2016 at 11:16
  • @sinisake That would explain why they don't match each other, but the fact they match 0 is confusing me pletely – Randy Commented Dec 28, 2016 at 11:16
  • 1 but console.log([] === 0) gives false – RomanPerekhrest Commented Dec 28, 2016 at 11:17
  • 1 JS is a very loosely typed language and polymorphism runs through the veins of it. So i would advice you to study type coercion in JS topic. – Redu Commented Dec 28, 2016 at 11:29
 |  Show 2 more ments

4 Answers 4

Reset to default 8
console.log(0 == [])
//true 

You are trying to pare object with an integer, so your object is implicitly typecasted to equivalent integer value that is 0

console.log([] == [])
//false 

as two objects are never equal

console.log([] == [])

That will pare whether array1 and array2 are the same array object in memory, which is not what you want.

In order to do what you want, you'll need to check whether the two arrays have the same length, and that each member in each index is identical.

console.log([].length == [].length)
// true

Since the plete answer is never given and I actually understand it now, I'll provide the answer myself.

I found this in the Ecma-262 pdf:

It basically reads that [] == 0 is the same as Number([]) == 0 which is the same as 0 == 0 which is true. This does not apply to strict ===.

There is no rule to pare objects other then rule number one, which is x is the same as y. This means the same in everything, also memory address. Since they are not sharing the same memory address, rule 10 applies (return false).

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. Return the result of performing Strict Equality Comparison x === y.

  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, Number, or Symbol 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, Number, or Symbol, return the result of the parison ToPrimitive(x) == y.
  10. Return false

This question is handled with the knowledge of object reference and type conversion more properly.First,in javascript, object value is stored by reference.So we can tell it is different from [] and [],because the two array correspond with two different addr in memory.Second, '==' is a not rigorous operation for both left and right, [] and 0 are both transformed to false.

发布评论

评论列表(0)

  1. 暂无评论