Почему String () выравнивает массив в JS? - PullRequest
0 голосов
/ 14 февраля 2019

Я был удивлен, обнаружив поведение сплющивания конструктора String при применении к массиву.

Почему это работает.И действительно ли это хороший способ сплющить массив?

Проверено с такими же результатами на Mac Chrome, Safari, Firefox.

String(['a', 'b', ['c', 'd', ['e', 'f']]])

=> "a,b,c,d,e,f"

Ответы [ 4 ]

0 голосов
/ 14 февраля 2019

Это не единственный способ преобразовать массив в строку.Часто JSON.stringify является предпочтительным:

const arr = [1,[2,[3]]];
console.log(JSON.stringify(arr));

Причина, по которой кажется, что список «сглаживается», заключается в том, что он String вызывается рекурсивно для всего массива:

const arr = [1,[2,[3]]];

console.log(
  String(arr)
);
console.log(
  String(arr[0]),
  '+ , +',
  String(arr[1])
);
console.log(
  String(arr[0]),
  '+ , +',
  String(arr[1][0]),
  '+ , +',
  String(arr[1][1])
);
0 голосов
/ 14 февраля 2019

Поскольку преобразование массива в строку вызовет .toString, что в основном совпадает с вызовом .join(), который вызовет .toString для всех элементов в массиве, а затем удалит результат с запятой.Поэтому массивы рекурсивно соединяются со строкой, результат выглядит сглаженным, так как нет никакого индикатора для начала или конца массива.Вот пошаговое преобразование:

 [[1, 2, 3], [1, 2, 3]].toString()
 [1, 2, 3].toString() + "," + [1, 2, 3].toString()
 (1 + "," + 2 + "," + 3) + "," + (1 + "," + 2 + "," + 3)
 "1,2,3" + "1,2,3"
 "1,2,3,1,2,3"
0 голосов
/ 14 февраля 2019

Он не выравнивает массив, он делает строку из массива.Для лучших вариантов проверьте Array.flat или, например, некоторые библиотеки, такие как lodash flattern () (или Underscore или Rambda ).

0 голосов
/ 14 февраля 2019

Он вызывает Array.prototype.toString - и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...