5.16 clone

5.16.1 语法

_.clone(object)

5.16.2 说明

创建一个克隆对象。 因为对象或数组默认都通过引用拷贝的,不会复制。

5.16.3 代码示例

示例一:基本用法

_.clone({name: 'moe'}); //=> {name: 'moe'}

示例二:对象是引用拷贝的

var obj = {name: 'moe'};
var obj2 = obj;
var obj3 = _.clone(obj);

//看上去是一样的
console.log(obj2); // Object => {name: "moe"}
console.log(obj3); // Object => {name: "moe"}

//实际上不一样了
console.log(obj === obj2); //=> true
console.log(obj === obj3); //=> false

//obj改变了
obj.name = 'iori';

//引用的对象也变了
console.log(obj2); // Object => {name: "iori"}

//克隆的对象不会被改变
console.log(obj3); // Object => {name: "moe"}

5.16.4 源码展示

_.clone = function(obj) {
    //如果不是对象返回obj
    if (!_.isObject(obj)) return obj;

    //如果是数组返回obj.slice()
    //如果是对象,就用{}上合并obj
    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
};

5.16.5 如果不是对象返回obj

//5种基本类型是按值访问的,所以克隆的对象也是按值比较的

_.clone(1); // Number => 1
_.clone('1'); // String => 1
_.clone(true); //=> true
_.clone(undefined); //=> undefined
_.clone(null); //=>  null

5.16.6 克隆一个数组

var arr = [1, 2, 3];
var arr2 = arr;
var arr3 = arr.slice(); //克隆数组就这么简单

//添加一个
arr.push(4);

console.log(arr2); //=> [1, 2, 3, 4]
console.log(arr3); //=> [1, 2, 3]

5.16.7 克隆函数返回空对象

一些不可拷贝的对象,例如error对象、functions, DOM nodes等都会返回空对象。

var func = function(){
    alert(1);
};

var func2 = _.clone(func);

console.log(func2); //=> {}