Почему Array.prototype.join() выравнивает массив любой глубины?

#javascript #arrays #google-chrome #join

#javascript #массивы #google-chrome #Присоединиться

Вопрос:

Возня с некоторым JavaScript и то, что, как я думал, должно было привести к ошибке, сработало так, как задумывалось. [].join() кажется, сглаживает вложенный массив любой глубины.

 var arr = [['a'], ['b'], ['c']];
arr.join('-'); // => 'a-b-c'
  

И даже var arr = [['a'], [[[[[[[[['b']]]]]]]]], ['c']]; возвращает точно такой же результат, как указано выше.

Что особенно странно, поскольку оно возвращает ожидаемое (ошибочное) поведение с объектами:

 var arr = [{}, {}, {}];
arr.join('-'); // => '[object Object]-[object Object]-[object Object]'
  

Любопытно, является ли это особенностью последней версии Chrome (53.0.2785.116), намеренной или ошибкой?

Комментарии:

1. Элементы массива преобразуются в строки, и эти строки затем объединяются, разделенные вхождениями разделителя.

Ответ №1:

Это результат поведения по умолчанию toString ['a'] при 'a' приведении . Из этого следует, что это [['a']].toString() также приводит к 'a' . Игра с этим в консоли должна прояснить это. Вы бы увидели разницу, если бы ваши массивы имели несколько элементов, потому ['a', 'b'].toString() что это привело бы к 'a,b' .

Ответ №2:

Для каждого элемента в объединяемом массиве первое, что происходит, — это принудительное преобразование элемента в строку. Что-то вроде

 [[[[["b"]]]]]
  

при приведении к строке будет просто

 "b"
  

Поэтому, когда вы выполняете объединение, составляющие элементы будут вынуждены быть строками, прежде чем процесс объединения выполнит свою задачу по склеиванию элементов вместе.