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

时间:2013-02-19 21:50:54

标签: javascript

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

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.

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

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

谢谢!

4 个答案:

答案 0 :(得分:4)

一般情况下,你应该只使用这样的“快捷方式”,如果它使典型的JavaScript程序员的代码更多可读,而不是替代方案。

在考虑哪些内容更具可读性且不那么令人惊讶时,请考虑

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

var foo = bar && [];

不一样。例如,如果barNaN,那么foo将在后一种情况下为NaN,这可能稍后会让人感到头疼。

由于存在优化/最小化JavaScript的工具,因此您应该专注于代码的可读性,这与简洁性并不总是相同。

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

答案 1 :(得分: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

  4. 只要在某处提到x(即使x只是设置为null或undefined),表达式也不应该破坏代码。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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