在Javascript中,为什么要写' b || (b = a);'?

时间:2016-05-11 17:37:01

标签: javascript

挖掘我的webGL项目中使用的glMatrix-0.9.5.min.js来源,我遇到了几行代码......

vec3.negate = function (a, b)
{
    b || (b = a); // <-- What exactly does this line do?

    b[0] = -a[0];
    b[1] = -a[1];
    b[2] = -a[2];

    return b;
};

不确定该代码在做什么,或者即使它是一个错误,因为它是第三方文件,但我也知道我并不完全掌握JavaScript作为一种语言的速度。 (例如,我刚刚学习了协议,因为这个。奇怪/有趣的概念。)

那是有效的,如果有的话,究竟是做什么的?

我的猜测是以下的简写,说&#39;如果&#39; b&#39;没有设置,将其设置为&#39;

if(!b)
{
    b = a;
}

也可以写成

if(!b) b = a;

我认为更清楚。但同样,我猜测这实际意味着什么/做了什么。可能是错的。

随访:

这两个if条件是否相等?

if(!b){ ... }

if(b == undefined){ ... }

我想知道是否存在“未定义”和“未定义”之间的并发症。以及定义的值&#39; null&#39;

4 个答案:

答案 0 :(得分:4)

更好的写作方式

b = b || a;

答案 1 :(得分:2)

这意味着:

b = b ? b : a; //or
b = b || a;

答案 2 :(得分:2)

这是简写 if (!b) { b = a }

让我们分解:

||的左侧,它正在声明b http://james.padolsey.com/javascript/truthy-falsey/

的真实性

如果b真实,那么||右侧的部分将不会被评估。如果b为假,那么b将被赋予a的值/引用。

答案 3 :(得分:1)

如果通过b运算符未定义a,则基本上将b的值设置为||,该运算符可用作a null-coalescing operator in Javascript

您可以根据if语句将其视为如下:

if(b == undefined){
   b = a;
}

偏好问题

关于什么是最有意义的,最终是一个偏好问题,但是你在本次讨论中找到的任何方法都可能是有效的选择:

// Explicitly using undefined in the comparison
if(b == undefined) { b = a }
// Using an if-statement (with a not) 
if(!b){ b = a }
// Using a ternary operator
b = b ? || a

关于您的后续行动

  

跟进:这两个if条件是否相等?

     

if(!b){...}

     

if(b == undefined){...}

     

我想知道是否有并发症   'undefined'和定义的'null'之间的值

是的,与空字符串相比可能存在差异,这会产生以下结果:

var b = '';
!b                // true
b == undefined    // false

区分nullundefined值可能会非常棘手,因为它有点超出了这个问题的范围,您可以考虑签出this related discussion on the topic,这通常建议使用{ {1}}而不是对if(b == null) { b = a; }

的检查