关于引用类型的值改变(Object)

来源:互联网 发布:java json转换 编辑:程序博客网 时间:2024/05/18 19:21
一、JavaScript值类型和引用类型有哪些

(1)值类型:数值、布尔值、null、undefined。

(2)引用类型:对象、数组、函数。




二、如何理解值类型和引用类型及举例
(1)值类型理解:变量的交换等于在一个新的地方按照连锁店的规范标准(统一店面理解为相同的变量内容)新开一个分店,这样新开的店与其它旧店互不相关、各自运营。

function chainStore()

{

var store1='Nike China';

var store2=store1;

store1='Nike U.S.A.';

alert(store2); //Nike China

}

chainStore();

//把一个值类型(也可以叫基本类型)store2传递给另一个变量(赋值)时,其实是分配了一块新的内存空间,因此改变store1的值对store2没有任何影响,因为它不像引用类型,变量的交换其实是交换了指像同一个内容的地址。



(2)引用类型理解:变量的交换等于把现有一间店的钥匙(变量引用地址)复制一把给了另外一个老板,此时两个老板同时管理一间店,两个老板的行为都有可能对一间店的运营造成影响。

function chainStore()

{

var store1=['Nike China'];

var store2=store1;

alert(store2[0]); //Nike China

store1[0]='Nike U.S.A.';

alert(store2[0]); //Nike U.S.A.

}

chainStore();
//在上面的代码中,store2只进行了一次赋值,理论上它的值已定,但后面通过改写store1的值,发现store2的值也发生了改变,这正是引用类型的特征,也是我们要注意的地方。

三、关于引用类型的坑

let arr1 = [{name: '小猪'}]
let arr2 = [{name: '小狗儿', age: 1}, {name: '大狗儿', age: 2}]

_.forEach(arr1, (item1, index1) => {
  _.forEach(arr2, (item2, index2) => {
    if (index2 === index1) {
      _.forIn(item2, (val, key) => {
        if (item1[key]) {
          val = item1[key]
          console.log(val)
        }
      })
    }
  })
})
console.log(arr2)
结果输出:小猪
[{name: '小狗儿', age: 1}, {name: '大狗儿', age: 2}]
val的值改变了,但是没有改变arr2的值,这是因为这只是一个值得改变,item改变不会导致数组的值发生改变


let arr1 = [{name: '小猪'}]
let arr2 = [{name: '小狗儿', age: 1}, {name: '大狗儿', age: 2}]

_.forEach(arr1, (item1, index1) => {
  _.forEach(arr2, (item2, index2) => {
    if (index2 === index1) {
      let obj = arr2[index2] // 把引用类型真正赋值给obj,obj改变arr2[index2]的值发生改变
      _.forIn(obj, (val, key) => {
        if (item1[key]) {
          obj[key] = item1[key]
          console.log(obj[key])
        }
      })
    }
  })
})
console.log(arr2)
结果输出:小猪
[{name: '小猪', age: 1}, {name: '大狗儿', age: 2}]
引用类型arr2[index2]发生改变,导致arr2发生改变,而arr2[index2]和item2的值是相等的,因为没有引用类型所以arr2不会发生改变



四、再举一个简单的例子

let arr1 = [1, 2, 3, 4]
_.forEach(arr1, (item, index) => {
  item = 1
})
console.log(arr1)
输出:[1, 2, 3, 4]
item的值不会引起数组的改变

// 做一下简单的修改
let arr1 = [1, 2, 3, 4]
_.forEach(arr1, (item, index) => {
  arr1[index] = 1
})
console.log(arr1)
输出:[1, 1, 1, 1]