通过调用字符串使用 array.prototype.map

Posted

技术标签:

【中文标题】通过调用字符串使用 array.prototype.map【英文标题】:use array.prototype.map via call on a string 【发布时间】:2016-11-10 14:13:25 【问题描述】:

我知道 call 和 array.prototype.map.call() 函数有两个参数,第一个是要使用的对象上下文,因为它在被调用函数内部,第二个是参数列表。但是在 MDN 中我找到了一个示例,其中通过调用方法使用 array.prototype.map 并将字符串作为第一个参数传递。

我想知道传递的字符串是如何在 map 函数中被操作的。 map 函数中没有 this 关键字。地图如何知道它是在字符串上调用的?

var map = Array.prototype.map;
var a = map.call('Hello World', function(x)  return x.charCodeAt(0); );

【问题讨论】:

“map 函数中没有 this 关键字。” - 我认为您将 .map() 函数本身与作为参数传递给 .map() 的函数混淆了. 如果你通过Array#mappolyfill,你会知道它处理while 循环,考虑到lengththis 和在你的情况下,@987654329 @ 是 String 具有 length 属性... 为什么你认为map 函数没有使用它的this 参数? 【参考方案1】:

字符串在内部以以下格式表示:

String 0: "h", 1: "e", 2: "l", 3: "l", 4: "o", 5: " ", 6: "w", 7: "o", 8: "r", 9: "l", 10: "d", length: 11, [[PrimitiveValue]]: "hello world"

因此,当它被传递给 map 时,它实际上被视为一个数组,因为它具有索引作为键和一个 length 属性。 Array.prototype.map 对其进行迭代以返回数组,该数组在您使用 Function.prototype.call 方法传入的字符串上调用。

在控制台中尝试new String('hello world')

【讨论】:

以上是关于通过调用字符串使用 array.prototype.map的主要内容,如果未能解决你的问题,请参考以下文章

Array.prototype.slice.call()方法详解 (调用方法中的参数截取出来)

在 es6 Map 上调用 `Array.prototype.some()` 的更好方法

将函数的实际参数转换成数组的方法,习惯用Array.prototype.slice.call(arguments)

针对 NodeList 调用 Array.prototype.slice 的目的是啥? [复制]

moment:Array.prototype.some调用null或undefined

新技术篇 - Array.prototype.at()函数