«Странный» JS
В ДжаваСкрипте полно странностей, да, но популярная картинка, которая получила сейчас широкое хождение (не буду её приводить, просто суть перепишу) имеет отношение только к безграмотности её авторов. Суть такова:
[] + [] // массив + массив
"" // результат — пустая строка
[] + {} // массив + объект
"[object Object]" // В результате получаем объект? Ну ок
{} + [] // объект + массив
0 // 0? Реально?
{} + {} // объект + объект
NaN // Not a Number? WAT?Выглядит очень всё ооочень странно, если думать, что происходит именно то, что написано в коментариях справа. На самом деле происходящее неверно интерпретировано авторами.
В ДжаваСкрипте фигурные скобки, помимо объекта, задают ещё и блок кода. В данном случае все «объекты» слева — на самом деле блоки кода. Откроем консоль и попробуем это доказать:

Как видите, в левый блок можно без труда добавить код и станет очевидно, что это не описание объекта. Так два последних обсуждаемых примера распадаются на две независимые команды — определение пустого блока кода, который ничего не выполнит и унарную операция «плюс» над пустым объектом или массивом.
С массивом, возвращающим пустоту при суммировании (конкатенации) всё ещё проще — в данном случае производится попытка вызвать метод toString, который у массива выводит строку его значений через запятую. Так как значений нет, строка пустая.
В общем, ничего сильно странного не происходит.
Комментарии 42
Это больше относится к особенностям «вебкитов»
Комментарий для Иван:
У ПХП нет стандарта, какой смысл их сравнивать?
Комментарий для Евгения Степанищева:
Видимо, имелось в виду, что люди массово переходят на Python/Ruby с PHP, а не с JavaScript.
Просим, просим.
/all/1842
Питон — это змея, а Пайтон назван в честь «Монти Пайтона», устал писать каждый раз. А «Яваскрипт» — так я не говорю.
Знать такие вещи — обязательно. Не для того, чтобы их писать, а для того чтобы уверенно разбираться что происходит в коде. Иногдачто-то из этой «экзотики» встречается в коде. И вовсе не потому что человек выпендривался, потому что он и не знал, что выпендривается — он код писал.
А по теме — такие неочевидные моменты знать стоит, хотя бы чтобы избегать их использования в коде.
Передергиваете. В питоне нельзя сложить список со словарем и получить None, к примеру. Будет либо ошибка, либо потребуется перегружать операторы. Это не превосходство именно питона -- это знак хорошего дизайна языка.
Комментарий для Иван:
И тут нельзя, вы статью не читали что ли? Вот вам загадка из «Пайтона» (из второго, третий я не знаю): почему object больше пустого массива, но меньше пустого списка?
File «print.py», line 3, in
print(() > object() > [])
При чём тут вебкит? Это просто факт, что range в регулярке работает по коду символа, а не по фантазиям автора.
Оно так и в перле работает
А… не разобрался я.
Без понятия. Это прокол языка -- в тройке исправили. Я трачу свое время эффективней -- не сравниваю объекты разных типов и другим не даю вкод-ревью.
Ну так и в JS никто не плюсует блок кода с объектом или массивом.
Кстати, я понятие имею. Объект меньше списка, потому что его первая буква «o» (object) идёт до «t» (tuple), а больше массива потому, что буква «l» (list) идёт ещё раньше. То есть сравниваются имена типов.
Все эти вещи нужно знать, не для того, чтобы писать так (я уже писал это выше, напишу ещё раз), а чтобы быстро разобраться в проблеме, когда она возникнет — когда
Почему получается «[object Object]» а не NaN ?
Комментарий для Max:
Это не арифметическое сложение, а строковое (конкатенация). У обоих объектов дёргается toString(), потом преобразуется в строку. Можно в этом убедиться, если выполнить:
Комментарий для Max:
Нет. +{} — вызывается унарная операция(второго-то аргумента нет), {} воспринимается как объект. Унарная операция «+» не над числом даёт NaN.
Нет, тут просто не арифметическое сравнение, так как аргументы операции «+» не числа.
{} + {} — первый элемент — это просто блок кода.
({} + {}) — «[object Object][object Object]» т.е. первый элемент воспринимается уже как объект
Я правильно понял?
Правильно. Можно ещё написать так: ({}) + {}. Это надо делать по той же причине, по которой оборачиваются вызов анонимной функции на месте её описания в скобки — чтобы обозначить, что тут выражение. Причём годится любой способ указания, что это выражение, просто скобки — более универсальный.
Нечто-то, а то, что указывает на выражение. Например, function a() {} + {}. Тут {} — блок кода, будет NaN, потому что JS разобъёт эту конструкцию на две — определение функции и +{}, а (function a() {}) + {} — тут уже будет выражение и пустой объект. Вернётся конкатенация строковых представлений.
я имел ввиду, что {} после function блок кода, а после плюса — объект.
Комментарий для Евгения Степанищева:
Не обязательно. Практика показывает, что человек, который быстро делает работающее приложение на Angular/Ember/Node.js/Whatewer, пусть даже и с багами (которыми можно заняться потом), гораздо полезнее того, кто заморачивается всякими мелочами. Идеальное знание языка в принципе может понадобиться, когда делаешь библиотеку, предназначенную для разработчиков, и то не всегда.
Возможно мы просто разными продуктами занимаемся. У нас продукт большой длительности (годы и десятилетия).
Комментарий для Евгения Степанищева:
Это претенциозные надуманные глупости. Когда, например, вы получаете один результат функции (например, массив) и второй результат функции (например, объект) и видите, что дальше происходит сложение этих результатов, то тут не нужно знать тонкости языка, не нужно бытькаким-то сверхопытным сверхначитанным программистом, чтобы прийти к выводу, что происходит бред или магия или слишком тонкие выпендрежные материи и так нельзя и это нужно исправить или переделать или упростить и тогда всё будет хорошо. Еще раз подчеркиваю — совершенно и гиперабсолютно не нужно знать тонкости языка (в частности вот все эти задачки из поста и их вариации).
пошло-поехало), то всегда такое чувство что вы выпендриваетесь и преувеличиваете собсвтенную важность. Выпендрежность заключается в том, что вы пытаетесь блеснуть знаниями и искренне выразить свое фи и удивляться, мол, «как!? это жы элементарщина, это жы азы языка, это жы должен знать любой программист, иначе он не программист, фу, ужас!!1». Такое чувство, что вы специально читаете документацию и лезете в дебри языка, чтобы потом написать в блоге, что это элементарщина, что это вообще прямо очевидно даже слепому не-программисту и позор тем программистам, кто не знает всякие такие необычные штучки в языке. Вы начитались где-то вот о таких необычных тонкостях языка и теперь выпендриваетесь и пытаетесь искусственно искренне удивляться, когда кто-то не знает о том, что знаете (теперь) вы. Программистское ханжество, вот, придумал, это так называется.
Вообще, когда вот читаю такие статьи в вашем блоге (про магию языка и что это на самом деле не магия, а нужно просто знать свой язык идеально иначе ты не прогарммист… ну и
Комментарий для Артур Мудрик:
Это мой опыт.
Я
Про меня вы не в курсе совершенно.
Комментарий для Roman:
Какой из?
Абсолютно все. Конечно, я имею в виду компанию, в которой вы работаете. Хотя в вашем Гитхабе я тоже ничего полезного не обнаружил.
Комментарий для Roman:
Ни один работающий в нашей компании сотрудник, не знает подробностей о качестве всех продуктов.Вам-то откуда знать?
Возможно этокак-то связано с тем, что программирование — это моё хобби, а не профессиональная деятельность. Видите, вы действительно ничего обо мне не знаете.
Я примерно представляю, каким может быть российский продукт, разрабатываемый десятилетиями на ПиЭйчПи, да еще и за гос. бабло. Интересно, много людей туда наколхозило? Хотя, я могу ошибаться, может у вас там «ЕкмаСкрипт Сикс» давно, тогда могу только порадоваться.
Теперь всё встало на свои места.
Если питон не может сравнить 2 объекта (у них не обределены методы для сравнения) то он превращает их (одного из них) в строки (берет имя типа) и сравнивает строки через strcmp (object.c:794).