什么是JavaScript中的null比较强制?

时间:2017-04-24 20:26:46

标签: javascript

如果我有这个JavaScript

var someVar = someOtherVar == null;

someOtherVar的哪些值会导致someVar成立?

注意:根据我的阅读,如果someOtherVarundefined,那么someVar将为真。但是我正在改变我的很多代码以使用这种比较方式,我想确保没有其他任何内容会导致 truthy 语句(除null和{{1}之外})。

2 个答案:

答案 0 :(得分:4)

  

someOtherVar的哪些值会导致someVar成为true

nullundefined

The algorithm in the spec is relatively straight forward

  
      
  1. 如果Type(x)Type(y)相同,则返回执行Strict Equality Comparison x === y的结果。
  2.   
  3. 如果x null y 未定义,请返回 true
  4.   
  5. 如果x 未定义y null ,请返回 true
  6.   
  7. 如果Type(x)为数字且Type(y)为字符串,则返回比较结果x == ToNumber(y)
  8.   
  9. 如果Type(x)为字符串且Type(y)为数字,则返回比较结果ToNumber(x) == y
  10.   
  11. 如果Type(x)为布尔值,则返回比较结果ToNumber(x) == y
  12.   
  13. 如果Type(y)为布尔值,则返回比较结果x == ToNumber(y)
  14.   
  15. 如果Type(x)是字符串,数字或符号且Type(y)是对象,则返回比较结果x == ToPrimitive(y)
  16.   
  17. 如果Type(x)是对象且Type(y)是字符串,数字或符号,则返回比较结果ToPrimitive(x) == y
  18.   
  19. 返回 false
  20.   

步骤1处理案例null == null。第2步和第3步处理案例null == undefinedundefined == null。步骤6和7处理其他值为布尔值的情况,因此您最终将数字与null进行比较。由于null不是对象,数字,字符串,布尔值或符号,因此不应用其他步骤,因此返回false(步骤10)。

  

JavaScript中的null比较会产生什么影响?

只有当另一个值是布尔时,它才会被强制转换为数字,因此您最终会比较0 == null1 == null ,两者都是false

在所有其他情况下,没有类型强制发生(没有任何强制被强制转移到nullnull没有被强制转换为任何其他数据类型。)

答案 1 :(得分:1)

看起来确实只有nullundefined

const arr = ['string', true, false, 0, null, undefined, NaN, {}, [], 4, -1, -0];

const r = arr.map((e,i) => {
    return { i, e, bool: e == null }
}).filter(e => e.bool);

// return elements which result in 'null'
// i: index inside initial array 'arr'

console.log(JSON.stringify(r, null, 2));