javascript - js 中 if(a) if(a == true) if(!!a) 的区别
PHP中文网
PHP中文网 2017-04-11 09:11:37
[JavaScript讨论组]

如题

if(a){
    //...
}

if(a == true){
    //...
}

if(!!a){
    //...
}

问:

  • 这三种写法有什么逻辑上的区别吗?

  • 这三种写法在实际编程中各有什么好处?

PHP中文网
PHP中文网

认证0级讲师

全部回复(11)
PHPz

第一种和第三种没区别,第三种就是类型转化。
第二种是计算a==true的返回值,。
值等于是比较值的。
所以浏览器会先将运算符两边的变量/表达式的值先算出来,并转换成同类型(基本类型)的形式进行比较。
像这种比较运算符或者一些基本概念问题,我有一个推荐:
JavaScript 5
http://ecma-international.org...
JavaScript 6
http://ecma-international.org...
你可以到对应版本的JavaScript中寻找你需要的解释。
回到本题,先来看一下 == 运算符它的原理吧:

这个就是浏览器在遇到 == 时采取的操作步骤,我来翻译一下是什么意思:

==运算符是这样被计算的:

1 让左引用(lref: left reference)成为正在计算的表达式左侧的值。
2 将左值(lval:left value)赋值为 GetValue(lval)。
3 让右引用(rref: right reference)成为正在计算的表达式右侧的值。
4 将右值(rval:left value)赋值为 GetValue(rval)。
5 返回执行rval == lval 抽象值比较的结果(参见 11.9.3)

那么在11.9.3,又是怎么规定abstract equality comparison 的呢?

这就比较长了,但是也很详细。这就不一条一条的解释了。
至于上面有人提到的 2 == true 是false,来看看是怎么回事
直接看第七条就好了:
If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
那么结果就变成了:
2 == 1
所以就错了。。。。
当然,三种形式的优缺点我感觉是没有。。
你也可以参考别人的答案。

ringa_lee

我个人只会用第一种方法、

理论上来讲、他们三个的结果应该是一样的

但是从代码的优雅和美观上、我选择一

天蓬老师

第一种if(a)
a为以下值时转换为false

false
undefined
null
0
-0
NaN
""

第二种if(a==true)
true转化为1,再和a比较
第三种if(!!a)
感觉和第一种一样啊

迷茫

!!用来强制转化数据为布尔类型,比如:

 return !!elements.className.match(new RegExp('(\\s|^)' + cName + '(\\s|$)'));
大家讲道理

没有区别。。。凑字数

大家讲道理

有区别的,楼主请看

var a = 'aaa';

if(a){
    console.log(true)
}else{
    console.log(false)
}
VM519:1 true

if(a == true){
    console.log(true)
}else{
    console.log(false)
}
VM541:1 false
伊谢尔伦

个人认为,其实第三种在实际使用中,一般返回或者强制类型的时候用的比较多,就是无论a是什么类型,!!a的结果一定是 boolean 类型

PHPz

if(a)通常用作对象检测,在javascript里几乎所有的东西(包括各种方法在内)都可以被当作对象来对待,例如if(!document.getElemetById)return false; 可以判断浏览器是否支持该方法,如果不支持就退出,这个在平稳退化中经常用到。if(a == true)会把true强制转化1, 然后再和a进行比较,如果a的值为1,括号里表达式的值永远true,如果a不为1,括号里表达式的值是false。还有一种if(a === true)。这时候true就不会转化为1,除非a的值也为true,a也可以是表达式,值为true,否则括号里表达式的值永远false。第三中和第一种差不多。。。。

黄舟

请复习有关数据类型的知识。
还有就是这么写的意图是什么?
a的数据类型不同会有不一样的语义。

PHPz

靠近的第一个!表示判断真假,第二个表示将真假转换为对应的boolean

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号