Javascript 在if语句之外使用| |(或运算符)
所以我正在阅读,我不明白下面的例子中OR操作符在做什么。更具体地说,在Jedy构造函数Javascript 在if语句之外使用| |(或运算符),javascript,Javascript,所以我正在阅读,我不明白下面的例子中OR操作符在做什么。更具体地说,在Jedy构造函数options | |(options={})基本上是在创建一个空对象吗?因此,绝地构装师的name属性将设置为“no name” function Jedi(options) { options || (options = {}); this.name = options.name || 'no name'; } Jedi.prototype.getName = function getNa
options | |(options={})如果没有参数传递给构造函数,code>基本上是在创建一个空对象吗?因此,绝地构装师的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();
};
另外,似乎有很多用JS做事情的速记方法。有没有好的资源或文章来解释这些是什么以及什么时候最好使用它们?Js逻辑运算符返回的不是true或false,而是true或false值本身。例如,在表达式x&&y中,如果x是falsy,则将返回它,否则将返回y。因此,运算符的真值表是正确的
| |也一样。这是指定函数默认值的好方法。Js逻辑运算符返回的不是真或假,而是真或假值本身。例如,在表达式x&&y中,如果x是falsy,则将返回它,否则将返回y。因此,运算符的真值表是正确的
| |也一样。这是一种指定函数默认值的好方法。操作符采用两个参数。如果第一个参数是“truthy”值,则返回第一个参数;否则,它将返回第二个。它也会短路;也就是说,如果第一个参数是真实的,它不会计算第二个参数。如果第二个参数是一个有副作用的表达式,这可能非常重要
语句options | |(options={})代码>依赖于此。如果options
为truthy,则不会计算赋值表达式。如果为falsy,则将计算第二个表达式
现在,这在函数上等价于语句options=options | |{}代码>。理论上,该语句可能会稍微慢一点,因为它会将选项
分配给自身,而不是简单地不分配任何内容。但是,这一点的影响可以忽略。操作符采用两个参数。如果第一个参数是“truthy”值,则返回第一个参数;否则,它将返回第二个。它也会短路;也就是说,如果第一个参数是真实的,它不会计算第二个参数。如果第二个参数是一个有副作用的表达式,这可能非常重要
语句options | |(options={})代码>依赖于此。如果options
为truthy,则不会计算赋值表达式。如果为falsy,则将计算第二个表达式
现在,这在函数上等价于语句options=options | |{}代码>。理论上,该语句可能会稍微慢一点,因为它会将选项
分配给自身,而不是简单地不分配任何内容。但是,这种效果可以忽略不计。您通常会在JavaScript插件中找到这段代码,它基本上意味着如果不存在具有名称选项的对象,则创建一个新的对象
如果您尝试访问以下选项上的属性:
如果options.name和options不存在,则会出现选项未定义的错误。但是使用此options | |(options={})代码,您可以始终确保您访问的JavaScript对象始终存在。
我会检查我是否可以为您提供一些链接,让您阅读
这是一个很好的支持链接
您经常会在JavaScript插件中找到这段代码,这基本上意味着如果不存在具有名称选项的对象,请创建一个新的对象
如果您尝试访问以下选项上的属性:
如果options.name和options不存在,则会出现选项未定义的错误。但是使用此options | |(options={})代码,您可以始终确保您访问的JavaScript对象始终存在。
我会检查我是否可以为您提供一些链接,让您阅读
这是一个很好的支持链接
这似乎是一种更简洁的方法,可以检查对象是否存在,如果不存在,则为其指定空对象的值。不过,这还不是很清楚。更明确一点的实施将是必要的
var options = options || {};
更好的是,使用es2015默认参数
function Jedi(options = {}) {
this.name = options.name || 'no name';
}
似乎这是一种更简洁的方法来检查对象是否存在,如果不存在,则为其指定空对象的值。不过,这还不是很清楚。更明确一点的实施将是必要的
var options = options || {};
更好的是,使用es2015默认参数
function Jedi(options = {}) {
this.name = options.name || 'no name';
}
在许多(大多数)编程语言中,运行时不必要的执行会被优化掉<代码>| |
如果二进制运算符的任一操作数的计算结果为true,则该运算符返回true。由于两个操作数都是串行计算的,如果第一个操作数的计算结果为true,则|
运算符的结果将为true。因此,不需要计算第二个操作数。如果第一个返回false,那么第二个将决定|
运算符的结果。这就是这里正在利用的行为
如果选项设置为非null值,则其计算结果将为true。因此,不要执行将其初始化为空对象的第二个操作数。在下一行中,如果options.name不为null,则将其初始化为“no name”在许多(大多数)编程语言中,运行时不必要的执行会被优化掉<代码>| |
如果二进制运算符的任一操作数的计算结果为true,则该运算符返回true。由于两个操作数都是串行计算的,如果第一个操作数的计算结果为true,则|
运算符的结果将为true。因此,不需要计算第二个操作数。如果第一个返回false,那么第二个将决定|
运算符的结果。这就是这里正在利用的行为
如果选项设置为非null值,则其计算结果将为true。因此,不要执行初始化的第二个操作数