今天看Vue.js源代码,其中有一段和enumerable相关的代码,如下所示:
/**
* Define a property.
*/
function def (obj, key, val, enumerable) {
Object.defineProperty(obj, key, {
value: val,
enumerable: !!enumerable,
writable: true,
configurable: true
});
}
其中!!enumerable中"!!"是个一个很神奇的小技巧。我们在提供接口给别人用的时候,经常需要别人传入一个布尔类型的参数。然而很多时候,使用接口人的不会老老实实地传入一个布尔值,可能会用0代替false,用一个Object代替true。有时候用户会根本不写这个参数,这时候这个传入的值是undefined(布尔为false)。因此我们需要对这些值进行处理,转化为布尔值。
我们都知道"!"是取反符号,!true=false,!false=true。但是如果!后面不是一个布尔值的时候,"!"会先把这个值强制转化为布尔类型,然后再进行取反操作,举个例子:
取反操作“!”可以将一个值对应布尔值的取反。但是如果我们知道这个值对应的布尔值呢?只需要在!号前再加一个!,取反的取反就是原来的布尔值,举例如下:
取反的取反操作Vue.js源码在调用这个定义的def函数的时候,基本上只写了前面三个参数,第四个参数没有写(默认为undefined),这是"!!"就可以自动地将undefined转化为false,从而使得enumerable传入的值为布尔类型的值。
网友评论