什么构造x = x
我正在调试一些JavaScript,并且无法解释这个||
呢?
function (title, msg) {
var title = title || 'Error';
var msg = msg || 'Error on Request';
}
有人可以给我一个提示,为什么这个人正在使用var title = title || 'ERROR'
var title = title || 'ERROR'
? 我有时也会在没有var
声明的情况下看到它。
这意味着title
参数是可选的。 所以如果你调用没有参数的方法,它将使用默认值"Error"
。
这是写作的简写:
if (!title) {
title = "Error";
}
这种布尔表达式的简写技巧在Perl中也很常见。 用表达式:
a OR b
它的计算结果为true
如果任a
或b
为true
。 所以如果a
是真的,你根本不需要检查b
。 这被称为短路布尔评估,因此:
var title = title || "Error";
基本上检查title
评估是否为false
。 如果是,则“返回” "Error"
,否则返回title
。
什么是双管操作符( ||
)?
双管道运算符( ||
)是逻辑OR
运算符 。 在大多数语言中,它的工作原理如下:
false
,它会检查第二个值。 如果为true
,则返回true
,如果为false
,则返回false
。 true
,则无论第二个值是什么,它总是返回true
。 所以基本上它像这个函数一样工作:
function or(x, y) {
if (x) {
return true;
} else if (y) {
return true;
} else {
return false;
}
}
如果你还不明白,看看这张表:
| true false
------+---------------
true | true true
false | true false
换句话说,只有两个值都是假的,它才是错误的。
在JavaScript中它有什么不同?
JavaScript有点不同,因为它是一种松散类型的语言 。 在这种情况下,这意味着您可以使用||
运算符的值不是布尔值。 虽然没有任何意义,但您可以使用此运算符,例如函数和对象:
(function(){}) || {}
那里会发生什么?
如果值不是布尔值,则JavaScript将隐式对话转换为布尔值 。 这意味着如果该值为falsey(例如0
, ""
, null
, undefined
(另请参阅JavaScript中的所有falsey值)),它将被视为false
; 否则视为true
。
所以上面的例子应该是true
,因为空函数是真实的。 那么,它不会。 它返回空函数。 这是因为JavaScript的||
操作员不像我在开始时写的那样工作。 它的工作原理如下:
惊讶吗? 其实,这是“兼容”与传统||
运营商。 它可以写成以下函数:
function or(x, y) {
if (x) {
return x;
} else {
return y;
}
}
如果你传递一个真值作为x
,它返回x
,即真值。 所以如果你稍后在if
子句中使用它:
(function(x, y) {
var eitherXorY = x || y;
if (eitherXorY) {
console.log("Either x or y is truthy.");
} else {
console.log("Neither x nor y is truthy");
}
}(true/*, undefined*/));
你会得到"Either x or y is truthy."
。
如果x
是虚假的, eitherXorY
就是y
。 在这种情况下,你会得到"Either x or y is truthy."
如果y
真的是真的; 否则你会得到"Neither x nor y is truthy"
。
实际的问题
现在,当你知道如何||
运营商的工作,你可以自己做出什么x = x || y
x = x || y
意思是 如果x
是真的, x
被分配给x
,所以实际上什么也没有发生; 否则y
被分配给x
。 它通常用于在函数中定义默认参数。 但是,它通常被认为是一种糟糕的编程习惯 ,因为它会阻止您将错误的值(不一定是undefined
或null
)作为参数传递。 考虑下面的例子:
function badFunction(/* boolean */flagA) {
flagA = flagA || true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
它看起来很有效。 然而,如果你传递false
作为flagA
参数会发生什么(因为它是布尔型的,即可以是true
或false
)? 这将成为true
。 在这个例子中,没有办法将flagA
设置为false
。
明确检查flagA
是否undefined
将是一个更好的主意,如下所示:
function goodFunction(/* boolean */flagA) {
flagA = typeof flagA !== "undefined" ? flagA : true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
虽然时间更长,但它始终有效,而且更容易理解。
你也可以使用默认函数参数的ES6语法,但请注意,它在旧版浏览器(如IE)中不起作用。 如果你想支持这些浏览器,你应该使用Babel来编译你的代码。
另请参阅MDN上的逻辑运算符。
如果标题未设置,请使用'ERROR'作为默认值。
更通用的:
var foobar = foo || default;
读取:将foobar设置为foo
或default
。 你甚至可以多次连锁:
var foobar = foo || bar || something || 42;
链接地址: http://www.djcxy.com/p/52187.html