【问题标题】:Why is == working but not === if the console.log is null?如果 console.log 为空,为什么 == 有效但 === 无效?
【发布时间】:2017-05-29 10:56:52
【问题描述】:

一般的javascript问题请。

我有一个按钮,可以标记用户是否想将帖子分享到 Facebook。单击时,它将检查用户是否已经拥有 facebook 令牌。还有,token是否有效。

如果其中一个不正确,它将提示用户登录 facebook。

现在代码运行良好。但是很长一段时间我都在做 if(facebookToken === null)

它忽略了它。直到我切换到 == 才起作用。

这是为什么?我正在控制台记录它,它返回为空

这是我的有效代码:

  shareToFacebookPress() {
    const timeNow = Date.now();
    const facebookToken = this.props.facebook_token;
    console.log(facebookToken);
    const facebookExpiry = this.props.facebook_token_expiry * 1000;
    console.log(facebookExpiry);
    if (facebookToken == null || facebookExpiry < timeNow) {
      console.log("doesn't exist");
      this.props.signInFacebook();
    } else {
      this.state.shareToFacebook ?
      this.setState({ shareToFacebook: false }) :
      this.setState({ shareToFacebook: true });
    }
  }

当然=== 直接比较,所以如果我在控制台登录值并返回null,那么if(value === null) 肯定应该等于true?

这似乎是不可能的。这里发生了什么?

如果value 控制台记录到null 而我记录到if(value === null) 为什么不等于true

如果是控制台日志null,那肯定是它?

它不会以"null" 的形式返回,如果我使用的是==,这将是有意义的

【问题讨论】:

  • 你确定是null? IIRC,比较value == null 时给出true 的唯一值是nullundefined
  • yup 100% 数据库中它的记录为零,因此它是控制台日志null
  • null === undefined // false null == undefined // true
  • console.log(typeof facebookToken, facebookToken, !!facebookToken, facebookToken === null, facebookToken == null, facebookToken === void 0, facebookToken == void 0) 并在此处发布结果。
  • @bloppit 控制台似乎显示未定义为空。试试console.log(undefined)。这是在网络浏览器上吗?尝试另一个。

标签: javascript if-statement null undefined


【解决方案1】:

null 打印的console.log(null) 本身只是一个文字表达式,per MDN description of nullnull 不是一个全局对象的属性,就像你上面提到的value,而是一个对象。实际上,您在上面使用=== 所做的是将对象与值(或属性)进行比较。因此 value 和 null 的类型不同,这导致if(value === null) 变成false。但是,当使用== 检查if(value == null) 时,会在检查之前执行类型转换。所以valuenull 在检查之前保持相同的类型,允许您比较valuenull。不过需要注意的一点是,== 在检查相等性时非常宽松,很容易出错。

【讨论】:

  • 使用Abstract Equality Comparison algorithm 中的规则使类型相等后,评估与Strict Equality Comparison algorithm 相同。
  • -1,对不起。您似乎误解了“类型”一词。 null 的类型是 object。从语法上讲,null 是一个字面量,但该字面量表示一个值,并且属性绝对有可能采用该值。 (例如,运行window.foo = null 后,window.foo === null 将变为true。)
  • 我看到你已经编辑了你的答案,但仍然是错误的,出于同样的原因。
猜你喜欢
  • 2018-06-15
  • 2014-02-28
  • 1970-01-01
  • 2022-01-12
  • 2020-05-14
  • 2020-10-07
  • 2023-03-30
  • 2013-05-13
相关资源
最近更新 更多