我不明白为什么会这样,
console.info("") //(an empty string)
console.info(0) //0
console.info(typeof "") //string
console.info(typeof 0) //number
console.info(""==0) //true
console.info(0=="") //true
console.info (0>="") //true
console.info ("">=0) //true
对于最后四个陈述,它不应该返回false。
我在FireBug中做了所有这些,这是一个firefox插件。
答案 0 :(得分:4)
ECMAScript Equals Operator(==)使用抽象等式比较算法,参见ECMA-262 §11.9.3。
答案 1 :(得分:2)
最后4个语句通过逻辑比较运算符涉及隐式类型转换。由于正在比较String
和Number
,因此String
会转换为Number
。 ""
变为0
,等于0
。
You can find it in the specification 这不是一个容易阅读的IMO :
比较x == y,其中x和y是值,产生true或false。这样的比较如下进行:
- 如果Type(x)与Type(y)不同,请转到步骤14.
- 如果Type(x)为Undefined,则返回true。
- 如果Type(x)为Null,则返回true。
- 如果Type(x)不是Number,请转到步骤11.
- 如果x为NaN,则返回false。
- 如果y为NaN,则返回false。
- 如果x与y的数字值相同,则返回true。
- 如果x为+0且y为-0,则返回true。
- 如果x为-0且y为+0,则返回true。
- 返回false。
- 如果Type(x)是String,则如果x和y完全相同的字符序列(相应位置的长度和字符相同),则返回true。否则,返回false。
- 如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true。否则,返回false。
- 如果x和y引用同一个对象或它们引用相互连接的对象,则返回true(见13.1.2)。否则,返回false。
- 如果x为null且y未定义,则返回true。
- 如果x未定义且y为null,则返回true。
- 如果Type(x)为Number且Type(y)为String,则返回比较结果x == ToNumber(y)。
- 如果Type(x)为String且Type(y)为Number,则返回比较结果ToNumber(x)== y。
- 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y。
- 如果Type(y)为布尔值,则返回比较结果x == ToNumber(y)。
- 如果Type(x)是String或Number而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。
- 如果Type(x)是Object而Type(y)是String或Number,则返回比较结果ToPrimitive(x)== y。
- 返回false。
醇>
答案 2 :(得分:1)
你已经遇到了javascripts falsey和truthy值概念。在javascript中
Truthy: Something which evaluates to TRUE.
Falsey: Something which evaluates to FALSE.
这主要是合乎逻辑的。一(1)是真实的,零(0)是假的。任何类型的对象(包括函数,数组,RegExp对象等)总是真实的。确定某些事情是否真实的最简单方法是确定它不是假的。 JavaScript中只有五个falsey值:
undefined, null, NaN, 0, "" (empty string), and false.
因此,当您最终使用Abstract Equality Comparer比较两个falsey值时,它返回true。
要解决此问题,请使用===
运算符