JavaScript中的一些小细节

这篇博客用来记录下通过各种途径知道的一些JS的小细节。

一、1 + undefined = NaN 而 1 + null = 1

因为:undefined强转数字是NaN 而 null强转数字是+0,规则如下

 

二、两个{}的比较

console.log({}=={});//false  指针的比较,两个都是新对象,指向的位置不一样,所以为false

console.log({}<{});//false  大小的比较,会将左右进行ToPrimitive操作,{}执行该操作之后得到的是一个表示该对象的字符串”[object Object]”,所以应该是相等

console.log({}<={});//true  同上

 

三、原型链中的基础类型不会被共享

因为基础类型是不可变的,你所更改的基础类型的值,不过是将更改后的值放入到新的地址中,然后变量将指针指向新的地址。一旦更改了当前属性的指针所指向的地址,JS就会把这个属性从原型链中复制到此实例中。

 

四、setTimeout的一些细节

1、第一个参数可以是字符串,因为引擎内部是使用eval语句执行的

2、时长最长为 2147483647毫秒(24.8天),因为浏览器内部使用32位带符号的整数来储存推迟执行的时间。

 

五、箭头函数没有this,是引用的外层的this

PS:同样的,arguments、super、new.target这三个变量也是引用的外层的

比如在浏览器环境下

let a = 1,b = {a:2};

let f  = ()=>{console.log(this.a)};

执行f.call(b);返回的还是1

一下是另一个实例,将es6转换成es5之后的结果,这下你应该就明白为什么call没有用了。

 

六、如果let b = new Object(a) 则 b === a

可能是由于从其他语言带来的感觉,所以很多人都以为使用let b = new Object(a) ,则a为b的原型,其实不是,其实这个语句等于 let b = a; 

 

七、x = 2 和 var x = 2的区别

有些人声明变量的时候忘记写关键字了。这会导致什么后果呢?

1、不会变量提升。

2、可以使用delete删除

posted @ 2017-09-06 10:49  这名字就是霸气  阅读(206)  评论(0编辑  收藏  举报