理解{}”;构造

Understanding the "|| {}" construct in javascript

本文关键字:构造 理解      更新时间:2023-09-26

可能重复:
什么是“var FOO=FOO||{}rdquo;在Javascript中是什么意思
Javascript-你能为变量声明添加条件吗

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

var something = something || {};

这是因为没有意外地重新定义一个顶级变量吗?

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

var something = something || {};

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

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

这使得当您调用函数doStuff 时,第二个和第三个参数是可选的

这将创建一个具有本地作用域的新对象。如果外部something为null、false或undefined(或以其他方式为falsy),则新变量将为空对象{}

您不是在重新定义范围,您只是在确保一个变量存在于现有范围内。赋值语句可以读作:

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

这与执行相同

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

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

此构造对于不覆盖现有数据非常有用。假设我们正在处理多个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' ) {} // ...
}

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

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

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

(function() {
  var something = 'foo';
  (function() {
    var something = something || 'bar';
    console.log(something);
  })();
  console.log(something);
})();

将输出

'bar'
'foo'

javascript中的OR构造函数接近这个函数

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

当"a"计算为true时,它甚至不检查"b"(也不执行它,但它不是函数情况)。此外,它返回纯"a",而不将其更改为布尔值。非布尔变量"ORed"的构造计算为第一个变为布尔true的值。它被广泛用于某些无法支撑的地方。

var functionDoingSomethingCrossBrowser = functionOnMsie 
                                      || functionEverywhereElse;

当你的"something"在作用域中不可用时(很可能是未定义的,计算结果为false),这个与{}(新对象)操作符相结合的运算符用空对象填充变量。