数据类型的概念

数据类型概念

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

上一节:变量的概念

下一节:数据类型