可以先看一下这里的总结👉点击
数组创建方法
字面量定义方法
1
var arr = [1,2,3,4]
new Array
1
2
3var arr = new Array(10);//创建了长度为10的稀松数组,值都为undefined
var arr = new Array(1,2,3,4); //创建了数组[1,2,3,4]
var arr = new Array(10.2)//报错,长度不能为小数
常用方法
【会改变原数组的方法】
push
pop
shift
unshift
reverse
splice
sort
【不会改变原数组的方法】
- concat
- join
- slice
- toString
- join,返回字符串
- String.split,这个不是数组的方法,它是字符串的方法。返回数组 join和split互逆
数组和字符串之间的相互转换就可以使用join和split
手写push方法:
1 | var arr = [1, 2, 3, 4]; |
这个splice我要特别记一下,他是这样子的👇
arr.splice(从第几位开始,截取多少的长度,在切口处添加新数据)
这个位数的判断很微妙,这里特别说一下,之前一直理解错
如果是splice(-1)表示从倒数第一位置开始切。
sort不能直接使用,要传入一个函数。
1 | var arr = [1, 2, 10, 4]; |
以上是升序排序。
可以再简化一下:
1 | arr.sort(function (a, b) { |
练练👇:
1 | // 给定一个有序的数组,使其乱序 |
1 | //对象数组的排序 |
slice方法
slice(从该位开始截取,截取到该位),返回出截取出来的数组
类数组
举个栗子,arguments就是个类数组。
手写一个类数组:
1 | var obj = { |
💡类数组:属性要为索引(数字)属性,必须有length属性,最好加上push方法。而且如果加上splice方法的话,外观就更像数组了👇
1 | var obj = { |
阿里巴巴笔试题👇
1 | // 运行以下代码,问obj变成了什么样? |
这里看一下push的原理就懂了,我上文有写👆
【封装typeof】
使其可以准确判断类型
1 | function _type(target) { |
【数组去重】
方法一:利用对象属性的唯一性
1 | Array.prototype.unique = function () { |
方法二:利用ES6的[..new Set(arr)]或者Array.from(new Set(arr))
1 | var arr = [1, 2, 4, 5, 6, 4, 2,]; |
方法三: 双循环
双重for(或while)循环是比较笨拙的方法,它实现的原理很简单:先定义一个包含原始数组第一个元素的数组,然后遍历原始数组,将原始数组中的每个元素与新数组中的每个元素进行比对,如果不重复则添加到新数组中,最后返回新数组;因为它的时间复杂度是O(n^2),如果数组长度很大,那么将会非常耗费内存
1 | function unique(arr) { |
方法四:indexOf方法
数组的indexOf()方法可返回某个指定的元素在数组中首次出现的位置。该方法首先定义一个空数组res,然后调用indexOf方法对原来的数组进行遍历判断,如果元素不在res中,则将其push进res中,最后将res返回即可获得去重的数组
1 | function unique(arr) { |
来点随堂练习👇:
1 | (function (x) { |
结果为1。
1 | (function (x) { |
1 | var h = function a() { |