JavaScript高级程序设计(反刍) 2
第四章:
基本数据类型:undefined、null、boolean、number、string
引用类型的值是保存在内存中的对象,JavaScript不允许直接访问内存中的位置
基本类型和引用类型值的方式不同,只能给引用类型的值添加属性:
var person = new Object();
person.name = “abc”;
console.log(person.name); //abc
var wapper = “abc”;
wapper.age = 12;
console.log(wapper.age); //undefined
复制变量:
无论使变量值的复制,还是参数值的传递,在JavaScript中,不存在引用传递的情况,全部都是值传递!
var age1 = 15;
var age2 = age1;
age2 = 18;
console.log(age1); //15
console.log(age2); //18
变量复制引用类型等函数方法时,变量仅仅是函数/引用类型的一个代称,实际上只是一个名,背后存在一个指针指向该函数/引用类型,当出现值被复制/传递的情况是,只是将指针复制一遍,交给新变量,实际上两个变量还是指向同一个函数/引用类型。
var object1 = new Object();
var object2 = object1;
var object1 = “abc”;
console.log(object1); //abc
console.log(object2); //abc
function setName(){
obj.name = “abc”;
obj = new Object();
obj.name = “bcd”;
}
var person = new Object();
setName(person);
console.log(person.name); //abc
检测类型:
使用typeof方法检测类型
使用instanceof操作符检测类型,但是这种方法检测类型在检测直接创建的变量时检测为false,但是检测引用类型方法创建的变量时为true
执行环境和作用域:
执行环境就是代码运行时的环境,因为变量/函数定义的位置不同,所以会出现不同的执行环境。
执行环境之定义的所有变量和函数都保存在一个叫做“变量对象”的对象中,自己编写的代码无法访问该对象,但是浏览器底层的解释器会使用。
当代码在浏览器中被解析时,会自动生成一个作用域链,用途是保证对变量和函数的有序访问。浏览器对于标识符的解析是沿着作用域链一级级向上搜索的,搜索的过程始终是从作用域链的前端开始,逐级向后回溯,直到找到标识符为止。
正是因为浏览器这种对于标识符的搜索方式,导致内部环境中的标识符可以通过作用域链访问外部环境中的变量/函数,但是外部环境中的标识符不可以访问内部环境中的变量/函数。因为当外部环境访问时,内部环境中的标识符还没有被解析到!
解析标识符时是正向从上到下解析,所以在调用变量/函数时是反向从下到上解析,也就是从调用点开始沿作用域链逐级向上寻找。
延长作用域链:
1.使用try,catch语句中的catch块
2.使用with语句
(个人感觉延长作用域链没有啥特别重要的作用)
没有块级作用域:
没有块级作用域这是JavaScript与其他语言很重要的一个不同,也是容易造成错误的一个很重要的地方!
if(a>0){
var b = 1;
}
console.log(b); //1,这里仍能访问到
for(var i=0; i<10; i++){
a++
}
console.log(i); //10
垃圾收集:
JavaScript有自动的垃圾回收机制,最常用的垃圾收集方式是标记清除式,后面也出现过一段时间的引用计数方法。
手动也可以解除引用,直接将引用变量的值设置为null即可。