日期:2014-05-16  浏览次数:20749 次

关于JS的if判断语句中的双重否定(if(!!X))的疑问?
看到有些代码这样写:
if(!!X){。。。。}

if(X){。。。。}
有什么不同吗?

我知道X肯定会是一个对象或者变量的值,
或者空、未定义什么的。
而!!X肯定是一个布尔值。

我想知道这两段代码执行起来有什么不同吗?

效率、性能不同?

还是X为某些特定值的情况下,其中一个代码段不会执行?

就想确认:如果其中一个代码段执行,另一个是不是也一定执行?



------解决方案--------------------
我个人觉得大部分情况好像是一样的。
------解决方案--------------------
将在ECMAScript 5被剔除
------解决方案--------------------
Delphi(Pascal) code
个人认为:两个结果一样
1.if(X),执行if判断是转换为bool
而if(!!X)中,转换为bool类型后执行if判断

------解决方案--------------------
mark一下。
这个我猜跟JS引擎实现相关,因为x存在null、undefined、NaN等等特殊情况,!x可以理解为一个强制类型转换(Boolean)x的意思。另一个猜想,因为考虑到JS有多种实现,为了安全兼容,因此使用上述表达方式。以上只是猜想,有时间的话,肯怕要读读JS的引擎代码才行。

------解决方案--------------------
探讨
Delphi(Pascal) code
个人认为:两个结果一样
1.if(X),执行if判断是转换为bool
而if(!!X)中,转换为bool类型后执行if判断

------解决方案--------------------
3、4楼的都说的对,

应该是强制类型转换,!!X将X强制转换为Bool
------解决方案--------------------
上下文是什么呢?
X的取值范围怎么说
------解决方案--------------------
如 var a ="123"
在互联网的浏览器中 if(a) 都是可以往下执行的 (我说的是我见到 都是可以往下执行的)

之前 我在一家机顶盒公司的时候 在机顶盒里面的 环境 中 if(a) 是通不过的 也就是说是按 false来的 

if(!!a) 应该是更安全 更符合标准
更干 更爽 更安心 
-----------------------------------------