JasmineHua's blog

javascript的类型及类型理解

前言

由于之前的一次面试中被问到js有几种类型,我回答了8种,并回答了哪8种。但很显然看对方的表情就知道这不是她想要的答案。回家在整理的时候知道js的类型分为两类:原始类型(primitive type)和对象类型(object type)。于是写了这篇文章做一个总结。

JavaScript原始类型和对象类型有哪些

  1. 原始类型:Number,Boolean,String,Null,Undefined
  2. 对象类型:Object,Array,Function

不可变的原始值和可变的对象引用

原始值

原始值都是不可更改的:任何方法都无法更改一个原始值。对于数字,布尔值,Null和Undefined来说很显然在被创建出来后是不可改变的,变量只能通过更改指向别的内存空间来改变变量的值。而对于字符串来说就不是那么明显了,因为字符串看起来和数组有很多共通点,我们会认为字符串可以像数组一样通过制定的索引来修改其中的字符。事实上,javascript是禁止这样做的。

1
2
3
var s = 'hello'; //定义一个字符串
s[0] = 1; //=> 1:为某个索引赋值
s //=> "hello":原始字符串并未改变

对于原始值的比较。只要两个原始值相同即相等,如果两个字符串比较,当且仅当他们的长度相等且每个索引字符都相等时,它们相等。

1
2
3
var s1 = '123'; //定义一个字符串s1
var s2 = '123'; //定义一个值与s1都相同的字符串
s1 === s2 //=> true:两字符串相等

对象引用

对象类型和原始类型不同,首先它们是可变的,它们的值是可修改的。

1
2
3
4
5
6
7
var o = { x:1 }; //定义一个对象
o.x = 2; //通过修改对象属性值来更改对象
o //=> Object {x: 2}
var a = [1,2,3]; //定义一个数组
a[0] = 2; //通过更改数组的元素来更改数组
a //=> [2, 2, 3]

对象类型的比较与值类型不同,即使两个对象包含同样属性及相同的值,它们也不相等。对象的比较均是引用的比较,当且仅当它们引用同一个基对象时,它们才相等。

1
2
3
4
5
6
7
8
9
10
11
12
var o1 = { x:1 }; //定义一个对象
var o2 = { x:1 }; //定义一个属性及值与s1都相同的对象
o1 == o2 //=> false:两个对象不相等
var a1 = [1,2,3]; //定义一个数组
var a2 = [1,2,3]; //定义一个索引元素与s1都相同的数组
a1 == a2 //=> false:两个数组不相等
var a1 = []; //定义一个空数组
var a2 = a1; //变量a2引用同一个数组
a2[0] = 1 //=> 通过变量a2来修改引用数组
a1 === a2 //=> true:a1和a2引用同一个数组,所以两者相等