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

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会自动转换,(还是要注意不同对象转换的结果会有一点理解上的偏差)

相关推荐

微信朋友圈如何发长视频
mobile365

微信朋友圈如何发长视频

⌛ 07-01 👁️ 5590
HKC电源报价
365 双式投注

HKC电源报价

⌛ 07-07 👁️ 7615
寻仙手游
mobile365

寻仙手游

⌛ 07-11 👁️ 416