这在js“xin || {}”中有什么作用?

时间:2011-11-21 16:05:05

标签: javascript object

  

可能重复:
  What does var x = x || {} ;

我在js中有这些行,很简单我很确定,但我不确定最后一部分是做什么的 - (xin || {})

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

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

6 个答案:

答案 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虚假值(例如nullundefined0""),我们会指定{ {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传递给函数。

这是人工名称空间的常见结构。