javascript中给变量赋值,是引用还是复制?

来源:互联网 发布:mac左右分屏 编辑:程序博客网 时间:2024/06/04 19:48

要搞清这个问题,首先要搞清楚在javascript中的值有哪些类型,总结如下:
javascript中的值类型分为两大类:基本类型和引用类型,所谓的引用类型就是对象,每种类型下面又分为5中类型:
## 基本类型 ##
+ 数字类型
+ 字符串类型
+ 布尔类型(true 和 false)
+ undefined
+ null
## 引用类型 ##
+ 函数
+ 数组
+ 日期
+ 正则
+ 错误
再次强调一边,所有的引用类型都是对象,也就是Object对象下的一个类。

注意:所有的基本类型的值都是不会变的,比如一个字符串’abcd’,它的值永远是’abcd’,不可能发生改变,当然如果你把它赋给一个变量,var a = ‘abcd’,然后给a赋其他的值,那么a的值可以改变,但是’abcd’这个字符串本身的值没有发生任何变化。包括使用某些自带的函数,比如a.toUpperCase();这个函数返回的字符串的大写形式’ABCD’;注意,是“返回”一个新的值,而不是改变原有的值!此时,变量a的值仍然是’abcd’,除非你使用了a=a.toUpperCase()。
以上的分析可以看到,对于基本类型,将其值赋给一个变量时,就是将这个值复制给变量,值本身不会发生任何改变,变量的值可以改变。变量之间是可以比较的,比较的就是他们本身的值。

而引用类型的情况却大不相同:

var a = [1,2,3];//定义一个数组为例var b = a;b[3] = 4;console.log(a.toString(), b.toString())';//输出结果:1,2,3,4 1,2,3,4

上面的例子说明,定义一个对象时,这个对象在内存中建立,如果把这个对象赋给一个变量,那么这个变量仅仅是对这个对象的引用,而不是将对象复制到了该变量中!也就是变量a中存储的是指向对象的地址。将a的值赋给b;也就是将a中的地址赋给了变量b,这时候变量a和b都指向同一个对象,所以b值的改变就会直接引起对象本身的改变,所以变量a所引用的数组值肯定也会发生变化!
注意:对象的比较与基本类型不同。即使两个对象完全相同,比如两个完全相同的数组,它们也是不相等的!只有两个变量指向同一个对象时,它们两个才完全相等。如:

var a=[1,2,3], b=[1,2,3];console.log(a===b);//falsevar c=a;console.log(c===a);//true
0 0
原创粉丝点击