【问题标题】:Using Logical AND in Javascript Variable Declarations在 Javascript 变量声明中使用逻辑与
【发布时间】:2013-02-19 21:50:54
【问题描述】:

我对使用&& 声明变量的实际应用感兴趣,如下所示:

var x = undefined && 4;

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

eval(x);
// undefined

我了解如何评估价值(请参阅this SO answer)。我也了解它的姐妹||(有关详细说明,请参阅here)以及为什么使用以下表达式声明变量会很有用:

// 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核心源码的line 472找到了这种编码方式的例子:

scripts = !keepScripts && [];

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

谢谢!

【问题讨论】:

  • 我个人建议不要这样做:它真的不太可读。在不知道这种行为的情况下,我预计像 !keepScripts && [] 这样的东西会评估为 false,这可能会导致一些难以追踪的错误。
  • 我会编写普通的条件语句,然后使用高级压缩器,例如 Google Closure Compiler 来压缩代码。

标签: javascript


【解决方案1】:

一般来说,你应该只使用这样的“快捷方式”,如果它使典型的 JavaScript 程序员更具可读性,而不是替代方法。

在考虑什么更易读且不那么令人惊讶时,请考虑

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

var foo = bar && [];

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

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

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

【讨论】:

    【解决方案2】:

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

    假设我们有一个变量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 或未定义),表达式就不应破坏代码。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-22
          • 2011-12-12
          • 2021-12-14
          • 1970-01-01
          • 2016-11-25
          • 1970-01-01
          • 1970-01-01
          • 2012-07-02
          相关资源
          最近更新 更多