发布于 2013-09-06 01:02:01
在这个特定的上下文中,我要说,使用!!解释转换为布尔值与让if表达式自然转换为布尔值之间没有区别。我的意思是,if (x)将被解释为if (Boolean(x)),这与if (!!x)相同。
但是,如果要从函数返回值,例如,如果要实现arrayHasItems函数,可以这样实现它:
function arrayHasItems(arr) {
return arr.length;
}按照原样在if语句中使用该函数,因为从该函数返回的数值将转换为布尔值。但是,客户端代码希望函数返回一个布尔值,因此他可能会通过以下操作来检查条件:
if (arrayHasItems(arr) === true) {}在这种情况下,它将失败,因为从arrayHasItems返回的结果是一个数字。因此,最好通过返回类似预期的布尔值来实现该函数。
function arrayHasItems(arr) {
return !!arr.length;
}编辑:
这带来了一个新的问题:为什么!!arr.length而不仅仅是arr.length >0
在所产生的结果之间没有任何差别,而且您甚至没有保存字节,因为这两个语句都占用了相同的字符。然而,我创建了一个测试用例,双否定似乎表现得更好,但它可能并不是所有浏览器都一致的。
发布于 2013-09-06 01:01:37
这与JavaScript型矫顽力有关。
通常,您希望检查对象是否为非空、未定义、非0等。
if (obj) {
...
}但是,如果希望条件等于true或false,则可以在非布尔对象实例上使用!。下面是一个使用不进行类型强制的相等运算符===的示例。
var obj = {};
console.log(obj === true); // returns false
console.log(!obj === false); // returns true
console.log(!!obj === true); // returns truehttps://stackoverflow.com/questions/18648179
复制相似问题