理解javascript中的“|| {}”构造

时间:2012-08-27 17:01:56

标签: javascript scope redefinition

  

可能重复:
  What does “var FOO = FOO || {}” mean in Javascript?
  Javascript - Can you add condition to variable declaration

我认为这与范围界定有关,而不是重新定义范围。我在流行的javascript框架中看到了很多这样的内容:

var something = something || {};

是否与不小心重新定义顶级变量有关?

8 个答案:

答案 0 :(得分:5)

你是对的。如果变量已存在(我们的或不存在),请不要更改它。如果它不存在,让我们创建一个新的。

答案 1 :(得分:3)

var something = something || {};

可以在具有可能未设置参数的函数内部使用

    function doStuff( arg1, arg2, arg3 ) {
        arg2 = arg2 || {};
        arg3 = arg3 || arg1 + 2;
    };

这使得第二个和第三个参数在调用函数doStuff

时是可选的

答案 2 :(得分:2)

这将创建一个具有局部范围的新对象。如果外部something为null,false或undefined(或其他假的),则新变量将为空对象{}

答案 3 :(得分:2)

您不是要重新定义范围,而只是确保现有范围内存在变量。赋值语句可以理解为:

“如果something存在(并且不是undefinednull0false,请设置something = something(即,不执行任何操作)如果它不存在,则创建它并将其设置为等于空对象文字“

答案 4 :(得分:2)

此构造对覆盖现有数据非常有用。假设我们正在处理多个Javascript文件,并且我们希望在某个对象上共享一些数据。

a.js

var share = window.share = share || { };
share.thisIsA = true;

b.js

var share = window.share = share || { };
share.thisIsB = true;

如果我们有两个以上的文件并且我们异步加载这些文件(我们不能保证顺序),我们不会覆盖那个全局share对象,如果之前已经定义和填充的话。对于命名空间对象配置对象,这是一种非常常见的做法。

另一个非常常见的用例是创建默认值。例如

function foo( option ) {
    option = option || 'something';

    if( option === 'foobar' ) {} // ...
}

在那里,如果使用out参数调用函数,我们使用模式为我们的选项参数至少有一个已知和定义的值。例如,您可以在插件代码中经常看到它。

答案 5 :(得分:2)

与做的一样:

var something = ( something ) ? something : {};

其中( something )是对真值或假值的评价。如果truthy(something存在)它将等于自己,或者是一个空对象。

答案 6 :(得分:0)

看起来更像是确保某些东西是你可以挂东西的对象。设置默认值。

一旦调用var或将其设置为函数的参数,该范围内的所有实例都是新变量,则无法访问更高范围内的实例。

(function() {
  var something = 'foo';

  (function() {
    var something = something || 'bar';

    console.log(something);
  })();

  console.log(something);
})();

将输出

'bar'
'foo'

答案 7 :(得分:0)

javascript中的OR构造函数接近此函数

function or(a, b)
{
  if(a) return a;
  else return b;
}

当“a”的计算结果为true时,它甚至不检查“b”(也不执行它,但它不是函数情况)。此外,返回纯“a”而不将其更改为布尔。构造非布尔变量“ORed”计算结果为第一个变为布尔值true 。当某些东西不受支持时,它被广泛使用。

var functionDoingSomethingCrossBrowser = functionOnMsie 
                                      || functionEverywhereElse;

这与{}(新对象)运算符相结合,当你的“某些东西”在范围内不可用时,用空对象填充变量(很可能是未定义的,其计算结果为false)。