我在js中有这些行,很简单我很确定,但我不确定最后一部分是做什么的 - (xin || {})
var xin = (function (name) {return name;}(xin || {}));
据我所知,xin是一个对象构造函数,所以现在我可以创建xin对象了。只是不太确定xin || {}
的作用。请有人赐教,谢谢
答案 0 :(得分:4)
如果变量name
的值不是false(或未定义或为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();
这个表达式可以翻译成以下内容:
var namespace = namespace || {};
无论如何,这仅用于演示目的,您不应该使用使用条件运算符构建的大型嵌套表达式,因为它非常难以理解(因此很难维护)。
当您不想覆盖特定值(如果已存在)时,通常会在初始化时使用此类表达式。一个很好的例子是在多个js文件中使用命名空间。使用此技术({{1}}),您可以在所有文件中共享相同的命名空间而不会覆盖它。
答案 1 :(得分:2)
如果xin是真实的,则评估为xin,否则使用新对象。
答案 2 :(得分:2)
xin || {}
与:
相同xin ? xin : {};
或更长的形式:
if(xin) {
return xin;
}
else {
return {};
}
编辑: See linked duplicate question。 jAndy很好地说:
||
是逻辑OR
。
表达式
var x = x OR {};
应该变得更加明显。
如果x
有虚假值(例如null
,undefined
,0
,""
),我们会指定{ {1}}空对象x
,否则只保留当前值。这个版本的长版似乎是
{}
答案 3 :(得分:1)
a || b
OR运算符||
被短路。这意味着如果a
为真,则a || b
为真,因此不会评估b
。它返回a
,这是真的。如果a
不为真,则返回b
,即在这种情况下,如果b
为false,则表达式为false,如果b
为真,则为true。如果xin || {}
为真,则xin
会返回xin
,否则会返回空对象{}
。
答案 4 :(得分:1)
此:
var xin = (function (name) {return name;}(xin || {}));
与此相同:
var xin = xin || {};
可以重新表达为:
var xin = xin ? xin : {};
进一步简化,我们得到:
if(!xin) xin = {}
答案 5 :(得分:1)
如果没有xin对象它会创建一个新的,那么,它会将新的(或现有的)xin传递给函数。
这是人工名称空间的常见结构。