在Javascript中,为什么array.map(String)返回字符串数组?

时间:2013-05-02 02:25:07

标签: javascript functional-programming

有时,数组对象上的列表处理例程map非常方便。这是使用它的一种方便方法:

var numarr = [1,2,3,4];
console.log(numarr.map(String))

>>> ["1", "2", "3", "4"]

到目前为止,我认为这是理所当然的。然而今天我对此感到困惑。上面返回的map函数是一个字符串数组。我们通常将函数传递给map作为参数。在上面的例子中,我们传递了String个对象。 String是在Javascript实现中实现的,所以我不知道它有什么样的专业。上面的代码就像为数组中的每个项目创建new String实例一样。

如果不清楚,请考虑这一点。如果我决定在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更好地澄清了我的问题。

3 个答案:

答案 0 :(得分:4)

Array.map返回一个数组,其元素是通过将指定函数应用于this数组中的每个值而返回的值。 String is a function; it returns a string.这就是它的全部内容。

答案 1 :(得分:3)

在第二个代码段的末尾,尝试console.log(val)。你会注意到你已经泄露了全球:

var arr = [1,2,3];
arr.map(MyString);
console.log(val); // "3"

使用arr.map(MyString)时,您将该构造函数作为函数调用,而不使用new来创建实例。而且,由于MyString没有return任何内容,因此您会在结果中得到undefined。但是,您仍然设置this.val,而this不是一个实例,而是全局对象

String不会返回undefined,因为called without new时有return

  

当String作为函数而不是构造函数调用时,它会执行类型转换。

  

返回由ToString(value)计算的String值(不是String对象)。如果未提供value,则返回空字符串""

您可以通过MyString模仿this是否先成为实例,并在this不是一个实例时返回新实例,

function MyString(x) {
    if (this instanceof MyString) {
        this.val = x;
    } else {
        return new MyString(x);
    }
}

var arr = [1, 2, 3];
arr.map(MyString); // [ {val: "1"}, {val: "2"}, {val: "3"} ]

答案 2 :(得分:0)

多数民众赞成是因为String 的一个功能。它返回一个由传递给它的内容构造的字符串。例如,如果您致电String(100),则会返回"100"