32个手写JS,巩固你的JS基础(面试高频)

const unique4 = arr => {

return arr.filter((item, index) => {

return arr.indexOf(item) === index;

});

}

方法六:利用Map

const unique5 = arr => {

const map = new Map();

const res = [];

for (let i = 0; i < arr.length; i++) {

if (!map.has(arr[i])) {

map.set(arr[i], true)

res.push(arr[i]);

}

}

return res;

}

03.类数组转化为数组


类数组是具有length属性,但不具有数组原型上的方法。常见的类数组有arguments、DOM操作方法返回的结果。

方法一:Array.from

Array.from(document.querySelectorAll(‘div’))

方法二:Array.prototype.slice.call()

Array.prototype.slice.call(document.querySelectorAll(‘div’))

方法三:扩展运算符

[…document.querySelectorAll(‘div’)]

方法四:利用concat

Array.prototype.concat.apply([], document.querySelectorAll(‘div’));

04.Array.prototype.filter()


Array.prototype.filter = function(callback, thisArg) {

if (this == undefined) {

throw new TypeError(‘this is null or not undefined’);

}

if (typeof callback !== ‘function’) {

throw new TypeError(callback + ‘is not a function’);

}

const res = [];

// 让O成为回调函数的对象传递(强制转换对象)

const O = Object(this);

// >>>0 保证len为number,且为正整数

const len = O.length >>> 0;

for (let i = 0; i < len; i++) {

// 检查i是否在O的属性(会检查原型链)

if (i in O) {

// 回调函数调用传参

if (callback.call(thisArg, O[i], i, O)) {

res.push(O[i]);

}

}

}

return res;

}

05.Array.prototype.map()


Array.prototype.map = function(callback, thisArg) {

if (this == undefined) {

throw new TypeError(‘this is null or not defined’);

}

if (typeof callback !== ‘function’) {

throw new TypeError(callback + ’ is not a function’);

}

const res = [];

// 同理

const O = Object(this);

const len = O.length >>> 0;

for (let i = 0; i < len; i++) {

if (i in O) {

// 调用回调函数并传入新数组

res[i] = callback.call(thisArg, O[i], i, this);

}

}

return res;

}

06.Array.prototype.forEach()


forEach跟map类似,唯一不同的是forEach是没有返回值的。

Array.prototype.forEach = function(callback, thisArg) {

if (this == null) {

throw new TypeError(‘this is null or not defined’);

}

if (typeof callback !== “function”) {

throw new TypeError(callback + ’ is not a function’);

}

const O = Object(this);

const len = O.length >>> 0;

let k = 0;

while (k < len) {

if (k in O) {

callback.call(thisArg, O[k], k, O);

}

k++;

}

}

07.Array.prototype.reduce()


Array.prototype.reduce = function(callback, initialValue) {

if (this == undefined) {

throw new TypeError(‘this is null or not defined’);

}

if (typeof callback !== ‘function’) {

throw new TypeError(callbackfn + ’ is not a function’);

}

const O = Object(this);

const len = this.length >>> 0;

let accumulator = initialValue;

let k = 0;

// 如果第二个参数为undefined的情况下

// 则数组的第一个有效值作为累加器的初始值

if (accumulator === undefined) {

while (k < len && !(k in O)) {

k++;

}

// 如果超出数组界限还没有找到累加器的初始值,则TypeError

if (k >= len) {

throw new TypeError(‘Reduce of empty array with no initial value’);

}

accumulator = O[k++];

}

while (k < len) {

if (k in O) {

accumulator = callback.call(undefined, accumulator, O[k], k, O);

}

k++;

}

return accumulator;

}

08.Function.prototype.apply()


第一个参数是绑定的this,默认为window,第二个参数是数组或类数组

Function.prototype.apply = function(context = window, args) {

if (typeof this !== ‘function’) {

throw new TypeError(‘Type Error’);

}

const fn = Symbol(‘fn’);

context[fn] = this;

const res = contextfn;

delete context[fn];

return re

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值