Skip to content
camiler edited this page Feb 9, 2017 · 2 revisions

(function(){}());和(function(){})(); 的写法区别

在《你不知道的JS(一)》中有提到这两种写法,其实没有什么区别,随自己喜好。


js判断语句中!!的用法

通常 我们判断一个值是否有就直接是:

if(value) {
    do something;
}

在大部分情况下,是明确正确的情况就做什么,比如value不为空,为true。
双重否定就是肯定,或许我们第一反应是 !!value == value,但其实不然。下面的例子就能很好的说明这一点:

typeof new String('123') && new String('123')
> String{0: "1", 1: "2", 2: "3", length: 3, [[PrimitiveValue: "123"]]}

typeof new String('123') && !!new String('123')
> true

当我们需要确定的布尔类型值,用!!做运算是最好,否则就会直接返回结果。


Object.prototype.toString.call(obj)和obj.toString

参考stackoverflow的答案

![] (https://github.com/camiler/learnblog/blob/master/imgs/tostring.png?raw=true)


for-in, for, for-of

1、for-in: 针对对象的循环,循环可枚举键名,对象中属性中的enumable为true的属性,同时还会循环prototype链上的可枚举属性。
2、for: 循环数组
3、for-of: 遍历获得键值。循环遍历具有@@iterator遍历器的对象,数组本身具有遍历器,所以可以用它来循环数组。一般对象没有遍历器,但可以显示赋予对象遍历器。同时ES6新增的Set和Map结构也具有iterator接口,还有类似数组的对象(字符串、DOM NodeList对象、arguments对象)都可以通过for-of循环遍历值。


void 0

void 运算符会对给定的表达式进行求值,然后直接返回 undefined。
void (0) 等同于 void 0

void 0;
void "hello";
void (new Date());

上面的语句都会返回undefined,为什么我们不直接返回undefined呢?
首先,我们要明确undefined并不是一个保留字,它实际上是一个全局对象属性,所以可以允许作为一个变量名。那么可能在js代码存在这样的赋值:

var undefined = "value";

这样直接返回undefined时,就返回了"value"了。 更多解答参考stackoverflow

另外,void还有个用法就是把函数声明识别成函数表达式。用于立即执行的函数表达式。MDN

void function func(){
    console.log('void func');
}();