复制js变量问题(面试常考)

内容导读

前端面试时经常会有一个问题: 复制变量值 。当使用num1的值来初始化num2时,num2中也保存了值2。此后对两个变量进行任何操作都互不影响。当从一个变量向另一个变量复制引用类型值时,同样也会将存储在变量对象中的值复制一份放在为新变量分配的空间里,但是这个值的副本其实是一个指针,这个指针指向存储在堆中的一个对象。复制结束后,两个变量其实引用的是一个对象。因此,改变一个变量就会影响到另一个变量,因为此刻改变的是堆中共同引用的对象。

js变量中存储了两种不同数据结构的值 基本类型值 和引用类型值。

基本类型值值的是简单的数据段,而引用类型值是指那些可能由多个值构成的对象。

前端面试时经常会有一个问题:复制变量值。 这道题考察的就是对基本类型值和引用类型值理解了。

复制基本类型值

var num1 = 2;var num2 = num1

此时,num1中保存的值是2。当使用num1的值来初始化num2时,num2中也保存了值2。但num2中的2与num1中的2是完全独立,互不影响的,该值知识num1中2的一个副本。此后对两个变量进行任何操作都互不影响。

复制引用类型值

var obj1 = new Object();var obj2 = obj1;obj1.name = "xiaoming";alert(obj2.name)

当从一个变量向另一个变量复制引用类型值时,同样也会将存储在变量对象中的值复制一份放在为新变量分配的空间里,但是这个值的副本其实是一个指针,这个指针指向存储在堆中的一个对象。复制结束后,两个变量其实引用的是一个对象。因此,改变一个变量就会影响到另一个变量,因为此刻改变的是堆中共同引用的对象。

值得注意的一点:js中函数传递参数的时候都是按值传递的,就是像基本类型值复制一样的操作,即使参数是一个对象,也是按值传递,不是按引用传递的。


分享到:


相關文章: