JavaScript 中的 null 比较会产生啥强制?

Posted

技术标签:

【中文标题】JavaScript 中的 null 比较会产生啥强制?【英文标题】:What coerces from a null compare in JavaScript?JavaScript 中的 null 比较会产生什么强制? 【发布时间】:2017-09-21 16:04:02 【问题描述】:

如果我有这个 javascript

var someVar = someOtherVar == null;

someOtherVar 的哪些值会导致 someVar 为真?

注意:根据我的阅读,如果someOtherVarundefined,那么someVar 将是真的。但是我正在更改很多代码以使用这种比较方式,并且我想确保没有其他任何东西会导致 truthy 语句(除了nullundefined)。

【问题讨论】:

根据我的理解,您说 undefined 和 null 是唯一会在此处产生真实值的两个值是正确的。 既然大多数 linter 不喜欢someOtherVar == null,为什么不走明确的路线而不必担心“其他值”呢? var someVar = (someOtherVar === null || someOtherVar === undefined) @gforce301 - 因为我使用的是 typescript 2.0,并且由于某种超出我理解的原因,我无法再与 undefined 进行比较...(有关详细信息,请参阅***.com/questions/43594261/…) @Vaccano 我明白了。我以前必须这样做:var undefined; 然后你可以这样做if (callerParam != undefined || callerParam != null) 您上一个问题的duplicate 不是回答这个问题吗?我不明白你为什么又问基本相同的问题。 【参考方案1】:

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

nullundefined

The algorithm in the spec is relatively straight forward:

    如果Type(x)Type(y)相同,则返回执行Strict Equality Comparison x === y的结果。 如果 xnully未定义,则返回 true。 如果 xundefinedynull,则返回 true。 如果Type(x)是Number,Type(y)是String,返回比较结果x == ToNumber(y)。 如果Type(x)是String,Type(y)是Number,返回比较结果ToNumber(x) == y。 如果Type(x) 是布尔值,则返回比较结果ToNumber(x) == y。 如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)。 如果Type(x) 是字符串、数字或符号,而Type(y) 是对象,则返回比较结果x == ToPrimitive(y)。 如果Type(x) 是Object 并且Type(y) 是String、Number 或Symbol,则返回比较结果ToPrimitive(x) == y。 返回 false

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


JavaScript 中的 null 比较会产生什么强制?

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

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

【讨论】:

可靠的答案。当答案引用规范时喜欢它!【参考方案2】:

看起来确实只有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));

【讨论】:

以上是关于JavaScript 中的 null 比较会产生啥强制?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript笔记2

SQL查询结果中的NULL代表啥意思

JavaScript 之 对象

JSP 中的隐藏输入在将其传递给 servlet 时会产生 null

我啥时候应该在 JavaScript 中使用 delete vs 将元素设置为 null? [复制]

当值设置为 null 时,幕后会发生啥?