数据类型的概念
数据类型概念
javascript中的类型可以分为简单数据类型(基本数据类型)和复杂数据类型(引用类型)。与基本数据类型不同的是,引用类型的值是按引用访问的。
基本数据类型:undefined,null,boolean,number,string
引用类型:object
判断数据类型
typeof是专门用于判断数据类型的操作符,它返回一个字符串来表示操作数的数据类型。
1 2 | typeof x; typeof (x); |
typeof操作后有如下返回值:
- "undefined"——该值未定义;
- "boolean"——该值是布尔值;
- "string"——该值是字符串;
- "number"——该值是数值;
- "object"——该值是对象或者null;
- "function"——该值是函数。
1 2 3 4 5 6 | var message = 'hello' , number = 123, isTrue = true ; alert( typeof message); //string alert( typeof number); //number alert( typeof isTrue); //boolean |
基本数据类型和对象类型的区别
1. 基本类型是不可改变的,对象是可修改的。
这里的基本类型不可改变对数字和布尔值来说很好理解。对于字符串而言,每次改变,其实都是创建了一个新的字符串去替代原先的值。
1 2 3 | var s = "hello!" ; alert(s.toUpperCase()); //HELLO! alert(s); //hello! |
这里,对字符串s进行操作,并为改变字符串s,它的值仍是小写的hello。
再来看一个例子:
1 2 3 | var lang = "java" ; lang = lang + "script" ; alert(lang); //javascript |
从这个例子来看,好像是改变了变量lang,但其实不是这样的。
这个操作的实现过程是这样的:首先创建了一个能容纳10个字符的新字符串,然后在这个字符串中填充java和script,最后一步是销毁原来的字符串java和script。新创建的字符串替代了原先的字符串。
而对象是修改的,可以看这个例子:
1 2 3 4 5 6 | var o = {x:1} alert(o.x); //此时x值未被修改,为1 o.x = 3; alert(o.x); //x值被修改,为3 o.y = 2; alert(o.y); //创建新的属性y,值为2 |
2. 基本类型的比较是比较值本身,只有在它们的值相等时,它们才相等;对象的比较是引用的比较,当且仅当它们是基于同一个对象时,他们才相等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var o = {x:1},p = {x:1}; var q = o; alert(o === p); //false alert(o === q); //true q.x = 2; alert(q.x); //2 alert(o.x); //2 var x = 1,y = 1; var z = x; alert(x === y); //true alert(x === z); //true z = 2; alert(z); //2 alert(x); //1 |
看这个例子:
对象o和对象p,他们拥有相同的属性x,并且x值相等,但他们却是不相同的。定义一个变量q,将o的引用赋给它,q和o却是等价的。因为q是对o的一个引用。它们指向的是同一个对象。所以,当q改变了x的值,对象o中x的值也会跟随着改变。
由此可见,将对象赋给一个变量只是赋值的引用值,对象本身并没有被复制一次。如果想要得到一个对象的副本,必须显示的复制对象中的每个属性。
再来看,变量x和变量y同时赋值1,所以他们是相等的。再定义一个变量z,将x值赋给它,所以它和x也是相等的。当改变了z的值,并不会改变x的值,它们是独立的个体。
3. 引用类型的值,可以动态的为其添加、改变或删除属性和方法,基本类型则不行
1 2 3 | var person = new Object(); person.name = "Jack" ; alert(person.name); // Jack |
以上代码为新创建的对象添加了 name 属性,如果对象不被销毁或者这个属性不被删除,则这个属性将一直存在
但是,我们不能给基本类型的值添加属性,虽然不会导致任何错误,但在访问属性时,属性则不存在。以下例子则说明了这点:
1 2 3 | var name = "Jack" ; name.age = 27; alert(name.age); // undefined |