【发布时间】:2013-05-02 02:25:07
【问题描述】:
数组对象上的列表处理例程map 有时非常方便。这是使用它的一种方便方法:
var numarr = [1,2,3,4];
console.log(numarr.map(String))
>>> ["1", "2", "3", "4"]
到目前为止,我认为这是理所当然的。然而,今天我对此感到困惑。 map 函数上面返回的是一个字符串数组。我们通常将一个函数作为参数传递给map。在上述情况下,我们传递 String 对象。 String是在Javascript实现里面实现的,所以不知道有什么特长。上面的代码就像是为数组中的每个项目创建了一个 String 的 new 实例。
如果不清楚,请考虑一下。如果我决定在 Javascript 中实现一个对象,比如 MyString 并将其传递给 map,我将不会得到上述行为。
function MyString(x) { this.val = x; }
MyString.prototype.toString = function () { return String(this.val); };
var ms = new MyString(4)
console.log(String(ms));
>>> "4"
var arr = [1,2,3];
arr.map(MyString)
>>> [undefined, undefined, undefined]
有谁知道为什么 arr.map(String) 会这样工作?
更新:A comment I added below 更好地阐明了我的问题。
【问题讨论】:
-
你看到
typeof String返回什么了吗? “如果我决定在 Javascript 中实现一个对象,请说MyString[...]”:MyString也是一个函数!但它显示undefined,因为你没有从它返回任何东西。 -
你说得对,我什么都不退。但那我应该返回什么?
MyString的新实例? -
这里重要的一点是,虽然
String是一个构造函数,当它被new调用时,它返回一个字符串object,它返回一个字符串原始值,当它被称为没有new。如果你愿意,你可以对你的函数做类似的事情。但总的来说,这对于自定义构造函数没有意义,因此您宁愿将.map与arr.map(function(v) { return new MyString(v); });一起使用。
标签: javascript functional-programming