JavaScript小技巧:!!的使用

今天看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。但是如果!后面不是一个布尔值的时候,"!"会先把这个值强制转化为布尔类型,然后再进行取反操作,举个例子:

JavaScript小技巧:!!的使用_第1张图片
取反操作

“!”可以将一个值对应布尔值的取反。但是如果我们知道这个值对应的布尔值呢?只需要在!号前再加一个!,取反的取反就是原来的布尔值,举例如下:

JavaScript小技巧:!!的使用_第2张图片
取反的取反操作

Vue.js源码在调用这个定义的def函数的时候,基本上只写了前面三个参数,第四个参数没有写(默认为undefined),这是"!!"就可以自动地将undefined转化为false,从而使得enumerable传入的值为布尔类型的值。

你可能感兴趣的:(JavaScript小技巧:!!的使用)