使用Javascript时,有时会在变量前面加上两个感叹号,这样做表示什么含义呢?Javascript中,!表示运算符“非",如果变量不是布尔类型,会将变量自动转化为布尔类型,再取非,那么用两个!!就可以将变量转化为对应布尔值。
Javascript中哪些情况下!!值为真?
Javascript中哪些情况下!!值为真?当变量转化为布尔值true时为真咯!
Javascript中各种类型如何转换为布尔值?
我们至少可以想到undifined和null一定是转化为false的,数字0也一定是false,那么,空字符串,空数组,空对象呢?别急,下面的实验会有清晰的答案。
首先,定义三个转化布尔值的函数,我们后面会看到这三个函数是等价的,并且同时输出三个函数的转化结果
function trueOrFalseIf(toTest){
if(toTest){
return true;
}
else{
return false;
}
}function trueOrFalseDouble(toTest){
return !!toTest;
}function trueOrFalseBoolean(toTest){
return new Boolean(toTest);
}function print(toTest){
document.write(trueOrFalseIf(toTest)+","+trueOrFalseDouble(toTest)+","+trueOrFalseBoolean(toTest)+"
");
}
依次测试undefined,null,空字符串"",负0,正0,不确定数值NaN,布尔值false和布尔值true,字符串"0",数字1,数字无穷大Infinity,字符串"true",字符串"false",空数组[],空对象{},函数
function test(){var toTestArray=[undefined,null,"",-0,0,NaN,false,true,"0",1,Infinity,"true","false",[],{},function(){}];
for(var i=0;
i
测试结果如下:
false,false,false
false,false,false
false,false,false
false,false,false
false,false,false
false,false,false
false,false,false
true,true,true
true,true,true
true,true,true
true,true,true
true,true,true
true,true,true
true,true,true
true,true,true
true,true,true
可以看到前面7个值都是false,后面9个值都是true。说明三个函数的作用是一样的。比较值得一提的结论如下:
众望所归,undefined和null为false。
任意数组,对象,函数(函数是特殊的对象)都转化为真,即使是空数组,空对象。
空字符串为false,非空字符串为true。
数值正负0,不确定值为false,其它为true,无穷大也是true。
字符串"0"和数值0可以相互转换,但它们转换为不同的布尔值,即0可转换为"0","0"可转换为true,但0却转换为false,可见Javascript中类型转换不具有传递性。
一个更有趣的现象是布尔值false会转化为字符串"false",而字符串"false"却转换为布尔值true。
document.write(new String(false));
document.write(new Boolean("false"));
结果为
falsetrue
回到我们的题目,Javascript中!!(两个感叹号,双感叹号)可以用来做什么,可以用来判断一些变量的值啊!如果值为真,首先可以排除undefined和null,根据对象类型,可以做出如下判断:
数值:表示不是0,且有确定含义的值(包括无穷大)
字符串:表示长度大于0的字符串
数组,对象,函数:只能表示不是undefined或null,并不能判断是否有元素和内容。
另外,我们上面比较了三个函数,结果是一样的,所以下面两个用法其实是完全等价的:
if(!!value){}if(value){}
【Javascript中!!(两个感叹号,双感叹号)的含义】如果作为条件表达式,不需要使用!!进行转换,Javascript会自动转换,
!!就只应用于将变量转换为对应的布尔值。
推荐阅读
- 操作系统|[译]从内部了解现代浏览器(1)
- web网页模板|如此优秀的JS轮播图,写完老师都沉默了
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- vue.js|vue中使用axios封装成request使用
- JavaScript|JavaScript: BOM对象 和 DOM 对象的增删改查
- JavaScript|JavaScript — 初识数组、数组字面量和方法、forEach、数组的遍历
- JavaScript|JavaScript — call()和apply()、Date对象、Math、包装类、字符串的方法
- JavaScript|JavaScript之DOM增删改查(重点)
- javascript|vue使用js-xlsx导出excel,可修改格子样式,例如背景颜色、字体大小、列宽等
- javascript|javascript中的数据类型转换