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); //=> {}