我不明白为什么此代码段中的最后一行返回false。和上面的那行不一样吗?
const Statuses = Object.freeze({
UNKNOWN : 0,
OK : 1,
ERROR : 2,
STOPPED : 3
});
class myStatus extends Object{
constructor() {
super();
this.status_id = Statuses.UNKNOWN;
}
valueOf(){
return this.status_id;
}
getStatus(){
return this.status_id;
}
}
var a = new myStatus();
a.status_id = Statuses.ERROR;
console.log(a == Statuses.ERROR);
console.log(a.getStatus() === Statuses.ERROR);
console.log(a.valueOf() === Statuses.ERROR); //Isn't this the same as the line bellow?
console.log(a === Statuses.ERROR); //Why is this false but the rest are true?
http://jsbin.com/ritumesegi/edit?js,console
我得到a == Statuses.ERROR
是真的,但其他人不应该给出相同的结果吗?特别是最后的2.不是
a === Statuses.ERROR
同样的
a.valueOf() === Statuses.ERROR
使用===
时,这两个值都不会隐式转换为其他任何值。
所以在你的片段中,STATUSES.ERROR
只是原始数值2
,而a
是myStatus
类的一个实例。由于在与===
比较时没有转换,因此它们不相同并不奇怪,因为一个是原始值而另一个不是。
仅仅因为它们的类型不同,请查看以下内容:
console.log(typeof(Statuses.ERROR)); // "number"
console.log(typeof(a) ); // "object"
区别:
==
仅评估价值观。
===
评估价值观和类型。
a是myStatus对象,所以是!== 2,因为它是一个对象。
a.valueOf()是2。