javascript中的平等问题

时间:2017-12-19 23:23:09

标签: javascript

我不明白为什么此代码段中的最后一行返回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

3 个答案:

答案 0 :(得分: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 :(得分:1)

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

a.valueOf()是2。

答案 2 :(得分:1)

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

因此,在您的代码段中,2只是原始数字值a,而myStatus===类的实例。由于在与<div id="sidebar-profile" class="sidebar"> <div> <h4> <?php $current_user = wp_get_current_user(); echo $current_user->user_login; ?> </h4> </div> <?php dynamic_sidebar( 'profile' ); ?> </div> 比较时没有转换,因此它们不相同并不奇怪,因为一个是原始值而另一个不是。