Как undefined преобразуется в строку?

206
20 мая 2017, 19:29

var a = [undefined, undefined]; 
console.log(a.join()); // тут undefined преобразуются в пустую строку 
console.log(String(undefined)); // а тут в строку 'undefined' 
console.log('' + undefined); // и тут в 'undefined'

Где логика?

Answer 1

Вы не сразу поймете логику, пока не почитаете стандарт, как и во многих языках с автоматическим приведением типа. Выстраивать возможные связи не зная определенных тонкостей при управлении типами - бесполезно в любом языке со слабой типизацией, ведь разработчики делают так, как было удобно им, а другие разработчики как удобно им. Возможно ваши интересы сойдутся с ними и тогда вы будете в языке "как рыба в воде", но могут и не сойтись..

Проведем маленький тест..Чему равны следующие операции?

console.log(NaN === NaN);
console.log([] + []);

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

Вы можете быстро написать какой-то функционал, а можете с кривыми руками написать такое от чего будет дергаться глаз. В целом так с любым языком, знайте как его применять и у вас не будет проблем. Конечно же, динамическая типизация нравится не всем и в последнее время появился типизированный язык TypeScript, который имеет свой синтаксис с автоматиматическим конвертированием в Javascript. Все думают по разному, может вы сторонник строгой типизации и он подойдет вам больше?

Есть интересное видео с конференции, где люди обсуждали подобные операции.

Вернемся к вопросу и откроем сайт Mozila с описанием стандарта:

var a = [undefined, undefined]; 
console.log(a.join());

Array.prototype.join() -Преобразует все элементы массива в строки и объединяет их в одну большую строку. Элемент массива с типом undefined или null преобразуется в пустую строку. Источник

console.log(String(undefined));
console.log('' + undefined);

Первый случай описан в официальном стандарте (англ) в пункте 9.8.

Второй случай описан на официальном сайте Mozila:

undefined является свойством глобального объекта, то есть, это переменная в глобальной области видимости. Начальным значением undefined является примитивное значение undefined. Переменная, не имеющая присвоенного значения, обладает типом undefined. Также возвращают undefined метод или инструкция, если переменная, участвующая в вычислениях, не имеет присвоенного значения. Функция возвращает undefined, если она не возвращает какого-либо значения. Источник

READ ALSO
Jscroll моментально прогружает все страницы

Jscroll моментально прогружает все страницы

Использую плагины jscroll, laravel mix, а так же стандартный шаблон laravelapp

333
Как узнать крайнюю левую позицию sortable?

Как узнать крайнюю левую позицию sortable?

Как у знать крайнюю левую позицию элемента при его перемещении у плагина jquery UI sorttable

195
Ошибка с методом users.get (API Вконтакте)

Ошибка с методом users.get (API Вконтакте)

Здравствуйте! Выполняю запрос к API Вконтакте, а именно, метод usersget

210