1.Array.prototype.newJoin();
用原生JS还原 join 方法,大概思路就是在Array原型中新增一个newJoin方法,首先要知道 join 方法是干什么的,他就是将数组中每一个元素放进一个字符串中,用自定的分隔符将其分割,那么首先就要定义一个空的字符串用来“装”数组中的每一个元素,接下来肯定就要将数组中的每一个元素遍历出来,还要考虑到数组中是否有 null 和 undefined,所以要进行判断,接下来用一个三目运算符来判断是否要插入分隔符,因为最后一个元素是不要插入分隔符的,如果不是最后一个元素,那么就把 this [i] + arguments [0] 加到开始的时候定义的空字符串中,代码如下。
Array.prototype.newJoin = function (str) {
var string = "";
for (var i = 0 ; i < this.length ; i++){
if (this[i] === null || this[i] === undefined){
this[i] = "";
}
if (arguments.length <= 1 && arguments[0] != undefined){
string += ( i < this.length-1 ) ? this[i] + arguments[0] : this[i];
}else {
string += ( i < this.length-1 ) ? this[i] + "," : this[i];
}
}
return string
}
var arr = [12,34,456,85,94,33]
console.log(arr.newJoin("😄"))
结果自然就是这样啦。
需要注意的是这里为什么要用 this.lengh 而不是arr.lengh呢,因为考虑到代码的复用性,如果下面还要定义其他数组,比如叫 arr2 、arr3 呢,还有 this 指向的问题,有一个小技巧,谁调用 this 所在的方法,this就指向谁。
2.Array.prototype.newFind();
用原生 JS 实现 find 方法,大概思路同上, find 方法的作用是返回符合条件的第一个元素,他需要传进来一个函数作为参数,条件就在这个函数中进行判断,当第一个符合条件的数值被返回之后,后续的元素将不会调用执行函数,如果没有符合条件的元素将会返回 undefined ,那么首先我们就要对传进来的参数进行判断,是否为一个函数,否则将抛出一个错误,因为要对数组中的元素进行操作,所以我们需要对数组进行遍历,遍历之后进行一次 if 判断,将遍历的第 i 个元素作为参数传到作为参数传进来的函数中,在函数中进行判断,符合条件则返回 true ,if (true) 自然就会将 this [i] 返回,也就是第一个满足条件的数,代码如下。
Array.prototype.newFind = function (fun) {
if (typeof fun !== "function"){
throw new TypeError( `${fun} 傻瓜这不是函数!` )
}else{
for (var i = 0 ; i < this.length ; i++){
if ( fun(this[i]) ){
return this[i];
}
}
}
}
var arr = [11,22,33,44,777,456];
const aa = arr.newFind(function (x) {
return x >= 22
})
// const aa = arr.newFind(qwertyuiop)
console.log(aa)
运行结果如下。
这里需要注意的是 find 方法需要传的参数一定是一个函数 !!!