深拷贝实例、数组基础、数组方法、数组排序
(1) 数组
1. 声明数组 (三种方式) 三种方式构造出来的数组都继承于 Array.prototype 继承方法和属性
var arr1 = [] //数组字面量声明
var arr2 = new Array();// 通过系统内置的Array构造函数声明数组 不推荐使用
var arr3 = Array();// 这种不使用
相较于对象
var obj1 = {};// 对象字面量声明
var obj2 = new Object();// 通过系统内置的Object构造函数声明对象
var obj3 = Object();
arr = [1, 2, 3, 4, 5];
// index 数组元素的下标(索引值) 从 0 开始
// js 中数组是对象的一种形式
var obj = {
0: 1,
1: 2,
2: 3,
3: 4,
4: 5,
}
var arr = [, , ,]//最后一个是空值,会自动截掉最后一个逗号
var arr = [,2,,4];// 稀松数组
var arr1 = new Array(,2,1,,,3,1,);//用内置的构造函数构造的时候不能有空值,使用构
造函数传的是参数
var arr1 = new Array(5); // [, , , , ,] 3只填一个数字的时候就是创建数组的长度
2. 数组的操作
读取
var arr = [1, 2, 3, 4, 5, 6];
console.log(arr[6])// undefined
console.log(arr[5])// 6
写入
var arr = [1, 2, 3, 4, 5, 6];
arr[6] = ‘a’;
console.log(arr);//[1, 2, 3, 4, 5, 6, “a”]
修改
var arr = [1, 2, 3, 4, 5, 6];
arr[5] = ‘a’;
console.log(arr)// [1, 2, 3, 4, 5, “a”]
(2) 数组方法
这些方法是修改原数组
push unshift 添加
pop shift 删除
reverse
splice
sort
添加
arr.push(参数)
在数组的最后一位加,可以加多个值
返回值:经过处理以后的数组长度
var arr = [2, 3, 4];
arr.push(5)// 在数组的最后一位加,可以加多个值
arr.push(5, 6, 7)
arr.unshift(参数) -
在数组的第一位加,可以加多个值
返回值:经过处理以后的数组长度
var arr = [2, 3, 4];
arr.push(5)// 在数组的最后一位加,可以加多个值
arr.push(5, 6, 7)
删除
pop
剪切掉最后一位的值,没有参数
返回值:返回被删除的值
shift
剪切掉当前数组的第一位的值,没有参数
返回值:返回被删除的值
倒序
arr.reverse()
剪切
arr.splice(开始项的下标,剪切的长度,剪切以后最后一位开始添加的数据)
var arr = [1, 2, 3, 4, 5, 6, 7];
arr.splice(3, 2)//[1, 2, 3, 6, 7] 从下标第三位开始,删除两个元素,就是从4开始 删
除4, 5
arr.splice(3, 2, ‘a’)//[1, 2, 3, “a”, 6, 7] 从下标第三位开始,删除两个元素,就
是从4开始 删除4, 5 这时候光标在元素3和6之间,加上元素 ‘a’
arr.splice(-1, 0, ‘a’)// [1, 2, 3, 4, 5, 6, “a”, 7] 第一个参数可以是负数 -1就是
最后一个元素,从-1开始不删除元素,这时候相当于光标在元素7 之前,加上元素’a’
console.log(arr);
splice 原理
function splice(arr, index){
return index += index >= 0 ? 0 : arr.length;
}
(3) 数组排序sort()
sort() 返回值: 返回排序之后的结果
sort 是按 ascii 码进行排列的
sort(function(a, b){
})
//1.参数a,b
//2.返回值:
//负值 a就排在前面
//正值 b就排在前面
//0 保持不动
var arr = [-1, -5, 8, 0, 2];
arr.sort();// 什么都不传会默认 按升序的方法进行排序
console.log(arr)//[-1, -5, 0, 2, 8]
rr = [27, 49, 5, 7];
arr.sort()
console.log(arr)//[27, 49, 5, 7]
// sort 是按 ascii 码进行排列的 会一位一位去按照 ascii 码进行排列的
// 冒泡排序
var arr = [27, 49, 5, 7];
arr.sort(function(a, b){
// return a - b; // 升序排列
// return b - a; // 降序排列
if(a < b){
return 1;
}else{
return -1;
}
})
console.log(arr)
// 随机排序
var arr = [1, 2, 3, 4, 5, 6];
// Math.randon() -> 0-1 ;开区间
arr.sort(function(a, b){
var rand = Math.random();
if (rand - 0.5 > 0){
return ran;
}else{
return -1;
}
return Math.random() - 0.5;
})
console.log(arr)
课时16 - 数组方法、类数组
这些方法是新建一个数组
concat
arr1.concat(arr2) 拼接数组 将arr2 拼接到 arr1 的末尾
var arr1 = [‘a’, ‘b’, ‘c’];
var arr2 = [‘d’, ‘w’, ‘f’];
var arr3 = arr1.concat(arr2);
var arr4 = arr2.concat(arr1);
console.log(arr3);//[“a”, “b”, “c”, “d”, “w”, “f”]
console.log(arr4);// [“d”, “w”, “f”, “a”, “b”, “c”]
toString() 以字符串的方式进行打印
var arr1 = [‘a’, ‘b’, ‘c’, ‘d’];
console.log(arr1.toString())// a,b,c,d
slice 截取
slice (开始的下标(包含), 结束元素的下标之前)
返回值是被截取的数据
var arr = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’]
//var arr1 = arr.slice();// [“a”, “b”, “c”, “d”, “e”, “f”]
var arr1 = arr.slice(1) //[“b”, “c”, “d”, “e”, “f”]
var arr1 = arr.slice(1, 2) // [“b”]
var arr1 = arr.slice(-3, 5) // [‘d’, ‘e’]
var arr1 = arr.slice(-3, -2) // [‘d’]
console.log(arr1)
join 把每个元素取出去用括号中的参数进行分割 ,组成一个字符串
var arr1 = [‘a’, ‘b’, ‘c’, ‘d’];
var str1 = arr1.join(‘-‘);
console.log(str1)//a-b-c-d
split 把字符串通过参数1进行分割,参数2 表示长度 将根据长度进行剪切
var arr1 = [‘a’, ‘b’, ‘c’, ‘d’];
var str1 = arr1.join(‘-‘);
console.log(str1)//a-b-c-d
console.log(str1.split(‘’))//[“a”, “-“, “b”, “-“, “c”, “-“, “d”]
console.log(str1.split(‘’, 3))//[“a”, “-“]
类数组
类似于数组的对象
1. 下标类似的属性
2. 系统内置生成 length属性
3. 可以继承Array.prototype.splice 将一个对象 变成数组
4. 需要什么方法就从Array.prototype 中去继承
function test(){
console.log(arguments)
}
test(1, 2, 3, 4, 5, 6);
var arr =[1, 2, 3, 4, 5, 6];
console.log(arr)
var obj = {
‘0’: 1,
‘1’: 2,
‘2’: 3,
‘3’: 4,
‘4’: 5,
‘5’: 6,
‘length’:6
}
// push 重写
Array.prototype.push = function(elem){
this[this.length] = elem ;
this.length ++;
}
var obj = {
‘2’: 3,
‘3’: 4,
‘length’:2,
‘splice’:Array.prototype.splice,
‘push’: Array.prototype.push
}
obj.push(1);
obj.push(2);
console.log(obj);
//Object(4)
// 2: 1
// 3: 2
// length: 4
// push: ƒ (elem)
// splice: ƒ splice()
// proto: Object
# - 自定义原型方法、去重、封装typeof
(1) 去重
Array.prototype.unique = function(){
var temp = {},
newarr = [];
for (var i = 0; i < this.length; i++){
if(!temp.hasOwnProperty(this[i])){
temp[this[i]] = this[i];
newarr.push(this[i])
}
}
}
console.log(arr.unique())
(2) 封装typeof
function myTypeof(val){
var type = typeof(val);
var toStr = Object.prototype.toString;
var res = {
‘[object Array]’: ‘Array’,
‘[object Object]’:’Object’,
‘[object Number]’:’object number’,
‘[object String]’:’object string’,
‘[object Boolean]’:’object boolean’,
}
if(val === null){
return ‘null’
}else if(type === ‘object’){
var ret = toStr.call(val);
return res[ret];
}else{
return type;
}
}
var a =new Number();
console.log(myTypeof([]));
// 返回undefined,boolean,Number,string,null function
// array object object-number object- string, object-boolean
