CNode

var str = 'hello' [].slice.call(str) 将字符串转换为数组,但具体的内部工作原理是什么啊

问答
AArthur-lt发布于8 年前最后回复8 年前11 回复3839 浏览0 收藏

在这一块儿一直不懂

查看回复

回复 (11)

M
MiYogurt#1·8 年前

image.png 现在我都这样用。

D
dislido#2·8 年前

call让slice函数把str当做this来处理,对数组来说数组按index获取this的每一个元素来产生一个新的数组的过程同样适用于字符串,结果就是迭代字符串的每一个字符生成字符数组。
es6版的玩法:[...str]

A
Arthur-lt#3·8 年前

call()第一个参数代表this指向,但数组来说数组按index获取this的每一个元素来产生一个新的数组在[].slice().call()中怎么理解

D
dislido#5·8 年前
引用 Arthur-ltcall()第一个参数代表this指向,但 数组来说数组按index获取this的每一个元素来产生一个新的数组 在[].slice().call()中怎么理解

@Arthur-lt [].slice() 就是以数组为this调用slice,加个call(str)就变成了以str为this,也就是str.slice(),而slice的工作过程刚好也适用于字符串类型

D
dislido#6·8 年前
const a = { 0: 'a', 1: 'b', 2: 'c', length: 3 };
[].slice.call(a); // ['a','b','c']

实际上,slice只是用到了this的数组相关属性index和length

A
Arthur-lt#7·8 年前
引用 dislido实际上,slice只是用到了this的数组相关属性index和length

@dislido 比如function a(a,b,c){....} f.call('window',1,2,3)相当于window.f(1,2,3) 所以这里的[].slice.call(str) 是不是相当于str.[].slice()?

A
Arthur-lt#8·8 年前

我有点懂你的意思,你的意思是原本是[].slice 但call导致str.slice() 而str.slice()的工作过程有恰巧跟[].slice一致

D
dislido#9·8 年前
引用 Arthur-lt我有点懂你的意思,你的意思是原本是[].slice 但call导致str.slice() 而str.slice()的工作过程有恰巧跟[].slice一致

@Arthur-lt 可以理解为str通过call把原本属于[]的slice抢了过来自己用,这个过程和str自己的slice是无关的

L
Luciferhaha#11·8 年前

@dislido 66

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