2011-11-21 49 views
4

可能重复:
What does var x = x || {} ;这在js“xin || {}”中做了什么?

我在JS这行,很简单,我相信,但我不知道最后一部分做了什么 - (xin || {})

var xin = (function (name) {return name;}(xin || {})); 

据我所知,xin是一个对象构造函数,所以现在我可以创建xin的对象。只是不太确定xin || {}做什么。请有人赐教,谢谢

+0

此问题已被多次询问。寻找现在的军人... –

+4

可能的重复[什么是var x = x || {};](http://stackoverflow.com/questions/3563153/)或[操作符在JavaScript的这一点做什么?](http://stackoverflow.com/questions/4863516/)或[什么这个Javascript行吗?](http://stackoverflow.com/questions/5643740/)采取你的选择(不,这是不容易的搜索像'javascript || {}') –

+0

@Matt球:只是想知道,你怎么让谷歌/ SO搜索字符?如果我搜索'javascript || {}那么谷歌似乎忽略了这四个符号。 – pimvdb

回答

2
xin || {} 

相同:或

xin ? xin : {}; 

,在较长的形式:

if(xin) { 
    return xin; 
} 
else { 
    return {}; 
} 

编辑:See linked duplicate question。 jAndy很好地说:

||是合乎逻辑的OR

表达

var x = x OR {}; 

应该变得更明显然后。

如果xfalsy值(如nullundefined0""),我们分配x空对象{},否则只要保持当前值。这样做的长版会是什么样子

var x = x ? x : {}; 
+0

我想你的意思是'(typeof(xin)!=“undefined”)? xin:new Object();' –

+0

@Samuel Liew - 不,它不是。 – Quentin

+0

@ 32bitkid - 这仍然是错误的,因为'||'不关心类型,只是事实。 – Quentin

2

它评估为xin如果xin是真的,否则使用一个新的对象。

+4

@downvoters,为什么? –

4

属性为name参数如果它不是false(或undefined或null)或新对象({}),变量的值为xin;

例如:

var name = xin || {}; 

这个被翻译成:

if(xin) 
    var name = xin; 
else 
    name = {}; 

在javascript中您可以使用条件运算符(||&&)来创建表达式。这里有一个例子:

typeof f === 'function' && ((arguments.length == 0 && f()) || f.apply({},arguments)) || g(); 

这个表达式可以转化为以下几点:

if(typeof f === 'function') 
    { 
     if(arguments.length == 0) 
      f(); 
     else 
      f.apply({},arguments); 
    } 
else 
    g(); 

无论如何,这仅仅是只用于演示目的,不应该使用有条件的经营者也因为内置大嵌套表达式这是非常难以理解的(因此很难维护)。

这种表达式通常用于初始化,当您不想覆盖某个值时(如果它已经存在)。一个很好的例子就是在多个js文件中使用一个命名空间。使用这种技术(var namespace = namespace || {};),您可以在不覆盖所有文件的情况下共享相同的命名空间。

+0

...或0,或者“”...... –

+0

对..任何“虚假”的东西 –

+1

@Martin - 是的。在函数完成之后,你认为把(表达式)放在什么位置? – Quentin

1
a || b 

OR操作符||短路。这意味着如果a为真,则a || b为真,因此它不会评估b。它返回a这是真的。如果a不是真,那么它返回b,即在这种情况下,如果b为假,则表达式为假,如果b为真,则为真。所以xin || {}返回xin如果xin为真,否则返回空对象{}

1

此:

var xin = (function (name) {return name;}(xin || {})); 

是相同的:

var xin = xin || {}; 

这可以重新表述为:

var xin = xin ? xin : {}; 

进一步简化,我们得到:

if(!xin) xin = {} 
1

如果没有xin对象,它会创建一个新对象,所以它会将新的(或现有的)xin传递给该函数。

这是人造命名空间的通用结构。