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

Using Logical AND in Javascript Variable Declarations

本文关键字:AND javascript 变量 声明      更新时间:2023-09-26

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

var x = undefined && 4;
// Evaluate to the first falsey value
// or else the last value.
eval(x);
// undefined

我了解如何评估该值(请参阅此 SO 答案(。我也了解它的姊妹||(有关精彩描述,请参阅此处(以及为什么使用以下表达式声明变量很有用:

// Some other variable
var y;
var x = y || 4;
// Evaluate to the first truthy value
// or else the last value.

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

> null || 4
  4
> 4 || null
  4
> null || undefined
  undefined
> undefined || null
  null
> true || 4
  true
> 4 || true
  4

至于&&

> null && 4
  null
> 4 && null
  null
> null && undefined
  null
> undefined && null
  undefined
> true && 4
  4
> 4 && true
  true

我们是否应该理解为:除非第一个值为真值,否则使用第一个值;如果是这样,请使用最后一个值?

我对使用编码快捷方式来最小化条件语句的使用感兴趣,我想知道我是否能够以某种方式使用这个。

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

scripts = !keepScripts && [];

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

谢谢!

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

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

var foo;
if(bar) {
    foo=[];
}

var foo = bar && [];

不一样。 例如,如果barNaN,那么foo将在后一种情况下NaN,这在以后可能会有点令人头疼。

由于有优化/最小化JavaScript的工具,你应该关注代码的可读性,这并不总是与简洁性是一回事。

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

我发现了一种特定情况,在这种情况下,在调试过程中使用&&很有用。

假设我们有一个变量x。有时x的值为 null,有时 x 是值为 {'foo':'bar'} 的对象。我们要编写一个表达式,返回 x.foo 的值(如果存在(。

但是,我们必须小心。调用不存在的对象的属性可能会导致以下结果:

> Uncaught TypeError: Cannot read property 'foo' of null

所以我们可以这样写:

x && x.foo

它执行以下操作:

  1. 如果x是一个对象并且x.foo存在,请给我们x.foo的值。

  2. 如果x是对象而x.foo不存在,则返回undefined

  3. 如果x为空,则返回 null

只要某处提到了x(即使x只是设置为 null 或未定义(,表达式就不应该破坏代码。

实际上,你不应该像Jquery那样经常使用&&operator,因为它总是有风险的代码。您可能会忘记自己做了什么,或者由于这种用法,您可能找不到错误。我个人认为这是一种不好的做法。您可能更喜欢使用,但代码变得不可读。我们开发人员应该考虑代码的可理解性和可读性。

嗯,这是一个常见的习语,但也许它会降低你的代码的可读性。所以,我的建议是,保持简单,即使这意味着更多的击键。