В JavaScript, как join vs + = в строке обрабатывает utf-кодировки по-другому? - PullRequest
0 голосов
/ 12 апреля 2020

В чем разница между двумя приведенными ниже операциями, для которых выполняется одна операция с join, в результате чего "÷C ", тогда как другая с сокращением приводит к "÷C"?

1

// returns "÷C "
["f7","43"].map(x=>'0x'+ x).map(String.fromCharCode).join('');

2

// returns "÷C"
["f7","43"].map(x=>'0x'+x).reduce((a, c) => { 
    a += String.fromCharCode(c); 
    return a 
}, '');

1 Ответ

2 голосов
/ 12 апреля 2020

String.fromCharCode принимает несколько аргументов. Каждый аргумент будет интерпретирован как единица кода. В первом коде, поскольку .map также предоставляет аргументы для индекса и перебираемого массива:

["f7","43"].map(x=>'0x'+ x).map(String.fromCharCode).join('');

эквивалентно

["f7","43"]
  .map(x=>'0x'+ x)
  .map((str, i, arr) => (
    String.fromCharCode(str, i, arr)
  )
  .join('');

, что приводит к неожиданным результатам.

Явно передайте только вместо str, и это приведет к тому же результату, что и во втором фрагменте:

const result = ["f7","43"]
  .map(x=>'0x'+ x)
  .map((str) => (
    String.fromCharCode(str)
  ))
  .join('');
console.log(result);

(тем не менее, звонить fromCharCode с чем-то, что не является числом, странно и сбивает с толку, лучше сделать это явно, как упоминает Бармар)

...