《JavaScript高级程序设计》第4章 变量、作用域和内存问题
4.1 基本类型和引用类型
5种基本类型:Undefined、Null、Boolean、Number和String,这5种基本类型是按值访问的,因为可以操作保存在变量中的实际的值。
引用类型:可能由多个值(这里的“多个值”应该是指对象和方法)构成的对象,是保存在内存中的。
4.1.2 复制变量值
当复制基本类型值的变量时,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。
当复制引用类型值的变量,也就是复制某个对象时,复制的是指针,复制结束后,两个变量实际上将引用同一个对象。
var obj1 = new Object(); var obj2 = obj1; obj1.name = 'Natsu12'; console.log(obj2.name); // 'Natsu12'
题外话:当复制某个对象时,操作的是对象的引用;当在为对象添加属性时,操作的是实际的对象。
4.1.3 传递参数
函数传递参数都是按值传递的(不是按引用传递),也就是说把函数外部的值传进函数的参数里,相当于把值从一个变量复制到另一个变量。
但由于复制变量也分为 -> 复制基本类型值 / 引用类型值,所以如果传的参数是一个对象,则对参数的操作还是能反应到函数的外部。
但是请注意:这时候参数依然是按值传递的,而非按引用传递的。
4.1.4 检测类型
typeof检测基本数据类型比较有用,但在检测引用类型的值时用处不大
使用instanceof来检 测是什么类型的对象
console.log(person instanceof Object); // 变量person是Object吗
A instanceof B:判断B.prototype是否在A的原型链上
4.2 执行环境和作用域
4.2.2 没有块级作用域
变量查询是首先在当前局部环境中搜索,如果找到了该标识符,则停止,否则沿作用域链往上搜索。
所以函数里局部变量会屏蔽掉全局变量。
被屏蔽之后如果要访问全局变量,则需要通过window.xxxx来访问。