ECMAScript 变量可能包含两种不同的数据类型的值,基本类型值和引用类型值。基本类型值指的是简单的数据段,而引用类型值指由多个值构成的对象。
在将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值。常用的5种基本数据类型:Undefined、Null、Boolean、Number和String。它们都是按值访问的。因为可以操作保存在变量中的实际值。
引用类型的值是保存在内存中的对象。与其他语言不同,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际是在操作对象的引用而不是实际的对象,为此,引用类型的值是按引用访问的。
基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。引用类型值指的是那些保存在堆内存中的对象,意思是变量中保存的实际上只是一个指针。
1. 定义变量
比如:
var person = new Object();
person.name = "hello";
alert(person.name);
基本类型的值不能添加属性,尽管这样做不会导致任何错误。比如:
var name = "Nicholas";
name.age = 20;
alert(name.age); //undefined
[1]定义:可变的量,相当于给一个不定的数据起了一个外号。变量是存储信息的容器。
[2]特性:js中的变量是松散类型的,可以保存任何类型的数据。它只是在特定时间用于保存特定值的一个名字而已。由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变。
[3]变量声明:变量可以在声明时赋值,但不能有其他操作,如+=、-=等
var a = 2;//是正确的
var a += 2;//是错误的
var a = 2++;//是错误的,++只能用于变量,不能用于常量
[4]注意:用var操作符定义的变量将成为定义该变量的作用域中的局部变量。若省略var操作符,可以创建一个全局变量,但在严格模式下会抛出 ReferenceError错误
[5]var:使用var声明的变量会自动被添加到最接近的环境中。如果初始化变量时没有使用var声明,该变量会自动被添加到全局环境。在严格模式下,初始化未经声明的变量会导致错误。
[6]局部变量:如果局部环境中存在同名标识符,就不会使用位于父环境中的标识符。任何位于局部变量color的声明之后的代码,如果不使用window.color都无法访问全局color变量
2. 变量的复制
var num1 = 10;
var num2 = num1;
看到上面的例子,是把一个变量num1 复制给另一个变量num2。num2的值只是num1中的10的一个副本,这2个变量可以参与任何操作而不会相互影响。
当变量间复制引用类型的值时,就有不同之处。这个副本实际是一个指针,指向存储在堆中的一个对象。复制结束后两个变量实际上将引用同一个对象。因此,改变其中一个变量就会影响另一个变量。如下面的例子:
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //Nicholas
3、检测类型
typeof操作符是确定一个变量是字符串、数字、布尔值,还是undefined的最佳工具。如果变量的值是一个对象或null,则typeof操作符会返回“object”。
在检测引用类型的值时,typeof操作符用处不大,通常,我们并不是想知道某个值是对象,而是想知道它是什么类型的对象。为此,ECMAscript提供了instanceof操作符,例如:
alert(person instanceof Object);//变量person是Object吗?