一、基本类型和引用类型的值
引用类型的值:可能由多个值构成的对象。
对于引用类型的值,我们可以添加、改变、删除属性和方法。
var person = new Object(); person.name = "Nicholas"; alert(person.name); //"Nicholas"
但我们不能给基本类型添加属性。
obj1和obj2都指向同一对象,当为obj1添加name属性后,可以通过obj2访问这个属性,因为这两个属性的引用都是同一个对象。
var obj1 = new Objcect(); var obj2 = obj1; obj1.name = "nima"; alert(obj2.name); //nima
3.传递参数
参数只能按值传递,向参数传递基本类型时,被传递的值会被复制给局部变量
function addTen(num) { num += 10; return num; } var count = 20 var result = addTen(count); alert(count); //20 alert(result); //30
即使在函数内部修改了参数的值,但原始的引用未变。实际上在函数内部重写obj时,这个变量的引用就是一个局部变量。
4.测试类型
instanceof操作符 :检测引用类型
语法: variable instanceof cunstructor
alert(person instanceof Object) //变量person是Object吗
所有引用类型的值都是Object的实例,检测引用类型始终返回true;检测基本类型始终返回false
二、执行环境及作用域
1. 执行环境:执行环境是JS中最重要的一个概念;它定义了变量和函数有权访问的其他数据;
2. 变量对象:每个执行环境都有一个与之关联的变量对象;环境中定义的所有变量和函数都保存在这个对象中;
3. 全局执行环境:最外围的一个执行环境,根据ECMAScript实现所在的宿主环境不同而不同,在Web浏览器中,全局执行环境被认为是window对象;
4. 执行环境的销毁:在某个执行环境的所有代码都执行完毕后,环境将被销毁,意味着其中所有变量和函数定义也都随之销毁;全局执行环境的销毁是在网页或浏览器关闭时执行的;
5. 执行流:每个函数都有自己的执行环境;当执行流进入一个函数时,函数的环境就被推入到一个环境栈中;在函数执行完成,栈会将其环境弹出,再把控制权返还给之前的执行环境;
6. 作用域链:当代码在环境中执行时,会创建变量对象的一个作用链;作用域链的作用是保证对执行环境有权访问的所有变量和函数的有序访问;
7. 作用域链的前端:始终都是当前执行代码所在环境的变量对象; 如果这个环境是函数,则将其活动对象作为变量对象。
8. 作用域链的后端:全局执行环境的变量对象始终都是作用域链中的最后一个对象;
9. 标识符(变量、函数、参数)的解析:是沿着作用域链一级一级地搜索过程;搜索的过程,始终都是从作用域链的前端开始,逐级向后,直到找到标识符为止;搜索到最后一个环境还是找不到的话,
就会导致错误发生;