5

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

var x = undefined && 4;

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

eval(x);
// undefined

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

// 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 变量声明中使用的好的上下文吗?你认为这是不好的做法吗?

谢谢!

4

4 回答 4

4

一般来说,你应该只使用这样的“快捷方式”,如果它使典型的 JavaScript 程序员的代码比替代方案易读。

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

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

var foo = bar && [];

不一样。例如, if baris NaN, thenfooNaN在后一种情况下,这在以后可能有点令人头疼。

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

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

于 2013-02-19T21:59:34.557 回答
1

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

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

于 2013-07-05T05:19:35.867 回答
0

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

于 2013-02-19T21:57:00.793 回答
0

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

于 2013-02-19T22:03:13.400 回答