基本类型与类型转换
- 六个原始类型(primitive type):String、Number、Boolean、Undefined、Null、Symbol(ES6新增);复杂数据类型Object 是元类型的扩展、有数组Array、Function。
- 简单数据类型把数据名和值直接存储在栈当中。可以用typeof运算来检测。但是typeof null返回object。
- 复杂数据类型在栈中存储数据名和一个指针,指针指向该变量在堆中的地址,在堆中存储属性及值。访问时先从栈获取地址,再到堆中拿出相应的值。
- 简单数据类型作为参数时,函数内部对参数值的修改不会改变外部变量的值,相当于值传递。被传递进去的复杂类型则会被改变。因为复杂数据类型的传递是把栈中对象的指针赋给变量,函数内外两个变量都指向同一个堆中的对象,所以函数内部的对象发生改变,外部的变量也会相应的改变。
==
会在两边发生类型的转换。undefined、null、空字符串、数字0、数字NAN在==
是会被转换成bool类型fasle。- [] ,{}和null:{}是一个不完全空对象,原型链上有Object。[]原型链上还直接指向array,最底层是Object。null是完全空对象,没有原型链。因此 [] {} 都会被转为true。 但是""就是false。
- undefined == null,结果是true。且它俩与所有其他值比较的结果都是false。
- NaN == NaN 为false。
- 元类型的==都是转换成Number再比较的,引用类型都是转换成元类型(具体通过valueOf和toString方法),再转换成Number比较的。
- 注意:
[1,2,3].splice(1,1,1) == [2]
的值为假,因为虽然左表达式的结果是[2],但是这两个[2]指向的不是同一个地址,所以不一样。
https://zhuanlan.zhihu.com/p/21650547
变量提升
这个我自己之前也写过,就在那边补充了。
但是要注意到底是变量提升还是作用域链的问题,如题:
js搜索变量是从内部顺原型链往外部找的,内部直接找到了name,就不去外部了,执行第一次if时还没初始化值,所以为undefined,然后赋值执行console结束。
var name="World!";
(function()