javascript变量,作用域和内存问题(一)
js对象的引用是很有意思的,引用型对象是不可以直接引用的,我猜测这是原型的来源之一,有大神请详解或斧正。
“引用类型的值是保存在内存中的对象。与其他语言不同,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。
在很多语言中,字符串以对象的形式来表示,因此被认为是引用类型的。ECMAScript放弃了这一传统。”(from《js高级程序设计》)
一.动态的属性
我们可以这样写:
这是因为,我们只能给引用类型的值添加属性,而不能给基本类型的值添加属性。
二.复制值
基本类型是直接复制,而引用类型是复制一个指针指向原来的值,并且此时会分配空间,改变一个值同时也会改变另外一个值,包括属性等。
三.参数传值
参数传值时,基本类型是复制一个值,而引用类型是复制的参数的地址,而实际上此时发挥了闭包的功能,不知道我的理解对不对?
这个函数在调用时,因为参数是基本类型(arguement值),所以count值和参数中的num值是互不相干的,仅仅是复制了一下。
这个函数中,obj和person指向的是同一个对象,所以person才会有name这个属性。
有的错误的认识是在局部作用域的局部变量被修改后,会在全局变量中修改,所以就是引用类型。看例子:
局部变量会在函数执行完毕后被丢弃。
“引用类型的值是保存在内存中的对象。与其他语言不同,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。
在很多语言中,字符串以对象的形式来表示,因此被认为是引用类型的。ECMAScript放弃了这一传统。”(from《js高级程序设计》)
一.动态的属性
我们可以这样写:
var person = new Object(); person.name = "Nicholas"; //"Nicholas" alert(person.name); 但是,我们不能这样写: var name = "Nicholas"; name.age = 27; //undefined alert(name.age);
二.复制值
基本类型是直接复制,而引用类型是复制一个指针指向原来的值,并且此时会分配空间,改变一个值同时也会改变另外一个值,包括属性等。
三.参数传值
参数传值时,基本类型是复制一个值,而引用类型是复制的参数的地址,而实际上此时发挥了闭包的功能,不知道我的理解对不对?
function addTen(num) { num += 10; return num; } var count = 20; var result = addTen(count); //20,没有变化 alert(count); //30 alert(result);
这个函数在调用时,因为参数是基本类型(arguement值),所以count值和参数中的num值是互不相干的,仅仅是复制了一下。
function setName(obj) { obj.name = "Nicholas"; } var person = new Object(); setName(person); //"Nicholas" alert(person.name);
这个函数中,obj和person指向的是同一个对象,所以person才会有name这个属性。
有的错误的认识是在局部作用域的局部变量被修改后,会在全局变量中修改,所以就是引用类型。看例子:
function setName(obj) { obj.name = "Nicholas"; obj = new Object(); obj.name = "Greg"; } var person = new Object(); setName(person); //"Nicholas" alert(person.name);
局部变量会在函数执行完毕后被丢弃。
四.检测类型
typeof只能检测number,string,boolean,undefined的值,而不能检测null和object的值,返回的都是object。
另:“使用typeof操作符检测函数时,该操作符会返回"function"。在Safari 5及之前版本和Chrome 7及之前版本中使用typeof检测正则表达式时,由于规范的原因,这个操作符也返回"function"。ECMA-262规定任何在内部实现[[Call]]方法的对象都应该在应用typeof操作符时返回"function"。由于上述浏览器中的正则表达式也实现了这个方法,因此对正则表达式应用typeof会返回"function"。在IE和Firefox中,对正则表达式应用typeof会返回"object"。”
引用类型的检验使用instanceof,语法是:result = variable instanceof constructor,如例:
// 变量person是Object吗?
alert(person instanceof Object);
// 变量colors是Array吗?
alert(colors instanceof Array);
// 变量pattern是RegExp吗?
alert(pattern instanceof RegExp);
typeof只能检测number,string,boolean,undefined的值,而不能检测null和object的值,返回的都是object。
另:“使用typeof操作符检测函数时,该操作符会返回"function"。在Safari 5及之前版本和Chrome 7及之前版本中使用typeof检测正则表达式时,由于规范的原因,这个操作符也返回"function"。ECMA-262规定任何在内部实现[[Call]]方法的对象都应该在应用typeof操作符时返回"function"。由于上述浏览器中的正则表达式也实现了这个方法,因此对正则表达式应用typeof会返回"function"。在IE和Firefox中,对正则表达式应用typeof会返回"object"。”
引用类型的检验使用instanceof,语法是:result = variable instanceof constructor,如例:
// 变量person是Object吗?
alert(person instanceof Object);
// 变量colors是Array吗?
alert(colors instanceof Array);
// 变量pattern是RegExp吗?
alert(pattern instanceof RegExp);