数组的深拷贝
1、for 循环实现数组的深拷贝
var arr = [1,2,3,4,5]
var arr2 = copyArr(arr)
function copyArr(arr) {
let res = []
for (let i = 0; i < arr.length; i++) {
res.push(arr[i])
}
return res
}
2、slice 方法实现数组的深拷贝:
将原数组中抽离部分出来形成一个新数组。我们只要设置为抽离全部,即可完成数组的深拷贝。
var arr = [1,2,3,4,5]
var arr2 = arr.slice(0)
arr[2] = 5
console.log(arr)
console.log(arr2)
3、concat 方法实现数组的深拷贝:
用于连接多个数组组成一个新的数组的方法。那么,我们只要连接它自己,即可完成数组的深拷贝。
var arr = [1,2,3,4,5]
var arr2 = arr.concat()
arr[2] = 5
console.log(arr)
console.log(arr2)
对象的深拷贝
1、万能的for循环实现对象的深拷贝
var obj = {
name: 'FungLeo',
sex: 'man',
old: '18'
}
var obj2 = copyObj(obj)
function copyObj(obj) {
let res = {}
for (var key in obj) {
res[key] = obj[key]
}
return res
}
2、转换成json再转换成对象实现对象的深拷贝
上面的代码实在是比较长,所以,用一个更暴力的方法吧!代码如下:
var obj = {
name: 'FungLeo',
sex: 'man',
old: '18'
}
var obj2 = JSON.parse(JSON.stringify(obj))
参考:javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法
其他:
常用数组的操作
/*某元素是否在数组中*/
function contains(arr, obj) {
var i = arr.length;
while (i--) {
if (arr[i] === obj) {
return true;
}
}
return false;
}
/*删除数组中指定元素*/
function removeByValue(arr, val) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == val) {
arr.splice(i, 1);
break;
}
}
return arr;
}
/*判断是否是数组*/
function isArray(o) {
return Object.prototype.toString.call(o) == '[object Array]';
}
/*数组的复制,且不影响原数组:concat方法
如果直接用等号,会影响原数组的数据
*/
var a3 = [1];
var b3 = a3.concat();
b3[0]++;
console.log("a3===" + a3[0]);
//"1" b3的修改对a3没效
关于对象的示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--
/*------------------------数组、对象等按值传递,是指变量地址的值。
数组、对象等的按值传递与数字、字符串还是有所不同的。
数字、字符串是把值直接复制进去了,而数组、对象是把变量地址复制进去的。
------------------------------*/
-->
<script>
var aArr = [];
var bArr = [];
console.log("aArr=bArr============" + (aArr == bArr));//false
var aObj = {};
var bObj = {};
console.log("bObj=aObj============" + (bObj == aObj));//false
/*------------------------------------------------------------*/
//方法内部不影响外部变量
var a = 10;
var b = 20;
function toChange(a, b) {//a,b交换数值
var c = a;
a = b;
b = c;
console.log("a==内部==========" + a); //"20"
console.log("b===内部=========" + b); //"10"
}
toChange(a, b);
console.log("a=外部==" + a); //"10"
console.log("b=外部==" + b); //"20"
/*---------------------------------------------------------------*/
var v1 = [];
var v2 = {};
var v3 = {};
function foo(v1, v2, v3) {//重新给地址赋值,不影响原有元素
//方法内部为局部变量,不影响外部变量。
v1 = [1];
v2 = [2];
v3 = {a: 3};
console.log("内部v1==" + JSON.stringify(v1));// 内部v1==[1]
console.log("内部v2==" + JSON.stringify(v2));// 内部v2==[2]
console.log("内部v3==" + JSON.stringify(v3));// 内部v3=={"a":3}
}
foo(v1, v2, v3);
console.log("外部v1==" + JSON.stringify(v1));// 外部v1==[]
console.log("外部v2==" + JSON.stringify(v2));// 外部v2=={}
console.log("外部v3==" + JSON.stringify(v3));// 外部v3=={}
/*-----------------------------------------------------------------------------------*/
/*--------------------直接等于对象,会影响原对象*/
var obj1 = {
"sortDirection": 1,
"pageNo": 0,
"pageSize": 10
};
var obj2 = obj1;
obj2.name = "hhaa";
console.log("=obj1后======" + JSON.stringify(obj1));
/*-------------------将对象的值赋给新对象,不会影响原对象*/
var obj1 = {
"sortDirection": 1,
"pageNo": 0,
"pageSize": 10
};
var obj3 = copyObj(obj1);
obj3.age = 100;
console.log("copyObj(obj1)后======" + JSON.stringify(obj1));
//拷贝对象的函数,不影响原对象
function copyObj(obj) {
var res = {};
for (var key in obj) {
res[key] = obj[key];
}
return res
}
//排序的函数
function objKeySort(obj) {
var newkey = Object.keys(obj).sort();
//先用Object内置类的keys方法获取要排序对象的属性名,再利用Array原型上的sort方法对获取的属性名进行排序,newkey是一个数组
var newObj = {};//创建一个新的对象,用于存放排好序的键值对
for (var i = 0; i < newkey.length; i++) {//遍历newkey数组
newObj[newkey[i]] = obj[newkey[i]];//向新创建的对象中按照排好的顺序依次增加键值对
}
return newObj;//返回排好序的新对象
}
</script>
</body>
</html>