是否有任何打字稿表达式'A`使得'A`的真实性与`!! A`不同?

Mar*_*uer 6 javascript typescript

在Javascript中,几乎所有表达式(所有表达式?)都具有"真实性"值.如果将表达式放在需要布尔值的语句中,它将计算为布尔等价物.例如:

let a = 'foo'

if (a) {
  console.log('a is truthy!');
}
// Will print 'a is truthy!'.
Run Code Online (Sandbox Code Playgroud)

在某些工作场所,通常通过两次否定它来将这种情况下的表达式强制转换为实际的布尔值:

let a = 'foo'

if (!!a) {
  console.log('a is truthy!');
}
// Will print 'a is truthy!'.
Run Code Online (Sandbox Code Playgroud)

我的问题:这只是风格问题吗?它纯粹是为了与读取我们真正认识到a的不是布尔值的代码的人沟通,但我们打算如此评估它?还是存在任何表达式或值a,其中if (a)实际的计算结果比不同的布尔值if (!!a)

ASD*_*rte 3

a和的真实性!!a永远是一样的。

ToBoolean只是静态查找,并且在任何步骤中都不执行任何用户定义的代码。使用!适用于 ToBoolean,并对结果求反。if也应用 ToBoolean 并获取结果。两者实际上并没有做更多的事情。由于双重否定是恒等式,并且如果输入已经是布尔值,则 ToBoolean 不会改变任何内容,因此它们将始终相同。

TL;博士; 在伪代码中,“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?");
}
Run Code Online (Sandbox Code Playgroud)

如果在上面的示例中交换a和的使用!!a,输出不会改变。请注意,这with在严格模式下已经是一个错误,不应使用。它仅用于表明 GetValue 可用于执行用户定义的代码。但是,无论是否使用逻辑 not,它都是无法检测到的,因此为其设置条件应该不起作用。