You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
constfriends=List('Jake','Jordyn','Mikenzi')friends.filter((friend)=>friend.charAt(0)!=='J')/* Breakdown of Iterations*/1)friendis"Jake".Thecallbackreturnsfalse2)friendis"Jordyn".Thecallbackreturnsfalse3)friendis"Mikenzi".Thecallbackreturnstrue4)friendis"length".Thecallbackthrowsanerror
本文参考了 Creating your own implementation of Array, 加入了自己的补充和修改. 是一个精简版, 如果希望看原文可以点击原链接, 原文还有配套视频
先看一下最后实现的结果:
首先要明确二点:
List
(列表), 实际上用任何名字都行...Array.prototype
上的任何方法, 但是可以使用基于对象上的方法思路
首先思考一下, 在 JavaScript 中 Array 到底是啥. 我们可以用
typeof
来测试一下:所以数组其实也是一个对象. 他可以看成是一个键为类似数字类型的(numerical), 且有一个
length
属性的对象. 同时这个对象还配有一些方法, 比如.push()
,.pop()
, 具体类比如下:第一步
实现第一步目标:
.length
属性的对象我们可以使用 Object.create() 来实现需求:
第二步
List()
函数接收任意数量的参数作为array
的元素, 我们可以用...args
来获取并实现, 但是现在假设的情况是没有数组及配套方法...所以用arguments
以及for...in
方法遍历传入的所有参数元素第三步
还需要实现对应的方法, 包括
.push()
,.pop()
,.map()
,filter()
和.reduce()
, 这些方法分别在List
的prototype
上实现:.push()
先来实现
.push()
, 注意两点:this
指向的是实例对象(也就是List()
之后return
出来的东西).push()
最后返回的是当前数组的长度.pop()
和
.push()
很像.filter()
实际上到目前为止, 上面的代码都是存在一点问题的, 只不过在实现
.filter()
的时候, 当使用for...in
会暴露出这个问题测试一下:
问题在于, 使用
for...in
的时候, 由于length
也为一个可遍历属性(enumerable
), 所以也会被遍历到. (回顾之前的实现, 我们只是简单的设置了array.length = 0
). 因此我们需要加一些限制使得.length
属性无法被遍历. 这里可以用Reflect.defineProperty()
方法, 进行元编程修改属性的属性..map() 和 .reduce()
后续还有
.map()
和.reduce()
, 实现思路都是类似的. 这里我简单写了一下自己的实现方法, 仅供参考. 完整代码如下:参考
The text was updated successfully, but these errors were encountered: