javascript中的平等问题

问题描述 投票:0回答:3

我不明白为什么此代码段中的最后一行返回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
javascript
3个回答
1
投票

使用===时,这两个值都不会隐式转换为其他任何值。

所以在你的片段中,STATUSES.ERROR只是原始数值2,而amyStatus类的一个实例。由于在与===比较时没有转换,因此它们不相同并不奇怪,因为一个是原始值而另一个不是。


4
投票

仅仅因为它们的类型不同,请查看以下内容:

console.log(typeof(Statuses.ERROR)); // "number"
console.log(typeof(a) ); // "object"

区别: ==仅评估价值观。 ===评估价值观和类型。

参考: https://www.w3schools.com/jsref/jsref_operators.asp

http://jsbin.com/jaquzikonu/edit?js,console


1
投票

a是myStatus对象,所以是!== 2,因为它是一个对象。

a.valueOf()是2。

© www.soinside.com 2019 - 2024. All rights reserved.