【问题标题】:How does the var FOO = FOO || {} idiom in Javascript work?var FOO = FOO || 如何{} 成语在 Javascript 中有用吗?
【发布时间】:2017-07-03 12:43:01
【问题描述】:

来自这个问题:What does "var FOO = FOO || {}" (assign a variable or an empty object to that variable) mean in Javascript?

我了解到var FOO = FOO || {} 本质上的意思是“如果 FOO 存在,则保持不变,否则将其设为空对象”。

但是怎么做呢?

这就是我解析这个语法的方式:

var FOO = (FOO || {})

所以:如果 FOO 存在且计算结果为布尔值 True,那么 (FOO || {}) 将返回 True,因此最终 FOO 将被完全覆盖,并且从现在开始将保持布尔值 True。

否则 (FOO || {}) 将返回到任何布尔值 {} 评估为。因为 {} 是一个空对象,总是评估为 True...

那么在任何情况下(FOO || {}) 都应该评估为 True,所以...

在任何可能的情况下,在评估 var FOO = FOO || {} 之后,FOO 应该保持微不足道的布尔值 True,而不管它之前持有什么。本质上,据我了解,var FOO = FOO || {} 应该等同于 var FOO = True

我的错误在哪里?

【问题讨论】:

标签: javascript


【解决方案1】:

所以:如果 FOO 存在并且计算结果为 True 的布尔值,那么 (FOO || {}) 将返回 True,因此最终 FOO 将被完全覆盖并从现在开始保持布尔值 True。

这是错误的,但如果你的背景是严格类型语言,那么下面几行会让你大吃一惊:)

表达式不返回布尔值。它返回可以计算为真的表达式。

这是相同的docs

如果可以转换为true则返回expr1;否则,返回 expr2。因此,当与布尔值一起使用时,||如果任一操作数为真,则返回真;如果两者都是 false,则返回 false。

逻辑运算符通常与布尔(逻辑)值一起使用。当它们存在时,它们返回一个布尔值。但是,&& 和 ||运算符实际上返回指定操作数之一的值,因此如果这些运算符与非布尔值一起使用,它们可能返回非布尔值。

文档中给出的不同示例可能有助于您理解上述词语。

o4 = false || (3 == 4)   // f || f returns false
o5 = 'Cat' || 'Dog'      // t || t returns "Cat"
o6 = false || 'Cat'      // f || t returns "Cat"
o7 = 'Cat' || false      // t || f returns "Cat"
o8 = ''    || false      // returns false

【讨论】:

    【解决方案2】:

    如果 FOO 存在且计算结果为 True 的布尔值,则 (FOO || {}) 将返回 True

    这不是|| 运算符在 JS 中的工作方式。

    正确的解释是:

    如果左侧为真值,则评估为左侧(即FOO),否则评估为右侧(即{})。

    var zero = 0;
    var one = 1;
    var two = 2;
    
    console.log(zero || two);
    console.log(one || two);

    【讨论】:

      【解决方案3】:

      JavaScript || 运算符返回表达式本身而不是布尔值。这是 Mozilla 文档中的参考资料

      如果可以转换为true则返回expr1;否则,返回 expr2.因此,当与布尔值一起使用时,||如果有任何一个,则返回 true 操作数为真。

      Reference :

      转换为布尔值True 取决于表达式的计算结果是否为Truthy 值。

      【讨论】:

        【解决方案4】:

        这是因为短路评估。

        短路求值表示,仅当第一个参数不足以确定表达式的值时,才执行或计算第二个参数:当 AND (&&) 函数的第一个参数求值为 false 时,整体值一定是假的;当 OR (||) 函数的第一个参数计算结果为 true 时,整体值必须为 true。

        但是如果 AND 函数的第一个参数计算结果为真,则必须执行或计算第二个参数以确定表达式的值;当 OR 函数的第一个参数计算结果为 false 时,必须执行或计算第二个参数以确定表达式的值。

        在 FOO 的情况下 || {};

        1. 如果 FOO 的计算结果为 TRUE,则返回 FOO,因为如果第一个参数为真,则无需计算第二个参数。
        2. 如果 FOO 的计算结果为 FALSE,则返回 {},因为需要计算第二个参数才能获得表达式的值。

        See here for more details..

        【讨论】:

        【解决方案5】:

        所以:如果 FOO 存在且计算结果为 True 的布尔值,则 (FOO || {}) 将返回 True

        概念的问题在于演员阵容。这里的对象没有被转换为布尔值,JS 保持不变。

        因此,如果定义了 FOO (FOO || {}) 将返回 FOO,如果未定义将返回 {}

        【讨论】:

        • 你答案中的最后一个是提问者的第二行:)
        猜你喜欢
        • 1970-01-01
        • 2023-03-17
        • 2015-05-06
        • 2017-09-20
        • 2011-03-24
        • 2019-02-10
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        相关资源
        最近更新 更多