JavaScript中 !,!!,!!!(一个,两个,三个感叹号)的含义

参考文章 :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

如果将对象用来作为条件表达式判断条件,不需要使用!!进行转换,Javascript会自动转换,(还是要注意不同对象转换的结果会有一点理解上的偏差)

 

你可能感兴趣的:(前端知识学习总结)