当然,这将返回您期望的结果:
["A","B","C"].map(function (x) {
return x.toLowerCase();
});
// --> ["a", "b", "c"]
使用String.prototype.toLowerCase.call也是如此:
["A","B","C"].map(function (x) {
return String.prototype.toLowerCase.call(x);
});
// --> ["a", "b", "c"]
如果传递map给出的额外参数,它也会起作用,因为它会丢弃参数:
["A","B","C"].map(function (x, index, arr) {
return String.prototype.toLowerCase.call(x, index, arr);
});
// --> ["a", "b", "c"]
但是,这不起作用:
["A","B","C"].map(String.prototype.toLowerCase.call);
// --> TypeError: undefined is not a function
以下内容也不起作用,因为
arguments
具有Object原型(prototype)而不是Array原型(prototype),因此slice
在其上未定义。发生上述行为的原因可能是因为这样的事情-在内部使用slice
或其他类似的Array函数吗?["A","B","C"].map(function (x) {
return String.prototype.toLowerCase.apply(x, arguments.slice(1));
});
// --> TypeError: undefined is not a function
最佳答案
这是JavaScript点表示法的特殊行为。toLowerCase.call(x)
之所以有效,是因为JavaScript在执行toLowerCase
时使用this
作为call
。这就是call
(与您在每个函数上找到的Function.prototype.call
相同)如何知道要其执行toLowerCase
的方式。
将call
传递到另一个函数会丢失该引用,因此this
不再引用toLowerCase
。