有时,数组对象上的列表处理例程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更好地澄清了我的问题。
答案 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"
。