首先要知道JavaScript的变量类型在一些操作符下会隐式转换的。比如 " ! " 运算符
alert(!true); // 输出false
alert(!100); // 输出false
alert(!'Web前端开发'); // 输出 false
更多详细的隐式类型转换请参考这篇博文: JavaScript隐式类型转换
一个 " ! " 将变量转为一个boolean类型的值,那么两个连续的 " ! "号叠加就会把变量转为它理应代表的布尔值。
以下为"!!"的规则
number类型: 不为0 就,!!num 等于true;
string类型: 不为"" (空字符串),!!str 等于true;
!!null 等于false
!!undefined 等于false
!!{} 等于 true //注意:对象就算为空都会被转为true
!!function(){} 等于 true //注意:这样写function 并不会执行function,所以就算function里面写任何东西都会返回true
可以看到function并没有被执行,并且返回true
举例:
console.log(!!0); //false
console.log(!!123); //true
console.log(!!"some"); //true
console.log(!!""); //false
console.log(!!undefined) //false
console.log(!!null) //false
//
function testInIf(value){
if(value){
return true;
} else {
return false;
}
}
//以下全部打印true
console.log(!!{});
console.log(!!{k: 'v'});
console.log(testInIf({}))
console.log(testInIf({k: 'v'}))
console.log(!![]);
console.log(!![0,1]);
console.log(testInIf([]))
console.log(testInIf([0,1]))
console.log(!!function(){});
console.log(testInIf(!!function(){}))
console.log(!!function(){
console.log("被执行");
return false;
});
//这个函数并没有被执行
//请注意, 双"!"号和单"!"号都不会执行函数,只是将函数转为了函数表达式,想要执行还需要在后面加 ()