基本类型和引用类型的值
- 访问变量
1.1 基本数据类型:按值访问
1.2. 引用类型:按引用访问,可动态添加属性和方法 复制变量值
2.1 从一个变量向另一个变量复制基本类型的值:此后这两个变量可以参与任何操作而不会互相影响var num1 = 5; var num2 = num1; num2 = 10; alert(num2); //10 alert(num1); //5
2.2 从一个变量向另一个变量复制引用类型的值:两个变量实际上将引用同一个对象,因此改变其中一个变量,就会影响另一个
var obj1 = new Object(); var obj2 = obj1; obj1.name = "Leo"; alert(obj2.name); //"Leo"
传递参数
3.1 所有函数的参数(不管是基本类型还是对象)都是按值传递的。(就和把值从一个变量复制到另一个变量一样。基本类型值的传递如同基本类型变量的复制一样,而引用类型值的传递,则如同引用类型变量的复制一样,请看2)//这是一个反映参数(对象)也是按值传递的例子 function setName(obj) { obj.name = "Leo"; obj = new Object(); obj.name = "Greg"; } var person = new Object(); //创建对象并保存在变量person中 setName(person); //person作为参数按值传递到函数中 alert(person.name); //"Leo"。说明是按值传递的,如果是按引用,那么person.name就会被修改为"Greg"了。
检测类型(typeof vs instanceof)
4.1 typeof操作符是检测基本数据类型的得力助手:var s = "Leo"; var b = true; var i = 22; var u; var n = null; var o = new Object(); var f = function(){}; var r = /\d+/; alert(typeof s); //String alert(typeof b); //Boolean alert(typeof i); //Number alert(typeof u); //undefined alert(typeof n); //Object alert(typeof o); //Object alert(typeof f); //function alert(typeof r); //Safari 5/Chrome 7-:function,IE/Firefox:object
4.2 instanceof操作符:检测是什么类型的对象
//基本语法 result = variable instanceof constructor //ps:所有引用类型的值都是Object的实例,即在检测一个引用类型值和Object构造函数时始终会返回true //如果变量是给定引用类型的实例,则返回true alert(person instanceof Object); //变量perosn是Object吗? alert(colors instanceof Array); //变量colors是Array吗? alert(pattern instanceof RegExp); //变量pattern是RegExp吗?
执行环境及作用域
延长作用域链
当执行流进入下列任何一个语句时,作用域链就会得到加长:
1.1 try-catch语句的catch块
1.2 with语句(with语句的作用是将代码的作用域设置到一个特定的对象中)没有块级作用域
在其他类c的语言中,由花括号封闭的代码块 都有自己的作用域,而js是没有这种块级作用域的。两个例子://example 1 if(true) { var color = "blue"; } alert(color); //"blue"(然而如果是在c、c++或java中,color会在if语句执行完毕后被销毁) //example 2 for(var i = 0; i < 10; i ++) { doSomething(i); } alert(i); //10
2.1 声明变量—参考基本概念(上)之数据类型中的“变量”知识点,另外注意:初始化变量之前一定要先声明变量,避免导致意外错误
2.1 查询标识符
搜索从局部环境开始,沿着作用域链向上,一旦找到则停止搜索,不再继续向上搜索。
垃圾收集
- 自动垃圾收集机制:按照固定的时间间隔,周期性地,找出不再继续使用的变量,然后释放其占用的内存。
- 标识无用变量的策略(垃圾收集的时间间隔因浏览器的实现而异)
- 标记清除
- 目前主流的垃圾收集算法。这种算法的思想是给当前不使用的值加上标记,然后再回收其内存
- 离开作用域的值将被自动标记为可回收,因此将在垃圾收集期间被删除
- 引用计数(不常见,会导致循环引用问题)
- 标记清除
小结
- 基本类型值和引用类型值具有以下特点:
- 基本类型值在内存中占据固定大小的空间,保存在栈中
- 引用类型的值是对象,保存在堆内存中
- 从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本
- 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针
- 从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象
- 确定一个值是哪种基本类型可以使用typeof操作符,而确定一个值是哪种引用类型 可以使用instanceof 操作符