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

in Javascript, why would you write 'b || (b = a);'?

本文关键字:Javascript 为什么      更新时间:2023-09-26

挖掘我的 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 作为一种语言。(例如,我刚刚因此了解了协议。奇怪/有趣的概念。

那么这是否有效,如果是,它到底在做什么?

我的猜测是它是以下内容的简写,说"如果未设置'b',请将其设置为 a">

if(!b)
{
    b = a;
}

也可以只是写

if(!b) b = a;

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

随访:

这两个如果条件相等吗?

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

我想知道"未定义"和定义的"null"值之间是否存在复杂性

更好的写法是

b = b || a;

这意味着:

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

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

让我们分解一下:

||的左边,它断言b http://james.padolsey.com/javascript/truthy-falsey/的真实性

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

它基本上是通过 || 运算符将 b 的值设置为 a,如果b未定义,该运算符可以在 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(!b({ ... }

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

我想知道是否有并发症 在"未定义"和定义的"null"值之间

是的,空字符串可能会有所不同,这将产生以下结果:

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

区分null值和undefined值可能很棘手,并且由于它有点超出此问题的范围,因此您可以考虑查看有关该主题的相关讨论,该讨论通常建议使用if(b == null) { b = a; }而不是针对undefined进行检查。