2011-11-30 119 views
3

我有这样的代码在JavaScript:这段JavaScript代码在做什么?

var JSON; 
JSON||(JSON={}); 

你能告诉一下这个代码是干什么的?

+0

如果是这样的片段完全相同,那么它是做'VAR JSON = {}的很婉转地;',它会创建一个新的对象,并将其分配给变量'JSON'。 – Ryan

回答

1

它的作用域是一个变量,称为JSON,然后使用||运算符的短路属性为空分配一个空对象,除非该变量具有真值。

+0

“truthy” - 大声笑! – BentOnCoding

+2

@Robotsushi - 这就是它所谓的。这些也是错误的。 –

+0

@Robotsushi:这不是官方任期吗? – Ryan

0

它只是使JSON一个空的对象。

0

我认为这是说:如果var'JSON'为null,则创建一个空的javascript obect。

+0

不。它测试它是否为'null'或'undefined'或任何其他falsy值。如果它是分配一个JavaScript对象。这里没有JSON(除了名称变量很少)。 – Quentin

4

var JSON正在声明一个全局(或其他范围)变量。

JSON||(JSON={});首先检查是否JSON评估为true或false,如果为false,则JSON设置为空对象;

+0

它不检查它是否有价值。它可能有'false','0','''''或其他许多事物,并且仍然会分配一个空对象。 – Quentin

+0

@Quentin - oops“有一个值,如果不是”应该是“评估为真或假,如果为假” – mrk

2

正是在这种情况下相当无意义,

var JSON; 

创建一个名为JSON

第二部分变量,

JSON||(JSON={}); 

相当于

if(!JSON){ 
    JSON = {}; 
} 

这些都可以跳过,写为

var JSON = {}; 
+0

如果您跳过测试,那么您将总是覆盖它所包含的任何内容。在任何情况下,如果有人打算检查变量是否具有真值,那通常不是一件好事。 – Quentin

+0

@Quentin只适用于集合之前有更多的代码,而没有。 – Andrew

+0

- 我认为假设问题中的代码代表完整的程序可能是不安全的。 – Quentin

0

该代码被执行以下操作:

  1. 声明变量JSONJSON === undefined
  2. 分配一个空对象({})到JSON如果JSON是一个虚假的价值。

Falsey值包括:nullundefined""(空字符串),0NaNfalse

JSON已经经由var JSON被声明,所以被设定为undefined,这意味着操作的右手侧JSON||...执行。换句话说,所有的代码实现的是:

var JSON = {}; 
+1

它范围变量。它可能来自其他地方的价值。 – Quentin

+0

@Quentin,正好 - 值必须是'undefined',因为变量是通过'var JSON'声明的。如果它在该声明之前有另一个值,那么它就没有关系,因为'JSON || ..'在那之后运行。 – James

+0

- 不,var'被托管并且不会重置具有前面定义的值的变量。我见过:'function(foo){var foo ...}'很多次。 'var'是多余的,因为参数自动在本地作用域。 – Quentin