一.基本类型的值和引用类型的值
区别:
1.
(1)基本类型值是按值访问的,可以操作保存在变量中实际的值,保存在栈内存中
(2)引用类型值是按引用访问的,操作对象时,实际在操作对象的引用而不是实际的值,保存在堆内存中
(3)包含引用类型的变量实际包含的并不是对象本身,而是一个指向该对象的指针
2.添加属性
引用类型的值可以为其添加属性和方法,基本类型的值不可以
3.复制变量值
(1)复制基本类型的值:创建这个值的副本
(2)复制引用类型的值:复制的是指针,两个变量引用同一个对象
4.传递参数
(1)ECMAScript中访问变量有按值和按引用两种方式,而参数只能按值传递
(2)参数可以看成是局部变量
(2)基本类型值的传递和基本类型变量的复制一样,被传递的值会复制给参数
function addNum(num){ num+=10; return num; } var num1=20; var result=addNum(num1);//参数按值传递 alert(num1); //20 没变化 alert(result); //30
(3)引用类型值的传递和引用类型变量的复制一样,把这个值在内存中的地址复制给参数,因此参数的变化会反映在函数外部
function myObject(obj){ obj.name="liu"; obj = new Object(); //重写时引用的是局部对象,在函数执行完后销毁 obj.name="yang;" } var person=new Object(); myObject(person); //参数按值传递 alert(person.name); //"liu" obj和person引用同一个对象
5.检测类型
(1)用typeof检测基本数据类型
(2)用instanceof检测引用数据类型
所有引用数据类型都是Object 的实例
alert(person instanceof Object);//true
二.执行环境及作用域
1.所有变量都存在于一个执行环境(也称作用域)中
2.执行环境有全局执行环境(web浏览器的全局执行环境是window对象)和函数执行环境
3.每次进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链
4.内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数
var color="blue"; function changeColor(){ var anotherColor="red"; function swapColor(){ var otherColor="green"; //这里可以访问color,anotherColor,otherColor } //这里可以访问color,anotherColor swapColor(); } changeColor(); //这里只能访问color
5.延长作用域链
6.没有块级作用域
1.块级作用域:被花括号封闭起来的代码块都有自己的作用域
2.会将控制语句中的变量声明添加到执行环境中
if(true){ var color="blue";//将变量添加到当前执行环境中 } alert(color);
for(var i=0;i<10;i++){ do(i); } alert(i);//10 for结束后i依旧存在于循环外部的执行环境中3.声明变量:全局变量,var声明局部变量
4.查询标识符
var color="blue"; function getColor(){ return color; } alert(getColor());//"blue"

三.垃圾收集
1.标记清除
2.引用计数
(1)有循环引用时会无法清除(IE中的DOM,BOM)
3.管理内存
(1)解除引用:数据不再用时将其值设为null
(2)应及时解除不再使用的全局对象,全局对象属性以及循环引用变量的引用