javascript - 是否有任何 Typescript 表达式 `A` 使得 `A` 的真实性与 `!!A` 不同?

标签 javascript typescript

在 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/

相关文章:

Angular 和 p5.js - p5.loadSound 不是函数

javascript - 在同一对象的函数中访问变量

javascript - ReactJS onClick ReactCSSTransitionGroup 动画

javascript - 使用javascript获取日期字符串的日期

javascript - jQuery 滑动/淡入淡出功能

javascript - 无法通过 <%= variable %> 访问 JS/jQuery 中的变量

javascript - 延迟隐藏下拉菜单

typescript 泛型 - "extends object"毫无意义吗?最佳做法是什么?

typescript - 是否可以构建自定义内部类型?

javascript - 如何仅在存在 DOM 元素时加载 Angular2 应用程序