CNode

在看ES6的书中遇到一段代码,不是很理解,请大神指教下。

问答
Zzouzhenxing发布于10 年前最后回复10 年前12 回复5205 浏览0 收藏
let arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3
};

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

回复 (12)

J
jdilt#1·10 年前

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

C
cllgeek#2·10 年前

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

D
DevinXian#4·10 年前

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

F
febobo#5·10 年前

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

Z
zouzhenxing#6·10 年前

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

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

A
anotherWill#7·10 年前

对象冒充,四字真言。

V
visualxcode#8·10 年前

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

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

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

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

Z
zouzhenxing#9·10 年前

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

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

J
jdilt#10·10 年前
引用 zouzhenxing@jdilt call apply这个函数我是理解的,JavaScript是一个动态语言,动太语言的特点就是在运行时可以绑订作用域,甚至可以更改运行的结果。call apply的作用是改变函数...

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

G
gjc9620#11·10 年前

在这个实例属于鸭子模型 所有 具有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

Z
zouzhenxing#12·10 年前

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

参与回复
登录后即可参与回复。登录