你的位置:首页 > Java教程

[Java教程]javascript变量,作用域和内存问题(一)


      js对象的引用是很有意思的,引用型对象是不可以直接引用的,我猜测这是原型的来源之一,有大神请详解或斧正。
    “引用类型的值是保存在内存中的对象。与其他语言不同,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。
     在很多语言中,字符串以对象的形式来表示,因此被认为是引用类型的。ECMAScript放弃了这一传统。”(from《js高级程序设计》)

       一.动态的属性
            我们可以这样写:
var person = new Object();person.name = "Nicholas";//"Nicholas"alert(person.name);但是,我们不能这样写:var name = "Nicholas";name.age = 27;//undefinedalert(name.age);

     这是因为,我们只能给引用类型的值添加属性,而不能给基本类型的值添加属性。

   二.复制值
     基本类型是直接复制,而引用类型是复制一个指针指向原来的值,并且此时会分配空间,改变一个值同时也会改变另外一个值,包括属性等。
   

 


这个函数中,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);