前言
为什么须要重写办法,这些办法间接拿来用不就好了吗?置信初学者总会有这样的纳闷,包含前些天的我同样充斥了纳闷。
什么是重写,说白了就是应用现有的常识探索某个办法的底层实现,而重写的过程就是你对这些办法深刻了解的过程。只有了解的足够粗浅,能力将其模仿进去。
那么模仿它的意义又是什么呢?已经看过一段话,“高级工程师只有在工作中可能实现对应工作就能够,中级工程师须要具备独立开发模块、造轮子的能力,而高级工程师就是把高级变成中级。”。
那这和重写这些办法又有什么关联呢?举个例子,或者很久以前并没有 indexOf 办法,而为了实现 indexOf 的性能,须要反复的编写同样的代码。于是造个轮子吧,而后 indexOf 诞生了。
所以重写这些办法就是为了深层的探索它是怎么诞生的,而把握了诞生它的原理就可能写出更多的例如:myIndexOf, mySplice, mySlice 等等办法。就可能让本人更加靠近一名中级工程师。
为什么会写这样一篇文章?就是为了让更多初学者不要一味的谋求框架的用法,框架也是由这些根底的货色产生的。框架的智慧在于原理,在于对基础知识的深刻理解。
重写 indexOf():
重写之前当然要可能纯熟的使用,那么你真的可能纯熟使用吗。我在工作中简直很少应用它,甚至遗记了它可能承受两个参数。先来看看文档中是怎么形容的:
上面开始一步一步实现它,先放个数组:
const arr = ['重', '写', 'i', 'n', 'd', 'e', 'x', 'o', 'f', '方', '法']
第一步:因为它是数组上的办法,所以须要在数组的原型上增加
Array.prototype.myIndexOf = myIndexOf
第二步:传入查找的元素,如果在数组中能找到则返回索引,否则返回 -1
Array.prototype.myIndexOf = function(item) {
let arr = this
let index = -1
for (let i = 0; i < arr.length; i++) {if (arr[i] == item) {index = i}
}
return index
}
console.log(arr.myIndexOf("重")) // 0
console.log(arr.myIndexOf("方")) // 9
console.log(arr.myIndexOf("你瞅啥")) // -1 --- 数组没有该元素
第三步:传入起始地位,如果不传则默认为 0;如果长度大于 arr.length – 1,则间接返回 -1
Array.prototype.myIndexOf = function(item, start) {
let arr = this
let index = -1
let i = 0
if (start) {if (start > arr.length - 1) {return -1} else {i = start}
}
for (i; i < arr.length; i++) {if (arr[i] == item) {index = i}
}
return index
}
console.log(arr.myIndexOf("法")) // 10
console.log(arr.myIndexOf("d", 3)) // 4
console.log(arr.myIndexOf("重", 2)) // -1 --- 2 开始没有 '重'
console.log(arr.myIndexOf("方", 12)) // -1 --- 12 > arr.length
console.log(arr.myIndexOf("瞅你咋的")) // -1 --- 数组没有该元素
第四步:简化代码
Array.prototype.myIndexOf = function(item, start) {
let arr = this // 谁调用这个办法 this 就指向谁
let index = -1 // 默认返回 -1,找到则批改为对应索引
let i = start | 0 // 传入 start 则 i = start 否则 i = 0
if (start > arr.length - 1) {return -1}
for (i; i < arr.length; i++) {if (arr[i] == item) {index = i}
}
return index
}
总结
平时在写代码的时候不要仅仅停留在用,还要思考它在底层是怎么运作的,为什么可能实现这样成果。带着问题找实质,利用本人曾经把握的常识尝试去实现它,遇到瓶颈时再去查找他人是怎么实现的。说这些就是心愿编写代码的时候不要只停留在编写的层面,要长于思考,放弃这样的习惯会耳濡目染的产生很多扭转。这些话也写给我本人。
Keep foolish, keep hungry.