Javascript 单独使用map时为什么要使用map.call做同样的事情?

Javascript 单独使用map时为什么要使用map.call做同样的事情?,javascript,Javascript,这就是问题所在: 编写一个函数,将ROT13编码的字符串作为输入 返回已解码的字符串 我已经解决了。我正在查看给定的解决方案,其中一个使用.map.call,如下所示: function rot13(str) { return str.split('') .map.call(str, function(char) { x = char.charCodeAt(0); if (x < 65 || x > 90) { return Str

这就是问题所在:

编写一个函数,将ROT13编码的字符串作为输入 返回已解码的字符串

我已经解决了。我正在查看给定的解决方案,其中一个使用.map.call,如下所示:

function rot13(str) {
  return str.split('')
    .map.call(str, function(char) {
      x = char.charCodeAt(0);
      if (x < 65 || x > 90) {
        return String.fromCharCode(x); 
      }
      else if (x < 78) {
        return String.fromCharCode(x + 13);
      }
      return String.fromCharCode(x - 13);
    }).join('');  
}
函数rot13(str){
返回str.split(“”)
.map.call(str,function(char){
x=char.charCodeAt(0);
如果(x<65 | | x>90){
返回字符串.fromCharCode(x);
}
else if(x<78){
返回字符串.fromCharCode(x+13);
}
返回字符串.fromCharCode(x-13);
}).加入(“”);
}

我不明白为什么在使用
.map(function(char)时使用
.map.call(str,function(char)
会做完全相同的事情吗?我的意思是我尝试过,只是删除了.call位,它给出了相同的结果。或者可能我不清楚.call是如何工作的。我读过关于它的MDN文章,只是仍然不确定它是如何工作的。或者为什么要使用它。

如果你想指定对象
这个
应该是什么,你需要调用
call
点。当所讨论的对象不是数组(因此没有
obj.map
),但可以将其视为数组(如字符串或HTMLCollection)时,通常会以这种方式使用数组函数。因此,可以调用
[].map.call(obj,callback)
,其中
obj
是应该调用map的对象

正如您正确地注意到的,这里使用它的方式不必要地复杂。调用
[].map.call(str,
str.split(“”).map(…
就足够了


顺便说一句:
返回字符串。fromCharCode(x);
可以替换为
返回字符;

如果您想指定该
应该指向哪个对象,则需要调用
调用
。当所讨论的对象不是数组时,通常会使用数组函数(因此没有
obj.map
),但可以将其视为数组(如字符串或HTMLCollection)。因此可以调用
[].map.call(obj,callback)
,其中
obj
是应该调用map的对象

正如您正确地注意到的,这里使用它的方式不必要地复杂。调用
[].map.call(str,
str.split(“”).map(…
就足够了


顺便说一句:
返回字符串。fromCharCode(x);
可以替换为
返回字符;

,这似乎是一个不言而喻的问题

推荐的实现方法是什么?给定的解决方案看起来像胡言乱语

写这篇文章的更有效、更可读的方法是:

函数rotchar(char){
常量代码=char.charCodeAt(0)
常量isUpper=/[A-Z]/.test(char)
const min=(isUpper?'A':'A')。charCodeAt(0)
返回字符串.fromCharCode(((code-min)+13)%26)+min)
}
功能rot13(str){
返回str.replace(/[A-Z]/gi,rotchar)
}
log(rot13('uryybjbeyq'))

log(rot13('helloworld'))
这似乎是一个不言而喻的问题

推荐的实现方法是什么?给定的解决方案看起来像胡言乱语

写这篇文章的更有效、更可读的方法是:

函数rotchar(char){
常量代码=char.charCodeAt(0)
常量isUpper=/[A-Z]/.test(char)
const min=(isUpper?'A':'A')。charCodeAt(0)
返回字符串.fromCharCode(((code-min)+13)%26)+min)
}
功能rot13(str){
返回str.replace(/[A-Z]/gi,rotchar)
}
log(rot13('uryybjbeyq'))

console.log(rot13('Hello World'))
怀疑的可能重复是正确的,
.call()
在这里是完全多余的,除了混淆和降低函数的效率之外,没有其他用途。怀疑的可能重复是正确的,
.call()
在这里是完全多余的,除了混淆和降低功能效率之外,没有其他用途。