在Javascript变量声明中使用逻辑AND

chr*_*gen 5 javascript

我对使用&&这样的声明变量的实际应用感兴趣:

var x = undefined && 4;

// Evaluate to the first falsey value
// or else the last value.

eval(x);
// undefined
Run Code Online (Sandbox Code Playgroud)

我理解如何评估价值(参见本答复).我也理解它的姐妹||(参见这里有一个很好的描述)以及为什么用以下表达式声明变量是有用的:

// Some other variable
var y;

var x = y || 4;

// Evaluate to the first truthy value
// or else the last value.
Run Code Online (Sandbox Code Playgroud)

实际上:使用第一个值,除非第一个值为false; 如果是这样,请使用最后一个值.我们可以||在浏览器控制台中演示这个特性:

> null || 4
  4
> 4 || null
  4

> null || undefined
  undefined
> undefined || null
  null

> true || 4
  true
> 4 || true
  4
Run Code Online (Sandbox Code Playgroud)

至于&&:

> null && 4
  null
> 4 && null
  null

> null && undefined
  null
> undefined && null
  undefined

> true && 4
  4
> 4 && true
  true
Run Code Online (Sandbox Code Playgroud)

我们应该这样做:使用第一个值,除非第一个值是真实的; 如果是这样,使用最后一个值?

我有兴趣使用编码快捷方式来最小化条件语句的使用,我想知道我是否能以某种方式使用它.

我在jQuery核心源的第472行中找到了这种编码方法的一个例子:

scripts = !keepScripts && [];
Run Code Online (Sandbox Code Playgroud)

所以问题是:任何人都可以描述&&在javascript变量声明中使用的良好上下文吗?你认为这是不好的做法吗?

谢谢!

der*_*ekv 4

一般来说,只有当这样的“快捷方式”使代码对于典型的 JavaScript 程序员来说比其他方式更具可读性时,才应该使用它。

当考虑什么更具可读性且不那么令人惊讶时,请考虑

var foo;
if(bar) {
    foo=[];
}
Run Code Online (Sandbox Code Playgroud)

var foo = bar && [];
Run Code Online (Sandbox Code Playgroud)

不一样。例如,如果baris NaN,则 thenfoo将是NaN后一种情况,这可能会在以后有点令人头疼。

由于有一些工具可以优化/最小化 JavaScript,因此您应该关注代码的可读性,这并不总是等同于简洁。

假设您连续有几个这样的重复初始化,所有初始化都依赖于不同的变量(以便它们不能包装到单个条件中),但遵循相同的逻辑公式。在这种情况下,一旦读者在心里解析了公式的含义,他们就可以快速扫描所有实例并看到每个实例之间的差异。在这种情况下,您不是依赖大多数 JavaScript 程序员熟悉的约定(例如var foo = some_opt || {}),而是创建一个本地化约定,读者必须专门针对此文件进行学习。即使在这种情况下,我还是建议仔细考虑,这可能不值得。