偶然有看到高手写的代码,其中if(value)都写成了if(!!value),不太理解,所以在这里求解高手,它们的区别。
偶然有看到高手写的代码,其中if(value)都写成了if(!!value),不太理解,所以在这里求解高手,它们的区别。
不太同意最上面的说法,其实他们之间还是有区别的。这就涉及到最佳的实践问题,比如|0和~~是很好的一个例子,使用这两者可以将浮点转成整型且效率方面要比同类的parseInt,Math.round 要快。在处理像素及动画位移等效果的时候会很有用。性能比较见:http://jsperf.com/math-floor-vs-math-round-vs-parseint/42。
同理:!!将一个值快速转化为布尔值,以为他们直接进行的是位操作,所以速度是杠杠的。
总结:if(value)和if(!!value)没什么不同,这只是最佳实践的问题,(ps个人的看法,有错误请指出)
10 回答11.6k 阅读
2 回答3.1k 阅读✓ 已解决
2 回答4k 阅读✓ 已解决
3 回答2.7k 阅读✓ 已解决
3 回答1.7k 阅读✓ 已解决
2 回答1.6k 阅读✓ 已解决
4 回答2.6k 阅读✓ 已解决
没有任何区别。这种写法只是想当然而已。我反对
if (!!var1)
的写法。同样无聊的写法还有:
if ((var1 == var2) == true)
。if 接受“A condition expression that evaluates to true or false”,并非必须PrimitiveBoolean类型。
在《ECMAScript Spec》中,
if (value)
的语义相当于:if (ToBoolean(value))
。而Logical Not的语义相当于:
not ToBoolean(value)
。即
!!val
相当于ToBoolean(value)
。也就是说:
if (!!value)
的语义相当于if(ToBoolean(ToBoolean(value)))
。如果你认为这种写法是合理的,那你为什么不继续写道:
if (!!(!!value))
、if (!!(!!(!!value)))
……?
请君一读《What the Tortoise Said to Achilles》
什么时候需要使用Logical Not
!
来转换类型呢?一般函数传参或返回值有这个必要。如果函数文档中说它返回一个Bool类型的值,那么函数作者就有责任保证其返回值的类型为(Primitive)Boolean。因为函数的使用者可能会写出依赖返回值类型的代码:同作向函数传参也需要注意类型: