多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### 数组赋值时传的是值还是址?(答案是址) 赋值形式: ~~~ var a = 1; var b = a; b=2; console.log(a); //a=1 console.log(b); // b=2 ~~~ 传址形式: ~~~ var a = [1,2]; var b = a; b[2] = 3; console.log(a); // a=[1,2,3] console.log(b); // b=[1,2,3] ~~~ 以下方式可以使数组传的是值而不是址: ~~~ 方法一(推荐使用):用jQuery中的$.extend方法,该方法转化后数组可根据第二个参数类型变化,若为{},则为对象;若为[],则为数组 var a = [1,2]; var b = $.extend(true,{},a); b[2] = 3; var c = $.extend(true,[],a); c[2] = 3; console.log(a); // a=[1,2];a依然没改变 console.log(b); // b={0:1, 1:2, 2:3};此时b为对象 console.log(c); // c=[1,2,3];此时c为数组 ~~~ ~~~ 方法二:用数组的concat方法,该方法转化后数组依然是数组形式 var a = [1,2]; var b = a.concat(); b[2] = 3; console.log(a); //a=[1,2];a依然没改变 console.log(b); //b=[1,2,3];b为数组 ~~~ ~~~ 方法三:数组的复制,不改变原数组 //slice() var arr = [1,2]; var arr1 = arr.slice(); arr1[2] = 3; console.log(arr); // arr=[1,2] console.log(arr1); // arr1=[1,2,3] //from() var arr2 = Array.from(arr); arr2[2] = 3; console.log(arr); // arr=[1,2] console.log(arr2); // arr2=[1,2,3] //[...arr] var arr3 = [...arr]; arr3[2] = 3; console.log(arr); // arr=[1,2] console.log(arr3); // arr3=[1,2,3] ~~~ ## 深度克隆: ~~~ function clone(obj) { var o, i, j, k; if(typeof(obj) != "object" || obj === null) return obj; if(obj instanceof(Array)) { o = []; i = 0; j = obj.length; for(; i < j; i++) { if(typeof(obj[i]) == "object" && obj[i] != null) { o[i] = arguments.callee(obj[i]); } else { o[i] = obj[i]; } } } else { o = {}; for(i in obj) { if(typeof(obj[i]) == "object" && obj[i] != null) { o[i] = arguments.callee(obj[i]); } else { o[i] = obj[i]; } } } return o; } ~~~