参考文章 :https://blog.csdn.net/buppt/article/details/77726809,lx_1024 js一个两个三个感叹号的区别
今天写React时判断一个时间组件的传值是否为空数据 [ ] 时,用 !! 来判断的,然并卵,并没有起到判断的作用,于是就找资源学习一下 js 的 ! (感叹号) 到底怎么用,有什么含义,顺便写篇文章记录一下
js 中的 ! 的含义:js 中,! 表示运算符“非”,如果变量不是布尔类型,会将变量自动转化为布尔类型再取非,!! ( 两个感叹号),就可以将变量转化为对应布尔值,!!!(三个感叹号)没有什么意义,和一个感叹号的效果是一样的。一般他们认为 !! 表示将一个变量转为boolean型,再加一个!是对boolean型取反,和 !false 或者 !true 一样。
那么,哪些值转换成布尔值为true呢 ?以及 在 !,!!,!!!运算后的值又是什么样的
我们先定义几个函数:
testObjISTrueOrFalse: function(obj) {
this.trueOrFalse(obj)
this.trueOrFalseOfOne(obj)
this.trueOrFalseOfTwo(obj)
this.trueOrFalseOfThree(obj)
},
trueOrFalse: function(obj) {
if (obj) {
console.log(obj + '_trueOrFalse', 'true')
} else {
console.log(obj + '_trueOrFalse', 'false')
}
},
trueOrFalseOfOne: function(obj) {
console.log(obj + '_trueOrFalseOfOne', !obj)
},
trueOrFalseOfTwo: function(obj) {
console.log(obj + '_trueOrFalseOfTwo', !!obj)
},
trueOrFalseOfThree: function(obj) {
console.log(obj + '_trueOrFalseOfThree', !!!obj)
}
依次测试 undefined,null,空字符串,负0,正0,不确定数值,布尔值false,布尔值true,字符串0,数字1,数字无穷大,字符串true,字符串false,空数组,空对象,函数
var arr = [undefined, null, '', -0, 0, NaN, false, true, '0', 1,
Infinity, 'true','false', [], {}, function() {}]
for (var i = 0; i < arr.length; i++) {
this.testObjISTrueOrFalse(arr[i])
}
测试结果如下:
undefined_trueOrFalse false
undefined_trueOrFalseOfOne true
undefined_trueOrFalseOfTwo false
undefined_trueOrFalseOfThree true
null_trueOrFalse false
null_trueOrFalseOfOne true
null_trueOrFalseOfTwo false
null_trueOrFalseOfThree true
_trueOrFalse false
_trueOrFalseOfOne true
_trueOrFalseOfTwo false
_trueOrFalseOfThree true
0_trueOrFalse false
0_trueOrFalseOfOne true
0_trueOrFalseOfTwo false
0_trueOrFalseOfThree true
0_trueOrFalse false
0_trueOrFalseOfOne true
0_trueOrFalseOfTwo false
0_trueOrFalseOfThree true
NaN_trueOrFalse false
NaN_trueOrFalseOfOne true
NaN_trueOrFalseOfTwo false
NaN_trueOrFalseOfThree true
false_trueOrFalse false
false_trueOrFalseOfOne true
false_trueOrFalseOfTwo false
false_trueOrFalseOfThree true
true_trueOrFalse true
true_trueOrFalseOfOne false
true_trueOrFalseOfTwo true
true_trueOrFalseOfThree false
0_trueOrFalse true
0_trueOrFalseOfOne false
0_trueOrFalseOfTwo true
0_trueOrFalseOfThree false
1_trueOrFalse true
1_trueOrFalseOfOne false
1_trueOrFalseOfTwo true
1_trueOrFalseOfThree false
Infinity_trueOrFalse true
Infinity_trueOrFalseOfOne false
Infinity_trueOrFalseOfTwo true
Infinity_trueOrFalseOfThree false
true_trueOrFalse true
true_trueOrFalseOfOne false
true_trueOrFalseOfTwo true
true_trueOrFalseOfThree false
false_trueOrFalse true
false_trueOrFalseOfOne false
false_trueOrFalseOfTwo true
false_trueOrFalseOfThree false
_trueOrFalse true
_trueOrFalseOfOne false
_trueOrFalseOfTwo true
_trueOrFalseOfThree false
[object Object]_trueOrFalse true
[object Object]_trueOrFalseOfOne false
[object Object]_trueOrFalseOfTwo true
[object Object]_trueOrFalseOfThree false
function () {}_trueOrFalse true
function () {}_trueOrFalseOfOne false
function () {}_trueOrFalseOfTwo true
function () {}_trueOrFalseOfThree false
可以看到前面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"));
结果为 : false , true