JavaScript基础:克隆、数组

对象克隆

  1. 判断是不是原始值
  2. 判断是数组还是对象
  3. 建立相应的数组或对象
  4. 按照同样的模式拷贝相应的数组和对象
// 深拷贝:将对象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 的数组
  1. 数组常用方法:改变原数组
    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;// 让排序的规则每次都随机
})
  1. 数组常用方法:不改变原数组
    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
}

知识和示例来源:渡一

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值