ECMAScript变量可包含两种不同数据类型的值:**基本类型值和引用类型值.**
基本类型值指的是简单的数据段,引用类型值指的是那些可能有多个值构成的对象.5中基本数据类型有Number,Boolean,String,Undefined,Null,这五种基本数据类型是按值访问的,因为可以操作存储在变量中的实际的值..与其它语言不同,Javascript不允许直接访问内存中的位置,即不能直接操作对象的内存空间.在操作对象时实际上是在操作对象的引用而不是实际的对象.因此,引用类型的值是按引用访问的.
定义基本类型值和引用类型值的方式类似:创建一个变量并为该变量赋值.但当值保存到变量中后,对不同类型值可以执行的操作则大相径庭.对于引用类型值,可以为其添加属性和方法,也可以改变和删除其属性和方法.
例子:
var person=new Object();
person.name="Nicholas";
alert(person.name);//"Nicholas"
以上代码我们创建了一个对象并将其保存在理变量person中,然后我们为该对象添加了一个名为name的属性,并将字符串“Nicholas”赋给了这个属性。之后通过alert()函数访问了这个新属性。如果对象不被销毁或者这个属性不被删除,则这个属性会一直存在。但我们不能给基本类型的值添加属性,尽管这样不会导致任何错误,例如
var name="wyuif";
name.age=27;
alert(name.age);//undefined
复制变量值:
对于基本类型值:会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置,eg
var num1=5;
var num2=num1;
在此,num1中保存的值是5,当使用num1初始化num2时,num2也保存了5,但num1与num2中的5是完全独立的,该值只是num1中5的一个副本。此后这两个变量可以参与任何操作而互不影响。如下图所示
对于引用类型的值:同样将存储在变量对象中的值复制一份放到为新变量分配的空间中,不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此改变其中一个变量,就会影响另一个变量。例如
var obj1=new Object();
var obj2=obj1;
obj1.name="Nicholas";
alert(obj2.name);//"Nicholas"
首先obj1保存了一个对象的新实例,然后这个值被复制到了obj2中;换句话说,obj1和obj2都指向同一个对象。这样当为obj1添加name属性后,可以通过obj2来访问这个属性,因为这两个变量引用的是同一个对象。
ECMAScript中的所有函数的参数都是按值传递的。即把函数外部的值赋给函数内部的数,就是把值从一个变量复制到另一个变量一样。
检测类型用typeof操作符。typeof操作符是确定一个变量是字符串、数字、布尔值、undefined的最佳工具。如果变量的值是一个对象或者null,则typeof操作符会返回“object”。
若想知道某个值是什么类型的对象,使用instanceof操作符,语法如下:
result=variable instanceof constructor
若变量是给定引用类型的实例(根据他的原型链来识别),则instanceof操作符会返回true。
alert(person instanceof Object);//变量person是Object吗?
alert(colors instanceof Array);//变量colors是Array吗?
alert(pattern instanceof RegExp);//变量爬pattern是RegExp吗?
根据规定所有引用类型的值都是Object的实例。因此在检测一个引用类型值和Object构造函数时,instanceof操作符始终会返回true。