【问题标题】:What this code means ([1, 2, 3] || 0)[0]这段代码的含义 ([1, 2, 3] || 0)[0]
【发布时间】:2014-03-23 05:03:12
【问题描述】:

Closure(Script) implementation in JavaScript called "wisp" 有这个 sn-p:

(get [1 2 3] 1) ; => ([1, 2, 3] || 0)[0]

这意味着wisp代码在JavaScript中编译成这个:

([1, 2, 3] || 0)[0]

但是为什么|| 0 是一部分呢?

【问题讨论】:

  • 你想了解它的语法还是逻辑?
  • 这就是将 Wisp 语法转换为 JavaScript 以防止运行时异常的方式。如果表达式是(get x 1),而x 的值是undefined,那么在JavaScript 中会出错,但在ClojureScript (Wisp) 中不会。
  • 我是这么认为的。那我就没法给你解释了:) OR 一个 [1,2,3] 数组是没有意义的

标签: javascript


【解决方案1】:

我的猜测是,你可以给它发送一个变量,而不是写一个字面量数组:

(get x 1) ;

所以|| 0 用于xnullundefined

在 JavaScript 中,|| 不返回布尔值,如果它是“真”则返回第一个值,如果第一个是“假”则返回第二个。

0[0] 返回 undefined 就像 [][0] 一样。 0[] 少一个字符,所以这可能就是他们使用|| 0 而不是|| [] 的原因。

【讨论】:

【解决方案2】:

如果第一部分为空/未定义/假,通常会使用它来指定默认值。

例如,考虑以下代码:

var a = 1;
var b;

var x = a || 0;//if a is true use a, otherwise use 0
var y = b || 0;//if b is true use b, otherwise use 0

x 的值将是1,因为1 是一个真实值,因此成为使用的值。而y 将是0,因为b 的值是未定义的(错误值),所以使用0

在您的示例中,这是毫无意义的,因为[1, 2, 3] 将始终为真。但是,如果您使用的是变量,则可能不会分配该变量,因此将应用默认值。

Here is an example 显示不同类型的应用方式

Here is more information on Truthy and Falsey vaues

【讨论】:

  • 这毫无意义,但显然这是“wisp”被编译成的,可能是为了预防
【解决方案3】:

我不相信|| 0 会做任何事情。 || 运算符检查 null、未定义等,如果找到将返回表达式的右侧。

在此示例中,[1, 2, 3] 永远不会为空,因此永远不会返回 0

【讨论】:

    猜你喜欢
    • 2017-01-12
    • 2013-07-15
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    相关资源
    最近更新 更多