function sum(a, b) {
let args = Array.prototype.concat.apply([], arguments);//apply方法会把第二个参数展开
console.log(args.reduce((sum, cur) => sum + cur))
}
sum(1, 2);//3
if (!Array.prototype.myMap) {
Array.prototype.myMap = function (callback, thisArr) {
var This, K, A;
if (typeof this == null) {
throw TypeError("this is undefiend");
}
if (typeof callback !== "function") {
throw TypeError(`${callback} is no Function `);
}
if(arguments.length) {
This = thisArr;
}
var O = Object(this);
// 很特殊的写法 提高了程序的鲁棒性
var len = O.length >>> 0;
K = 0;
A = new Array(len);
while (K < len) {
var keyValue, callbackValue;
if (K in O) {
keyValue = O[K];
callbackValue = callback.call(This, keyValue, K, O);
// A.push(callbackValue)
A[K] = callbackValue;
}
K++;
}
return A;
};
}
var arr = [1, 2, 3, 4];
arr.myMap(function (target, index, arrs) {
console.log(`${target} + ${index} + ${arrs}`);
});
4.4 如果为 filter 提供一个 thisArg 参数,则它会被作为 callback 被调用时的 this 值。否则,callback 的 this 值在非严格模式下将是全局对象,严格模式下为 undefined。
if (!Array.prototype.myfilter) {
Array.prototype.myfilter = function (callback, thisArr) {
if (this == null) {
throw TypeError("this is undefiend");
}
if (typeof callback !== "function") {
throw TypeError(`${callback} is no Function`);
}
var T = arguments.length > 2 ? thisArr : void 0;
var i = -1,
O = Object(this),
len = O.length,
arr = new Array(len),
c = 0;
if (!T) {
while (++i != len) {
if (i in O) {
if (callback(O[i], i, O)) {
arr[c++] = O[i];
}
}
}
} else {
while (++i != len) {
if (i in O) {
if (callback.call(T, O[i], i, O)) {
arr[c++] = O[i];
}
}
}
}
arr.length = c
return arr;
};
}
var arr = [1, 2, 3, 4];
var a = arr.myfilter(function (target, index, arrs) {
// console.log(`${target} + ${index} + ${arrs}`);
if (target > 2) {
return true;
}
});
console.log(a);
if (!Array.prototype.myIndexof) {
Array.prototype.myIndexof = function (searchElement, fromIndex) {
if (this == null) {
throw new TypeError("");
}
var O = Object(this);
var len = O.length;
if(len == 0){
return -1
}
var K = +fromIndex || 0;
if (Math.abs(K) > Infinity) {
K = 0;
}
if(K > len) {
return -1;
}
var I = Math.max(K >= 0 ? K : len - Math.abs(K), 0)
while (I < len){
if(I in O && O[I] === searchElement){
return I
}
I++
}
return -1
};
}
var arr = [1, 2, 3, 4, 5];
var a = arr.myIndexof(1,0);
console.log(a);
if (!Array.prototype.mylaseIndexof) {
Array.prototype.mylaseIndexof = function (searchElement, fromIndex) {
var K;
if(this == null ) {
throw new TypeError('')
}
var O = Object(this);
var len = O.length >>> 0;
if(len == 0 ){
return -1
}
var n = +fromIndex || 0;
if(Math.abs(n) == Infinity || Math.abs(n) > len-1 ) {
return -1
}
K = n >= 0 ? n : len - Math.abs(n)
while(K <= len ){
var i = len - K;
if(O[i] === searchElement){
return i
}
K++
}
return -1
};
}
var arr = [1, 2, 3, 4, 5];
var a = arr.mylaseIndexof(1,3);
console.log(a);
2.断言查找
2.2find()
2.2.1 参数:find(callback,thisArr) 回调函数:callback(element, index, array) thisArr: 用作回调时 this 对象
if (!Array.prototype.myReduce) {
Array.prototype.myReduce = function (callback, initValue) {
if(this == null ) {
throw new TypeError('this is undefiend')
}
if(typeof callback !== 'function') {
throw new TypeError(`${callback} is no Function`)
}
var O = Object(this);
var len = O.length >>> 0;
var value, K = 0;
// initValue = 0 && this中是空值
if(arguments.length >= 2) {
value = arguments[1];
}else{
// 很巧妙的去求数组中的第一个值
while(K < len && !(K in O)){
K++
}
// 数组空值报错
if(K > len) {
throw new TypeError('数组是空的');
}
value = O[K++]// 这里是K
}
// 如果 k = len 会直接返回
while(K < len){
if(K in O) {
value = callback(value, O[K], K, O);
}
K++
}
return value;
};
}
// test
var a = arr.myReduce(function (initvalue,target, index, arrs) {
if(initvalue.indexOf(target) === -1){
initvalue.push(target) ;
}
return initvalue;
},[]);
console.log(a);
reduceRight()
用法和 reduce 类似 但是是从数组的最后一个元素开始遍历
if (!Array.prototype.myReduceRight) {
Array.prototype.myReduceRight = function (callback) {
if(this == null)
throw new TypeError('')
if(typeof callback !== 'function'){
throw new TypeError('')
}
var O = Object(this);
var len = O.length;
var value, K = len;
if(arguments.length >= 2 ) {
value = arguments[1]
}else{
while(K < len && !(K in O)){
K--
}
if(K > len) {
throw new TypeError('')
}
value = O[K--]
}
while(K > -1) {
if( K in O){
value = callback(value, O[K], K, O);
}
K--
}
return value
};
}
var arr = [1,2,3,4,5]
var a = arr.myReduceRight(function (initvalue,target, index, arrs) {
if(initvalue.indexOf(target) === -1){
initvalue.push(target) ;
}
return initvalue;
},[]);
console.log(a);
if(!Array.myFrom){
Array.prototype.myFrom = (function(){
var isNum = function (num) {
if(num && isFinite(num)&& num >= 0 && num < Math.pow(2,53)-1 ){
return true
}
else{
return false
}
}
var toFunction = function (func) {
return typeof func === 'function' || Object.prototype.toString(func) === '[object Function]';
}
return function from(arrayLike/*, callback, thisArg*/) {
if(arrayLike == null){
throw new TypeError('')
}
var mapFn = arguments.length > 1 ? arguments[1] : void 0;
var T;
if(typeof mapFn !== 'undefined'){
if(toFunction(mapFn)){
throw new TypeError('')
}
if(arguments.length > 2) {
T = arguments[2]
}
}
var C = this;
var O = Object(arrayLike);
var len = isNum(O.length) ? O.length : 0;
var A = toFunction(C) ? Object(new C(len)) : new Array(len);
var K = 0,
kvalue;
while( K < len ) {
kvalue = O[K]
if(mapFn) {
A[K] = typeof T === 'undefined' ? mapFn(kvalue, K) : mapFn.call(T, kvalue, K);
}else{
A[K] = kvalue;
}
K++;
}
return A
}
}())
}
var a = Array.prototype.myFrom({
0: 0,
1: 1,
2: 2,
3: 3,
length: 4
})
console.log(a)
2.Array.of()
作用:方法创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。
参数: 任意参数
创建的数组为不含 undefined 数组
if(!Array.myof){
Array.prototype.myof = function(element){
var len = arguments.length;
if(len == 0){
return [];
}
var K = 0;
var I = 0;
var A = new Array();
while(K < len){
if(arguments[K]){
A[I++] = arguments[K]
}
K++;
}
return A;
}
}
var a = Array.prototype.myof(1,2,3,4,5,6)
console.log(a)
title: "数组中的常规操作"
数组与类数组的转换
4.使用
Array.concat()
concat 默认情况下不会将类数组对象视作数组——仅在 Symbol.isConcatSpreadable 被设置为真值(例如,true)时才会将类数组对象视作数组。具体参考MDN
函数中的
arguments
可以使用concat
的方式 去将类数组参数展开这样说明是具有Symbol.isConcatSpreadable = true
的合并数组
1.forEach
分割数组
ES5中的数组方法
ES6中的数组方法
(一)判断是否是数组
Array.isArray()
(二)转换
toLocaString()
valueOf()
toString()
(三)遍历
every()
every(callback, thisArr)
1.1 若收到一个空数组,此方法在一切情况下都会返回
true
。1.2 不会改变数组,数组在遍历前就已经确定。如果更改某值,callback会取访问到那一刻的值
1.3 不会为那些被删除或从未被赋值的索引调用
some()
some(callback, thisArr);
2.1 some()为数组中的每一个元素执行一次 callback函数,直到找到一个使得 callback 返回一个“真值”(即可转换为布尔值 true 的值)。如果找到了这样一个值,
some()
将会立即返回 `true2.2
callback
只会在那些”有值“的索引上被调用,不会在那些被删除或从来未被赋值的索引上调用。2.3 如果一个
thisArg
参数提供给some(),它将被用作调用的callback
的this
值。否则, 它的this
value将是undefined
。this
的值最终通过callback来观察.map()
map(callback, thisArr)
map
会生成一个新数组delete
删除的索引则不会被调用。thisArg
参数提供给map
,则会被用作回调函数的this
值。否则[undefined](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/undefined)
会被用作回调函数的this
值map(callback,thisValue) callback函数中最常用的就是当前遍历的元素,但是这并不意味这callback函数只接受一个参数。
fliter()
4.1
filter
为数组中的每个元素调用一次callback
函数,并利用所有使得callback
返回 true 或[等价于 true 的值](https://link.juejin.cn/?target=https%3A%2F%2Fdeveloper.mozilla.org%2Fzh-CN%2Fdocs%2FGlossary%2FTruthy)的元素创建一个新数组。4.2
filter
遍历的元素范围在第一次调用callback
之前就已经确定了。在调用filter
之后被添加到数组中的元素不会被filter
遍历到4.3 如果已经存在的元素被改变了,则他们传入
callback
的值是filter
遍历到它们那一刻的值。被删除或从来未被赋值的元素不会被遍历到。4.4 如果为
filter
提供一个thisArg
参数,则它会被作为callback
被调用时的this
值。否则,callback
的this
值在非严格模式下将是全局对象,严格模式下为undefined
。forEach()
forEach(callback, thisArr) 的特点:
callback
函数,未初始化的项将被跳过(例如在稀疏数组上)。callback
的值是forEach()
遍历到他们那一刻的值。thisArg
参数有值,则每次callback
函数被调用时,this
都会指向thisArg
参数。如果省略了thisArg
参数,或者其值为null
或undefined
,this
则指向全局对象。按照函数观察到this
的常用规则,callback
函数最终可观察到this
值。4.排序
reveter()
sort()
(五)操作
1.concat()
2.slice()
2.1 参数slice([begin[, end]])
3.splice()
(六)查找
1.严格查找
1.1indexof()
1.1.1 参数:indexof(searElement,fromIndex) searElement:目标元素 ,fromIndex:开始查找的位置;
1.1.2 作用:
indexOf()
方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。1.2lastIndexOf()
1.2.1 参数: lastIndexOf(searchElement, fromIndex);
2.断言查找
2.2find()
2.2.1 参数:find(callback,thisArr) 回调函数:callback(element, index, array) thisArr: 用作回调时 this 对象
2.2.2
callback
函数会为数组中的每个索引调用即从0
到length - 1
,而不仅仅是那些被赋值的索引。(哪怕时稀疏数组都会被调用这个函数)2.2.3 当找到了这样一个元素后,该方法会立即返回这个元素的值,否则返回
undefined
2.3findIndeof()
这个和上面差不多就是在返回的时候返回数组的索引值
(七)归并
reduce()
1.1 参数:reduce(callback,initiValue) callback 接收四个参数:1.accumulator-累加器 2. currentValue-当前值 3. currentIndex-当前索引 4. array-原数组
1.2 回调函数第一次执行时,
accumulator
和currentValue
的取值有两种情况:如果调用reduce()
时提供了initialValue
,accumulator
取值为initialValue
,currentValue
取数组中的第一个值;如果没有提供initialValue
,那么accumulator
取数组中的第一个值,currentValue
取数组中的第二个值。1.3 如果数组为空且没有提供
initialValue
,会抛出[TypeError
] 。如果数组仅有一个元素(无论位置如何)并且没有提供initialValue
, 或者有提供initialValue
但是数组为空,那么此唯一值将被返回并且callback
不会被执行。reduceRight()
用法和 reduce 类似 但是是从数组的最后一个元素开始遍历
(八)迭代器方法
1.keys()
2.values()
3.entries()
(九)复制和填充
1.fill()
fill(value[, start[, end]])
2.copyWithin()
(十)创建数组
1.Array.from()
1.1 参数:Array.from(obj, mapFn, thisArg) === Array.from(obj).map(mapFn, thisArg)
2.Array.of()
参数: 任意参数
创建的数组为不含 undefined 数组
(十一)栈方法、队列方法
1.unshift()
2.shift()
3.push()
4.pop()
参考
[【建议收藏】徒手实现24+数组方法,谁说你只是“会用”数组?---代码是参考 mdn 的](https://juejin.cn/post/7012765060737007624)