遇到问题场景:
定义一个方法对数据进行操作,但是通过参数来改变数据,发现改变不了数据的值 。如下:
function f(l,k) {
l = k;
return l;
}
var a = {"name": "123"};
var b = {"name": "345"};
f(a,b);
console.log(a);//{"name": "123"}由此知道这样直接通过参数赋值给引用类型数据 只是改变指针,而没有真正改变堆内存的数据。
这里就想到用Object.assign()
function f(l,k) { Object.assign(l,k); return l;}以下是网上寻找的相对较好的解释。
<script type="text/javascript">
var bb = {n:1};//引用类型:Function,Array,Object
(function (bb) {
bb.n = 2;
console.log(bb.n);
})(bb)
console.log(bb.n);
//输出2 2
var foo = 1; //基本类型string,number,boolean,null,undefined
(function (foo) {
foo = 2;
console.log(foo);
})(foo);
console.log(foo)
</script>
//输出2 1
这里是引用类型与基本类型的问题
1.基本类型所有的值存储在存区,js可以直接对值进行操作;而引用类型的所有值存储时,是堆内存中的,js不能直接操作值,只能擦操作属性改变值;
基本类型复制时原数据不受到影响,而引用类型则是通过复制指针,实现复制,但指针指向的是同一个对象,所以改变其中一个两个 都改变;
更多参考: