首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么要用!!强制一个变量在条件表达式中使用布尔值?

问为什么要用!!强制一个变量在条件表达式中使用布尔值?
EN

Stack Overflow用户
提问于 2013-09-06 00:49:31
回答 2查看 975关注 0票数 12

!!x将变量x的类型强制转换为布尔值,同时保持它的真实性或不足-- 见这个问题 --我对于在条件表达式中使用它有疑问。

在JS代码中,我曾见过几次!!在if条件下将变量强制为布尔类型

代码语言:javascript
复制
if(!!x) {
    x.doStuff();
}

其中的想法是在调用方法之前测试是否定义了x。

但是,在我自己的代码中,我总是用

代码语言:javascript
复制
if(x) {
    x.doStuff();
}

前提是,如果定义了x,条件将传递,如果x未定义,则不会传递条件。

所以我的问题是,在这个场景中,使用x !! 将强制到布尔值有什么意义? 这段代码做了什么这段代码不做的事情?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-06 01:02:01

在这个特定的上下文中,我要说,使用!!解释转换为布尔值与让if表达式自然转换为布尔值之间没有区别。我的意思是,if (x)将被解释为if (Boolean(x)),这与if (!!x)相同。

但是,如果要从函数返回值,例如,如果要实现arrayHasItems函数,可以这样实现它:

代码语言:javascript
复制
function arrayHasItems(arr) {
    return arr.length;
}

按照原样在if语句中使用该函数,因为从该函数返回的数值将转换为布尔值。但是,客户端代码希望函数返回一个布尔值,因此他可能会通过以下操作来检查条件:

代码语言:javascript
复制
if (arrayHasItems(arr) === true) {}

在这种情况下,它将失败,因为从arrayHasItems返回的结果是一个数字。因此,最好通过返回类似预期的布尔值来实现该函数。

代码语言:javascript
复制
function arrayHasItems(arr) {
    return !!arr.length;
}

编辑:

这带来了一个新的问题:为什么!!arr.length而不仅仅是arr.length >0

在所产生的结果之间没有任何差别,而且您甚至没有保存字节,因为这两个语句都占用了相同的字符。然而,我创建了一个测试用例,双否定似乎表现得更好,但它可能并不是所有浏览器都一致的。

票数 11
EN

Stack Overflow用户

发布于 2013-09-06 01:01:37

这与JavaScript型矫顽力有关。

通常,您希望检查对象是否为非空、未定义、非0等。

代码语言:javascript
复制
if (obj) {
  ...
}

但是,如果希望条件等于true或false,则可以在非布尔对象实例上使用!。下面是一个使用不进行类型强制的相等运算符===的示例。

代码语言:javascript
复制
var obj = {};

console.log(obj === true); // returns false
console.log(!obj === false); // returns true
console.log(!!obj === true); // returns true
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18648179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档