ECMAScript数组是有序列表,是存放多个值的集合。
有以下特性:
1.每一项都可以保存任何类型的数据。
2.数组的大小是可以动态调整。
3.数组的length属性:可读可写,可以通过设置length的值从数组的末尾移除项或向数组中添加新项
创建
字面量:var arr=[];
构造函数:var arr=new Array();
任意数据类型,数组的长度可变可指定arr.length=6;
赋值
定义时赋值:var arr=[100,200,…];
通过索引下标赋值:arr[0]=‘hello’;arr[3]=‘world’;
var arr=new Array(10);//一个整型,新建指定长度的空数组
var arr=new Array(10.1);//error 不允许传递一个浮点型的数据
访问使用
[]访问法,索引下标的使用
length=max(index)+1 max-index=length-1
注意:数组最多可以包含4 294 967 295个项
遍历
1.for(var i=0;i<=strs.length;i++) {…} i下标
2.while(i<=strs.length){…i++;}
3.var i=0;do{…i++;}while(i<=strs.length);
4.for(var i in strs){…} 自己进行迭代、判断结束
栈 队列
栈
push() 可接受任意类型的参数,将它们逐个添加到数组的末尾,并返回数组的长度
pop()从数组的末尾移除最后一项,减少数组的length值,返回移除的项
队列:
shift() 移除数组中的第一个项并且返回该项,同时将数组的长度减一。
unshift() 在数组的前端添加任意个项,并返回新数组的长度。
var arr=[];
arr.push(100,200);
arr.unshift('hello','world');
console.log(arr,arr.length);
//hello world 100 200 4
console.log(arr.pop());//200
console.log(arr.shift());//hello
console.log(arr,arr.length);//world 100 2
数据类型检测
1.typeof 判断当前变量数据类型
var arr=[];
console.log(typeof arr);//object
2.instanceof 当前变量是某个构造函数对应的原型链上的吗,小–>大
console.log(arr instanceof Array);//true
console.log(arr instanceof String);//false
console.log(arr instanceof Object);//true
3.isPrototypeOf 当前变量是我的子孙后代吗 大–>小
console.log(Array.prototype.isPrototypeOf(arr));//true
console.log(Number.prototype.isPrototypeOf(arr));//false
4.Array.isArray 是否为数组类型
console.log(Array.isArray(arr));//true
console.log(Array.isArray(new Array()));//true
console.log(Array.isArray('abc'));//false
console.log(Array.isArray(null));//false
4.数组中API函数功能总结
函数的名称 | 功能 | 传参 | 返回值 | 执行环境对象 |
---|---|---|---|---|
push() | 数组末尾添加元素 | 任意类型参数 | 新数组的长度 | 有影响 |
pop() | 删除数组末尾一个元素 | 无 | 移除的项 | 有影响 |
shift() | 删除数组开头的一个元素 | 无 | 移除的项 | 有影响 |
unshift() | 数组开头添加元素 | 任意类型任意多个 | 新数组的长度 | 有影响 |
splice() | 删除、新增、插入、替换 | 至少是两个index_start(可正可负),count,新增的数据项s | 删除的数据项 | 有影响 |
sort() | 数组元素排序 | 默认排序无参,自定义排序参数为比较函数,比较函数有两个参数 | 排序后的数组 | 有影响 |
reverse() | 反转数组中的元素 | 无 | 反转后的数组 | 有影响 |
Array.isArray() | 判断是否为数组类型 | 当前变量 | ture/false | 没影响 |
join() | 数组序列化 | 可以是指定的分隔符 | 以指定分隔符分隔字符串的形式返回数组 | 没影响 |
toString() | 数组序列化 | 无 | 以逗号分隔字符串的形式返回数组 | 没影响 |
concat() | 数组的一层拼接 | 任意数据类型,任意多个 | 拼接后的新数组 | 没影响 |
slice() | 截取数组的一部分 | [index_start,index_end) | 截取的部分 | 没影响 |
indexOf(),lastIndexOf() | 查找数据项在数组中的索引下标 | 数据项,起始索引下标(默认不写=0) | 存在返回索引下标,不存在返回-1 | 没影响 |
every() | 对每一个数据项执行函数,都满足要求返回true,否则返回false | 函数作为参数Fcname(item,index,arr){return bool;} | true/false | 没影响 |
some() | 对每一个数据项执行函数,有一个满足要求的就返回true,所有的都不满足要求返回false | 函数作为参数Fcname(item,index,arr){return bool;} | true/false | 没影响 |
filter() | 对每一个数据项执行函数,满足要求的数据项保存起来,不满足要求的就不要 | 函数作为参数Fcname(item,index,arr){return bool;} | 满足要求的的数据项组成的数组 | 没影响 |
map() | 一 一映射:对每一个数据项执行函数的结果进行保存 | 函数作为参数Fcname(item,index,arr){return xx;} | 每次函数调用的结果组成的数组(映射之后的新数组) | 没影响 |
forEach() | 遍历 | 函数作为参数Fcname(value,index,arr){没有返回值} | 无返回值 | 没影响 |
————————————————
版权声明:原文链接:https://blog.csdn.net/JYYQXRM/article/details/120004908
浅拷贝深拷贝
浅拷贝:
基本数据类型拷贝的是值,指向的是同一片内存空间;
引用类型拷贝的是地址,因此当值是引用类型时,新创建的值如果发送变化,那么指针指向的内容也就发送变化,因此原来的值也就改变。
浅拷贝方法有:
object.assign
扩展运算符let cloneObj = {…obj}
concat运算符
slice拷贝数组
手工实现
深拷贝:
指的是在内存中开辟一个新的空间,用来存放拷贝过来的值,新创建的值改变,不会影响到原有的值(因为它们不属于同一个地址),指向的不是同一个内存空间
深拷贝方法:JSON.stringfy、手写递归实现