对象克隆
- 判断是不是原始值
- 判断是数组还是对象
- 建立相应的数组或对象
- 按照同样的模式拷贝相应的数组和对象
// 深拷贝:将对象obj拷贝到obj1
var obj = {
name : 'aaa',
age : 123,
gender : 'male',
car : ['visa', 'master'],
wife : {
name : "bbb",
son : {
name : 'ccc'
}
}
}
var obj1 = {};
// 利用递归拷贝对象中的引用值数据
function deepClone(origin, target) {
var target = target || {}, // 容错
toStr = Object.prototype.toString,
arrStr = "[object Array]";
for(var prop in origin){
if(origin.hasOwnProperty(prop)){ // 是自己的属性,不包含原型上的属性
if(typeof(prop) !== "null" && typeof(prop) == "object"){ // 判断属性是对象或者是数据
target[prop] = (toStr.call(origin[prop]) == arrStr) ? [] : {};
target[prop] = deepClone(origin[prop]); // 递归拷贝
}else{ // 是原始值
target[prop] = origin[prop];
}
}
}
}
deepClone(obj, obj1);
数组
数组两种创建方式:字面量和new数组对象,创建的效果是等同的,除了一种情况之外:当new Array()只有一个参数的时候,创建的一个大小为该参数;而字面量的方法创建的就是一个长度为1的数组。
var arr = [1,2,,,,,,,3,4]; // 稀松数组
var arr = new Array(10); // 长度为10 的稀松数组
var arr1 = [10]; // 长度为1 ,内容为10 的数组
- 数组常用方法:改变原数组
push、pop、shift、unshift、sort、reverse
splice
var arr = [1,2,3,5];
// 数组push的手动实现
Array.prototype.push = function () {
for(var i = 0; i < arguments.length; i++){
this[this.length] = arguments[i];
}
}
// arr.splice(从第几位开始,截取多少的长度,在切口处添加新的数据)
// 在最后一位的前面切断,切掉0个数据,然后添加一个数据4
arr.splice(-1, 0, 4);
排序方法默认按照ascii码进行排序,排序的方式是冒泡排序,但是系统为sort保留了一个能够定义排序规则的接口:
// 1. 必须写两个形参
// 2. 看返回值:返回值为负,前面的数在前;返回值为正,后面的数在前;返回值为0,不动
var arr = [4,3,10,5,6,1,2,7];
arr.sort(function (a, b){
return b - a;
});
示例2 :给一个有序数组乱序
var arr = [1,2,3,4,5,6,7];
arr.sort(function () {
return Math.random() - 0.5;// 让排序的规则每次都随机
})
- 数组常用方法:不改变原数组
concat、join->split、toString、slice
- 拼接方法示例:拼接完之后生成一个新的数组,不会改变原来的两个数组
-
slice
两个参数
slice(从参数一处位开始截取,截取到参数二处位)
一个参数
slice(从第几位开始截取到最后)
没有参数
slice() // 全部截取 -
join->split
两个互逆的方法:
var arr = [1,2,3,4,5];
var arr1 = [];
var str = arr.join("-");
arr1 = str.split("-");
类数组
既可以当数组用也可以当对象用;属性为索引(数字)属性,必须有length属性,最好加上push
// Array.prototype.push = function(target){
// this[this.length] = target; // 当obj调用该方法时,this即指向obj
// this.length++;
// }
var obj = {
"0" : "a",
"1" : "b",
"2" : "c",
"length" : 3,
"push" : Array.prototype.push,
"splice" : Array.prototype.splice
}
知识和示例来源:渡一