什么构造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
