在 Javascript 中,几乎所有表达式(所有表达式?)都有一个“真实性”值。如果您将表达式放在需要 bool 值的语句中,它将计算为 bool 值等价物。例如:
let a = 'foo'
if (a) {
console.log('a is truthy!');
}
// Will print 'a is truthy!'.
在某些工作场所,通常会通过两次取反将这种情况下的表达式强制转换为实际的 bool 值:
let a = 'foo'
if (!!a) {
console.log('a is truthy!');
}
// Will print 'a is truthy!'.
我的问题:这仅仅是风格问题吗?是否纯粹是为了与阅读代码的人交流,我们真正认识到 a
不是 bool 值,但我们打算无论如何都对其进行评估?或者是否存在 a
的任何表达式或值,其中 if (a)
实际上计算为与 if (!!a)
不同的 bool 值?
最佳答案
a
和 !!a
的真实性将始终相同。
ToBoolean只是一个静态查找,不会在任何步骤执行任何用户定义的代码。使用!
应用 ToBoolean,并对结果取反。 if
还应用 ToBoolean,并获取结果。两者都没有做更多的事情。由于双重否定是身份,如果输入已经是 bool 值,ToBoolean 不会改变任何东西,它们将始终相同。
长话短说;在伪代码中,“ToBoolean(a) === ToBoolean(booleanNot(ToBoolean(booleanNot(ToBoolean(a)))))”。
请注意,可以在每次查找时改变变量,并生成可能令人困惑的测试,但实际上并不能反驳上述内容。 a
在第一次评估后被简单地改变了——无论是否使用 !!
都没有区别:
let x = 0;
let objectEnvironment = { get a() { return x++; } };
with(objectEnvironment){
if (a) console.log("truthy?");
if (!!a) console.log("double negated truthy?");
}
如果在上面的例子中交换使用 a
和 !!a
,输出不会改变。注意 with
在严格模式下已经是一个错误,不应该被使用。它仅用于说明 GetValue 可用于执行用户定义的代码。但是,无论是否使用逻辑非,它都是无法检测到的,因此为其设置条件不应该起作用。
关于javascript - 是否有任何 Typescript 表达式 `A` 使得 `A` 的真实性与 `!!A` 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51789173/