代码之家  ›  专栏  ›  技术社区  ›  Solo

为什么操作员的行为是这样的?

  •  3
  • Solo  · 技术社区  · 6 年前

    为什么? _value foo 在第二个函数调用上?我花了一段时间才找到这个虫子。

    function doSomething(value) {
      console.log('should be:', value);
      const _value = value || Math.random() > 0.5 ? 'foo' : 'bar';
      console.log('actually is:', _value);
    }
    
    let values = ['foo', 'bar'];
    const first = doSomething(values[0]);
    const second = doSomething(values[1]);
    5 回复  |  直到 6 年前
        1
  •  3
  •   Poul Bak    6 年前

    为了更好地理解,我在测试代码周围加了一个括号:

    (value || Math.random() > 0.5)
    

    自从 value 总是被定义的( non null )条件为真,并分配 'foo' 为了 _value

    希望这能解释清楚。

        2
  •  2
  •   Alex Shesterov    6 年前

    因为表达式

    const _value = value || Math.random() > 0.5 ? 'foo' : 'bar';
    

    评估为:

    const _value =  (value || (Math.random() > 0.5)) ? 'foo' : 'bar';
    

    这个 条件运算符的优先级低于表达式中的其他运算符。

    value 是非空字符串,因此它的计算结果为 true 在布尔上下文中。因此,条件评估为 最后的结果总是 'foo' .

        3
  •  1
  •   dossy    6 年前

    因为:

    > 'bar' == true
    false
    

    所以:

    const _value = value || Math.random() > 0.5 ? 'foo' : 'bar';
    

    _value 将随机分配该值 'foo' 'bar' ,因为 value “酒吧” 其计算结果为 false ,所以or表达式的后半部分 || 被评估并分配给 γ值 .

        4
  •  1
  •   Володимир Бесяда    6 年前

    试试这个。

    const _value = value || (Math.random() > 0.5 ? 'foo' : 'bar');
    

    因为JS在你的代码中检查这样

    `if(value || Math.random() > 0.5){
    _value = 'foo';
    }else{
    _value ='bar'
    }`
    
        5
  •  0
  •   O. Jones    6 年前

    结构 const a = b || c 是常见的javascript速记。意思是:

    如果 b 不是 法西 分配给 a 。否则分配 c .

    也可以写 const a = b ? b : c;

    const a;
    if (b) a = b;
    else a = c;
    

    一个值是 法西 一般来说,如果它是空的或者值为零。