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

Why undefined is not equal to zero in JavaScript? - Stack Overflow

programmeradmin1浏览0评论

I'm discovering odds of JavaScript comparisons. I wanted to find an example of how tricky comparisons may be, and how can cause bugs in some situations.

I thought about example where some input variable remains undefined, and is compared to zero. Because undefined is false when converted to Boolean, and zero is false when converted to Boolean I decided to test following code:

var x;
//Here x should be initialized but due to some circumstances is not
if(x == 0){
   //This should run
}

Surprisingly...

Boolean(undefined) //false
Boolean(0) //false
x //undefined
x == 0 //false

Why it's like that?

I'm discovering odds of JavaScript comparisons. I wanted to find an example of how tricky comparisons may be, and how can cause bugs in some situations.

I thought about example where some input variable remains undefined, and is compared to zero. Because undefined is false when converted to Boolean, and zero is false when converted to Boolean I decided to test following code:

var x;
//Here x should be initialized but due to some circumstances is not
if(x == 0){
   //This should run
}

Surprisingly...

Boolean(undefined) //false
Boolean(0) //false
x //undefined
x == 0 //false

Why it's like that?

Share Improve this question asked Nov 15, 2016 at 17:15 Arkadiusz KałkusArkadiusz Kałkus 18.4k20 gold badges76 silver badges112 bronze badges 4
  • 5 Since 1 and 2 are both truthy, would you expect 1 == 2 to be true? – James Thorpe Commented Nov 15, 2016 at 17:18
  • 2 What sort of answer are you expecting beyond "because the spec says so"? ecma-international.org/ecma-262/5.1/#sec-11.9.3 – Quentin Commented Nov 15, 2016 at 17:18
  • Well undefined != 0 and I guess that's just how it is. See there for the complete list of JS comparisons: dorey.github.io/JavaScript-Equality-Table – laurent Commented Nov 15, 2016 at 17:19
  • Basically the same reasoning as Why does “undefined equals false” return false? – Heretic Monkey Commented Nov 15, 2016 at 17:23
Add a comment  | 

2 Answers 2

Reset to default 15

This behaviour is in the specification for The Abstract Equality Comparison Algorithm

From the specification

The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed as follows:

  1. If Type(x) is the same as Type(y), then ... ...

  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 comparison x == ToNumber(y).
  5. If Type(x) is String and Type(y) is Number, return the result of the comparison ToNumber(x) == y.
  6. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
  7. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
  8. If Type(x) is either String or Number and Type(y) is Object, return the result of the comparison x == ToPrimitive(y).
  9. If Type(x) is Object and Type(y) is either String or Number, return the result of the comparison ToPrimitive(x) == y.
  10. Return false.

As undefined and a number (0) is not of the same type, it's only in the third point where it mentions what to do if the left hand side is undefined.
Then, if the right hand side is null, it returns true, any other value, and it goes straight to 10., which says "return false".

Boolean(undefined) //false
Boolean(0) //false

Actually, The Boolean function returns false for all non-real values such as 0, null, undefined, ""(empty string), etc.

It does not mean that the undefined == 0

发布评论

评论列表(0)

  1. 暂无评论