关于!与!!
大家都知道!
是求非的意思。在js中有以下数据,会得到true
console.log(!undefined);
console.log(!null);
console.log(!false);
console.log(!'');
其余情况均为fasle。
console.log(!{});
console.log(![]);
console.log(!true);
console.log(!'1');
console.log(!1);
注意,用!
求非一个空字符串
得到的结果是fasle
。而求非空数组
与空对象
得到的结果是 ture
所以!!
就很好解释了。就是对某个值求非之后,再次求非。也就是求两次非。简称双非运算。
这里注意单次求非里的特殊情况,console.log(!false)
的结果,是ture
。
所以关于!!
的不太精准的意思是:如果对一个正常的值,做该运算,返回的就是true.如果对一个未定义或者空值做该运算,返回的就是fasle。
而对该运算准确的解释是:如果对一个undefined
、null
、false
、空字符串
做该运算,得到的就是fasle。其余值,均为ture。
所以这种双非运算,不太适合理解成非空判断,因为空对象与空数组得到的结果也会是true。
关于?.
直接看代码:
let a;
console.log(a.name); //报错Cannot read property 'name' of undefined
console.log(a?.name); //正常输出,输出结果为undefined。
这是对象未定义的情况,那么对象已定义,但是没定义相关属性呢?
let a = {};
console.log(a?.name);//输出结果依然是undefined。
所以?.
的正确用法是:
如果不确定一个对象是否已经定义了,也不确定该对象需要使用的属性是否已经定义了,那么可以在该对象与属性的点式调用中间加上?
那么,如果该对象未定义或者该对象点式调用属性未定义,就不会导致程序报错,而会返回undefined。
效果等同于a && a.name
所以在vue中,一个组件需要根据一个对象的属性值是否存在而显示或隐藏时,就可以利用?.
语法简化代码。
因为if
判断等同于双非判断!!
。所以if(undefined)
就相当于if(false)
关于??
这是用来判断某个值是否为undefined
或者null
。如果是,就返回??
后提供的值。如果不是,则直接返回该值。
上代码:
console.log(undefined??'111');//输出111
console.log(null??'111');//输出111
相反的如果结果,就会输出原本的值
console.log(''??'111');//输出空字符串
console.log(fasle??'111');//输出fasle
还有??=。如果??=
之前的值为undefined
或者null
则会直接把运算符后边的值赋值给运算符之前的值。
网友评论