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
为真?
注意:根据我的阅读,如果someOtherVar
是undefined
,那么someVar
将是真的。但是我正在更改很多代码以使用这种比较方式,并且我想确保没有其他任何东西会导致 truthy 语句(除了null
和undefined
)。
【问题讨论】:
根据我的理解,您说 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
?
仅null
和undefined
。
The algorithm in the spec is relatively straight forward:
如果
Type(x)
与Type(y)
相同,则返回执行Strict Equality Comparisonx === y
的结果。 如果x
为 null 且y
为 未定义,则返回 true。 如果x
为 undefined 且y
为 null,则返回 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 == undefined
和 undefined == null
的情况。第 6 步和第 7 步处理另一个值为布尔值的情况,因此您最终将一个数字与null
进行比较。由于null
不是对象、数字、字符串、布尔值或符号,其他步骤都不适用,因此返回false
(步骤10)。
JavaScript 中的 null 比较会产生什么强制?
只有当另一个值是 boolean 时,它才会被强制转换为 number,因此您最终会比较 0 == null
或 1 == null
,这两者是false
。
在所有其他情况下,不会发生类型强制(没有任何内容被强制转换为 null
,null
也不会被强制转换为任何其他数据类型)。
【讨论】:
可靠的答案。当答案引用规范时喜欢它!【参考方案2】:看起来确实只有null
和undefined
:
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 比较会产生啥强制?的主要内容,如果未能解决你的问题,请参考以下文章
JSP 中的隐藏输入在将其传递给 servlet 时会产生 null