数组对象上的列表处理例程map
有时非常方便。这里有一个方便的使用方法:在Javascript中,为什么array.map(String)返回字符串数组?
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(字符串)工作的方式呢?
更新:A comment I added below更好地阐明了我的问题。
你看到什么'typeof运算String'回报? *“如果我决定在Javascript中实现一个对象,说'MyString' [[]]”*:'MyString'也是一个函数!但它显示“未定义”,因为你没有返回任何形式。 – 2013-05-02 02:38:26
你说得对,我什么都没有回来。但是,我应该返回什么?一个“MyString”的新实例? – Jayesh 2013-05-02 13:34:00
这里重要的一点是,虽然'String'是一个construtor函数,它在用'new'调用时返回一个字符串* object *,当它被调用*时不返回*'new',它会返回一个字符串*原始值*。如果你愿意,你可以用你的功能做类似的事情。但是通常这对自定义构造函数没有意义,所以你更愿意使用带'arr.map('function(v){return new MyString(v);});''的'.map'。 – 2013-05-02 13:41:13