sunmaobin / sunmaobin.github.io

blog
https://github.com/sunmaobin/sunmaobin.github.io
174 stars 11 forks source link

js解惑-Array.[method].call有什么作用 #45

Open sunmaobin opened 6 years ago

sunmaobin commented 6 years ago

js解惑-Array.[method].call有什么作用

背景

最近在项目中,看到有同事写一个数组的方法的时候,习惯性的用以下写法:

* [].forEach.call(array,fn);
* [].map.call(array,fn);
* [].sort.call(array,fn);
...

我的第一个想法是,为啥对于一个数组不直接写成:

* array.forEach(fn)
* array.map(fn)
* array.sort(fn)

询问其原因后,同事的说法是:在有些书上说过,这么写保险,保证数组的方法万无一失可以调用,不报错

观点

同事的出发点没错,就是保证书写代码的健壮性。但我个人的观点是,这种不管三七二十一统一都调用 .call 来保证功能可用的方法,在一定程度上,牺牲了代码的可读性,同时给代码增加了一些冗余。

为什么这么说呢?我们先看看同事的这个 万无一失 的担忧在哪里。

问题

我们知道在js中有一种结构叫:类数组(array-like),这是怎么样的一种结构呢?就是:表现形式上像数组,但是却没有数组的方法。

比如:

结论

综上所述,只有我们遇到 类数组 的时候,再调用数组的 .call 将类数组转换为一个真正的数组,然后使用数组提供的方法。如果我们明确知道这就是一个数组,就没必要再 call 转换一次了,实在影响代码可读性。

基本功