gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 05:20:49 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com