JS开发者应懂的33个概念系列2&&3--原始类型 && 值类型和引用类型

基本类型:undefined, null, number,string,boolean (存放栈中)
引用类型:array,object(存放堆中)json

基本类型的赋值:

var a = 10;
var b = a;

a++;
console.log(a);// 11
console.log(b);// 10
复制代码

引用类型的赋值:

var a = {};
var b = a;

a.name = 'xiaogou';
b.age = 11;

console.log(a);// {name: "xiaogou", age: 11}
console.log(b);// {name: "xiaogou", age: 11}

console.log(a === b);// true
复制代码

接下来讲一说拷贝了

var a = {age: 11};
function copy(obj) {
  console.log(obj === a);// true a赋值给obj,指向同一堆地址
  obj.age = 22;
  obj = {
   age: 33
  }// obj指向了另外一个地址
  return obj;
}
var b = copy(a);
console.log(a);// {age: 22} 
console.log(b);// {age: 33}
复制代码

浅拷贝的实现方法:

方法1:bash

function simpleClone(originObj) {
    var targetObj = {};
    for (var prop in originObj) {
        targetObj[prop] = originObj[prop];
    }
    returnd targetObj;
}
复制代码

方法2:ui

var targetObj = Object.assign({}, originObj);
复制代码

深拷贝的实现方法:

方法1:spa

// window.json存在
var targetObj = JSON.parse(JSON.stringify(originObj));
复制代码

方法2:code

var lodash = require('loadsh');
var targetObj = lodash.cloneDeep(originObj);
复制代码

方法3:cdn

// 递归拷贝
function deepClone(originObj) {
    var targetObj = originObj.constructor === Array ? [] : {};
    for (var prop in originObj) {
        var value = originObj[prop];
        // 防止形成死循环
        if (value === targetObj) {
            continue;
        }
        if (typeOf value === 'Object') {
            arguments.callee(value);
        } else {
            targetObj[prop] = value;
        }
    }
    return targetObj;
}
targetObj = deepClone(originObj);
复制代码
相关文章
相关标签/搜索