偶然有看到高手写的代码,其中if(value)都写成了if(!!value),不太理解,所以在这里求解高手,它们的区别。
没有任何区别。这种写法只是想当然而已。我反对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)))
……?
`
什么时候需要使用Logical Not !来转换类型呢?一般函数传参或返回值有这个必要。如果函数文档中说它返回一个Bool类型的值,那么函数作者就有责任保证其返回值的类型为(Primitive)Boolean。因为函数的使用者可能会写出依赖返回值类型的代码:
/**
@returns Bool
*/
function has(str,substr) {
return !!~str.indexOf(substr);
//return ~str.indexOf(substr); // wrong!!!
}
//函数使用者的代码:
JSON.stringify({
//此选项值类型早约定为Enum(0|1)
xxxOptionOnOff:+has(s,"xxx") //使用者依赖于Bool to Number的转换
});
同作向函数传参也需要注意类型:
/**
@param {Bool} flag
*/
function toggle(flag) {
//期望设置className为 toggle-on-true 或toggle-on-false
//尽管不推荐这种过于依赖Bool参数类型的代码,但既然文档声明是Bool类型
//传参者就有必要保证参数类型正确,即使是JS这种弱类型语言
ele.className= "toggle-on-"+flag;
}
toggle(!!btn.checked);
//toggle(btn.checked); //wrong! btn.checked可能返回String "checked"
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。