所以我正在阅读Airbnb's JS styleguide,我不明白OR运算符在以下示例中正在做什么。更具体地说,在Jedy构造函数options || (options = {});
中,如果没有参数传递给构造函数,基本上是创建一个空对象吗?因此,Jedi构造函数的name
属性将设置为'no name'
?
function Jedi(options) {
options || (options = {});
this.name = options.name || 'no name';
}
Jedi.prototype.getName = function getName() {
return this.name;
};
Jedi.prototype.toString = function toString() {
return 'Jedi - ' + this.getName();
};
PS。似乎有很多简单的方法用JS做事。是否有任何好的资源或文章解释这些是什么以及什么时候最好使用它们?
答案 0 :(得分:6)
||
运算符有两个参数。如果第一个参数是" truthy" value,返回第一个参数;否则,它返回第二个。它也短路;也就是说,如果第一个参数是真实的,它就不会评估第二个参数。如果第二个参数是带副作用的表达式,这可能非常重要。
声明options || (options = {});
依赖于此。如果options
是真实的,则不会评估赋值表达式。如果它是假的,那么将评估第二个表达式。
现在,这功能等同于语句options = options || {};
。从理论上讲,该语句可能会稍微慢一点,因为它会将options
分配给自己,而不是简单地分配任何东西。但是,这种影响可以忽略不计。
答案 1 :(得分:0)
Js逻辑运算符返回的不是真或假,而是真正的或虚假的值本身。例如,在表达式x&& y,如果x是假的,那么它将被返回,否则将返回y。所以运算符的真值表是正确的。
对于||同样如此。这是指定函数默认值的好方法。
答案 2 :(得分:0)
您经常会在JavaScript插件中找到此代码,它基本上意味着如果名称选项的对象不存在则创建一个新的
如果您尝试访问类似的选项上的属性 options.name和options不存在然后它会给你一个错误,选项是undefined.But with this options || (options = {})代码,您始终可以确保您访问的JavaScript对象始终存在。 我将检查是否可以为您提供一些链接供您阅读。
这是一个很好的支持链接 How can I create an empty namespace object without overwriting another object with the same name?
答案 3 :(得分:0)
似乎这是一种更简洁的方法来检查对象是否存在,并为其分配空对象的值(如果不存在)。尽管如此,它并不是那么清楚。更清晰的实施将是
var options = options || {};
更好,使用es2015默认参数
function Jedi(options = {}) {
this.name = options.name || 'no name';
}
答案 4 :(得分:0)
在许多(大多数)编程语言中,在运行时不必要的执行被优化掉。 ||
二元运算符如果其任一操作数计算为true,则返回true。由于两个操作数都是连续评估的,如果第一个操作数的计算结果为true,则||
运算符的结果将为真。所以不需要评估第二个操作数。如果第一个返回false,则第二个决定||
运算符的结果。这是在这里被利用的行为。
如果options设置为非null值,则它将计算为true。因此,不要执行第二个操作数,将其初始化为空对象。如果options.name不为null,则在下一行,然后将其初始化为' no name'