关于JS的if判断语句中的双重否定(if(!!X))的疑问?

浴火_凤凰 2010-04-29 09:22:48
看到有些代码这样写:
if(!!X){。。。。}

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

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

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

效率、性能不同?

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

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

...全文
1126 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
马老虎 2010-05-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 kk3k2005 的回复:]

学了招
!!X 就可以转换成bool
[/Quote]
一样
eduyu 2010-05-02
  • 打赏
  • 举报
回复
我发现你适合去学c++,因为c++下这些东西真的是需要搞清楚的。

在js里,if后铁定是boolean,不管强制类型转换还是自动转换,都会转成boolean。第二次到第n次都是boolean转boolean,结果不会有任何不同。所以,两个语句没有任何不同。多转一次或许有点及其微小的性能消耗。

在c++里就不一样了,cast,就是类型转换,有很多种,有static_cast的,也有reinterpret_cast,每种cast有自己的规则,而且cast操作符可以overloading,差别大了。
yq736130081 2010-05-02
  • 打赏
  • 举报
回复
!!X 是取反值用的
浴火_凤凰 2010-04-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wtcsy 的回复:]
如 var a ="123"
在互联网的浏览器中 if(a) 都是可以往下执行的 (我说的是我见到 都是可以往下执行的)

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

if(!!a) 应该是更安全 更符合标准
更干 更爽 更安心
---------------------------------------……
[/Quote]

非常感谢!!!
我想知道的就是这种特殊情况。
机顶盒里也可以运行JS???
我就知道PDF文档中和浏览器中可以运行JS,
请问,JS还有其它什么常见的运行环境吗?
KK3K2005 2010-04-30
  • 打赏
  • 举报
回复
学了招
!!X 就可以转换成bool
wtcsy 2010-04-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kk3k2005 的回复:]
................................
[/Quote]
恩 可以说是为了转型 我觉得说 是为 安全 兼容 更好
PS:以上只是个人理解.................
KK3K2005 2010-04-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wtcsy 的回复:]

如 var a ="123"
在互联网的浏览器中 if(a) 都是可以往下执行的 (我说的是我见到 都是可以往下执行的)

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

if(!!a) 应该是更安全 更符合标准
更干 更爽 更安心
------------------------……
[/Quote]
按你的说法 那这个!!X 纯粹不就是为了 转型~~~
wtcsy 2010-04-30
  • 打赏
  • 举报
回复
如 var a ="123"
在互联网的浏览器中 if(a) 都是可以往下执行的 (我说的是我见到 都是可以往下执行的)

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

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

KK3K2005 2010-04-30
  • 打赏
  • 举报
回复
上下文是什么呢?
X的取值范围怎么说
浴火_凤凰 2010-04-30
  • 打赏
  • 举报
回复
楼上说的那些强制类型转换我都知道。



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

效率、性能不同?

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

就想确认:如果其中一个代码段执行,另一个是不是也一定执行?
dngoryaner 2010-04-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sohighthesky 的回复:]
Delphi(Pascal) code
个人认为:两个结果一样
1.if(X),执行if判断是转换为bool
而if(!!X)中,转换为bool类型后执行if判断
[/Quote]

同意
wqkjj 2010-04-29
  • 打赏
  • 举报
回复
mark一下。
这个我猜跟JS引擎实现相关,因为x存在null、undefined、NaN等等特殊情况,!x可以理解为一个强制类型转换(Boolean)x的意思。另一个猜想,因为考虑到JS有多种实现,为了安全兼容,因此使用上述表达方式。以上只是猜想,有时间的话,肯怕要读读JS的引擎代码才行。
sohighthesky 2010-04-29
  • 打赏
  • 举报
回复
个人认为:两个结果一样
1.if(X),执行if判断是转换为bool
而if(!!X)中,转换为bool类型后执行if判断
passself 2010-04-29
  • 打赏
  • 举报
回复
将在ECMAScript 5被剔除
licip 2010-04-29
  • 打赏
  • 举报
回复
我个人觉得大部分情况好像是一样的。
mzgwh198857 2010-04-29
  • 打赏
  • 举报
回复
我感觉
if(X),执行if判断是x转换为bool,只转一次
而if(!!X)中,x先转换为bool类型后再通过!从后向前转换两次,再判断。
cocoanet 2010-04-29
  • 打赏
  • 举报
回复
3、4楼的都说的对,

应该是强制类型转换,!!X将X强制转换为Bool

87,918

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧