4.1、基本类型和引用类型的值
基本类型值 | 引用类型值 |
---|---|
简单的数据段 | 可能由多个值构成的对象 |
按值访问,可以操作保存在内存当中的实际值 | 不能直接操作对象的内存空间 |
不能添加属性 | 可以添加、删改属性和方法 |
复制时,不共享内存 | 复制时,复制的副本实际是个指针,共享内存 |
参数传递:ECMAScript中所有函数的参数传递都是按值传递,若是参数是基本类型,被传递的值被复制给一个局部变量(arguments对象中的一个元素)。如果参数是对象,看以下两个栗子
function setName(obj){
obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
在函数内部,obj和person引用的是同一个对象,即使这个对象是按值传递,obj也会用引用来访问同一个对象。
function setName(obj){
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
在函数内部重写obj时,这个变量引用的就是一个局部对象了,局部对象在函数执行完毕后销毁。
检测类型:typeof操作符检测基本数据类型,instanceof操作符检测引用类型
var simpleStr = 'This is a simple string';
var myString = new String();
var newStr = new String('String created with constructor');
var myDate = new Date();
simpleStr instanceof String; // returns false,基本类型不是对象 checks the prototype chain, finds undefined
myString instanceof String; // returns true
newStr instanceof String; // returns true
myString instanceof Object; // returns true 所有引用类型的值都是Object的实例
4.2、执行环境(execution context)和作用域
执行环境(execution context)定义了变量或函数有权访问的其他数据,每个执行环境都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存在这个对象当中。
标识符解析过程:
4.2.1延长作用域链
try-catch语句的catch块
在作用域链的前端添加一个变量对象。对catch语句来说,会创建一个新的变量对象,其中包含的是被抛出错误对象的声明。with语句
在作用域链的前端添加一个人变量对象。对with语句来说,会将指定的对象添加到作用域链中。
location = {
href:"ss"
};
function buildUrl(){
var qs = "?debug=true";
with(location){
var url = href + qs; //实际上引用的是location.href
}
return url;
}
result = buildUrl();
console.log(result); //ss?debug=true
with接收location对象,location对象被添加到作用域链的前端。with语句中,最接近的环境是函数环境,变量url可以返回。
4.2.2 没有块级作用域
- 由花括号封闭的代码块,不构成执行环境。
for(var i = 0;i < 10;i++){
;
}
console.log(i); //10
- 声明变量
使用var声明的变量会自动被添加到最接近的环境中。在函数内部,就是函数的局部环境;在with语句中,最接近的环境是函数环境。如果初始化变量的时候没有使用var声明,该变量会自动被添加到全局环境。 - 查询标识符
搜索标识符的搜索过程从作用域链的前端开始,向上逐级查询,直至匹配为止。