ECMAScript中的变量有两种不同的数据类型的值:
基本类型:基本类型的值是简单的数据段。包括:Undefined、Null、Number、Boolean、String五种
引用类型:引用类型的值是保存在内存中的对象,引用类型对象保存的是指针。
当复制变量时,对于基本类型,会在变量对象上创建新值,然后把该值复制到新变量分配的位置上。
对于引用类型,同样也会把储存在变量中的值复制一遍,只不过这个变量储存的是指针。指针指向储存在堆中的对象:
传递参数:
ECMAScript中所有函数的参数都是按照值传递的,即把函数的外部的值复制给一个局部变量arguments对象中的一个元素。传递引用时会把引用的内存地址复制给这个局部变量,所以局部变量的变化会反映在函数外部。
function setName(obj){ obj.name = "yangxunwu"; } var person = new Object(); setName(person); alert(person.name) //"yangxunwu" 这个示例中的引用类型传递给函数参数时,其对象的地址被复制给函数参数,所以setNme()内部对对象添加属性时,也会反映到外部person对象中。function setName(obj){ obj.name = "yangxunwu"; obj = new Object(); obj.name = "new name"; } var person = new Object(); setName(person); alert(person.name); //"yangxunwu" 对象传递给函数时只是把地址复制给内部变量arguments,所以第一个obj.name= "yangxunwu",修改了外部的对象的属性,当obj = new Object()时,局部变量 被重新赋值,这个值是局部对象的值,所以即使添加了属性,这个局部对象也会在 函数执行完自动销毁。如果是引用传递,那么这里的外部person对象的name属性 会被修改为”new name“,但javascript的函数参数是值传递,所以这里依旧输 出”yangxunwu“.
检测类型
对于基本数据类型用typeof操作符,typeof对于引用类型一律返回object
基本数据类型:typeof 4 //Number typeof "4" //String typeof null //Object对于引用用类型,使用instanceof操作符类判断是什么类型的对象,所以引用类型都是Object实例,所以始终反悔true,基本数据类型不是对象,所以始终为false。
person instanceof Object; //true 5 instanceof Object //false
执行环境和作用域
1、执行环境定义了变量或函数有权访问的其他数据,每个执行环境都有与之相关联的变量对象,环境中定义的所以变量和函数都保存在这个对象中。
2、全局执行环境是最外围的一个执行环境,Web浏览器中全局执行环境是window对象,执行环境中的代码全部执行完后,环境被销毁,所以函数和变量也 被销毁。
3、代码执行时会创建一个作用域链,用途是保证对执行环境有权访问的所有变量和函数的有序访问,作用域前端是当前执行代码的环境的变量对象,下一个 变量对象来自包含的外部环境,直到全局环境。
4、标示符查询是沿着作用域链一级一级的搜索,搜索到之后就停止搜索,所以标示符相同的局部中的变量会屏蔽外部变量。
延长作用域链with和try-catch:
对于with语句来说,会将指定的对象添加到作用域链中,对伊catch,会创建新的变量对象,包含错误对象的声明。
function buildUrl(){ var loc = "http://"; with(location){ var url = href + loc; } return url; } with将location对象所有属性和方法添加到了变量对象,然后变量对象被添加到作用域的前端,with的内部定义了url变量,url也就成为了函数执行环境的一部分,所以可以作为函数被返回。 js没有块级作用域for(var i = 0; i < 10; i++){ .... } alert(i) //10