在看ES6的书中遇到一段代码,不是很理解,请大神指教下。
发布于 8 年前 作者 zouzhenxing 3855 次浏览 来自 问答
let arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3
};

// ES5的写法
//怎么就变成数组了呢?
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']
\n```
12 回复

call方法的使用 你看看这个吧 https://www.zhihu.com/question/20289071

[].slice.call() 将一个类数组的对象转换为数组

@jdilt 你看的什么书啊?

只要有length就行,你把length去掉就不能用了 From 变异后的 CNode+

@jdilt call apply这个函数我是理解的,JavaScript是一个动态语言,动太语言的特点就是在运行时可以绑订作用域,甚至可以更改运行的结果。call apply的作用是改变函数动行的域。如果大家使用过Java的反射,就很好理解。我不明白的是: []表示数组对象 slice表示数组对象的一个方法 call()表示重新绑订域 所以整句我的理解是 [].slice.call() 将数组中的slice方法绑订到arrayLike对象中。 但是没有调用啊,结果怎么会是一个数组?

请大神指点下,这行代码到底是怎么运行的?

对象冒充,四字真言。

slice方法是数组专有方法,类数组对象无法使用,但是通过call方法,就可以让类数组对象也使用此类方法。

一般slice不传入任何参数,不会对数组进行任何改变

[1,2,3,4,5].slice(); [1,2,3,4,5]

所以可以通过这种方法,通过类数组.slice()得到真数组

我刚才又看了下call()的说明,注意到call()方法有返回值,返回的是函数执行后的结果。 [].slice.call(arrayLike)所以这行代码的意思应该是:在arrayLike对象中调用slice()方法,并返回结果。

类数组还真是一个蛋疼的东西,这个上面有一些总结 http://blog.csdn.net/hztgcl1986/article/details/9203389

@zouzhenxing array-like object,虽然本身没有slice这些数组方法,但是可以通过call来调用,这种情况下感觉是slice这个方法本身只依赖于index和length这些属性而已,已经不关心调用slice方法的对象本身是个什么东西了,array和arraylike都可以。我是这么理解的。 看看这个 http://xahlee.info/js/js_convert_array-like.html

在这个实例属于鸭子模型 所有 具有length且key能转换成int的就把他看做一个数组 (arrayLike) 要注意的是 在slice的实现中 循环次数是length 而不是key

[].slice.apply({0:111,4:222,length:3})
//[111, undefined × 2]    222被忽略了

v8源码链接 https://github.com/v8/v8/blob/99d1e5dccfb897c02b972b412ab6a3a2432835c3/src/js/array.js#L589

@gjc9620 受教了,看来自己对JS这个语言的研究还没深入。

call是js所有方法都有的方法,常用来改变作用域上下文,至于转换成数组,这个是鸭式辨别的一个典型例子,尽管这个玩意儿不是鸭子,但是具有鸭子的某些关键特征

回到顶部