JS - язык с нестрогой типизацией (даже не динамической строгой, как у Питона, а совсем нестрогой), все данные могут иметь множество представлений: число может быть числом, числом с плавающей точкой, строкой. Взаимопревращения типов иногда происходят интуитивно непонятным образом, вроде сортировки массива чисел в алфавитном порядке или не всегда очевидных превращений чисел в строку с последующим склеиванием символов вместо складывания значений. Всё это можно освоить и заучить, но неочевидность правил многих бесит, а представителей других языков заставляет ловить лулзы.
рукожопы знают очень о многом(включая эту хуйню), но рукожопы в рот ебали необходимость костылить динамическую типизацию, чтобы быть уверенным, что уж тут-то они получат то, что надо, а не что получится. JS как тот молчаливый джун в углу - нихуя ни у кого не спрашивал, и хуй бы с этим, но у гугла он тоже не спрашивал, и в итоге сделает так, что охуеет даже онотоле.
Ну тогда рукожопы огребут проблемы почти со всеми языками с нестрогой типизацией. А в языках с условно-строгой они огребут те же самые проблемы, но уже внутри какого-нибудь Object-а. Да и со строгой типизацией у них будет не все гладко - type casting-то никто не отменял.
"почти все языки с нестрогой типизацией" - говно
а js втройне говно, потому что это говно безальтернативно является одним из столпов вэба, и было запилено на коленке
[1] !== [1], потому что [1] и [1] это два разных объекта пусть и с одинаковым наполнением, а объекты сравниваются по ссылке, поэтому любой объект равен только себе самому, по моему все логично.
в JS все объекты делят на простые и сложные.
Простые - строки, числа, булевы значения, undefined, null.
Сложные - все остальные, в т.ч. сами объекты, массивы, функции.
Простые передаются в функции, в другие объекты по значению, сложные - по ссылке.
Например, можно сделать бесконечную матрёшку лулзов ради (браузер не зависнет):
var a = [];
a[0] = a;
При сравнении переменных разных типов они автоматически приводятся к одному типу (вот тут да, неочевидно - к какому из). Строки могут преобразовываться в числа при сравнении с числом. Число может преобразоваться в строку, если строка, с которой сравнивают, в число не хочет преобразовываться. Абсолютно всё может преобразоваться в булевый тип (принудительное преобразование - двойная инверсия, !!55), при этом все сложные типы преобразовываются всегда в true, в т.ч. пустые массивы и объекты. False дают только 0, пустая строка, null, NaN, undefined.
Вроде читаешь - ничего такого стрёмного нет, но после Java с её стремлением к стандартизации и унификации, все эти тонкости JS просто утомляют. С другой стороны, писать скрипты для беспрерывной работы с непредсказуемыми данными в сети на языках строгой типизации - попаболь.
в современных мощных IDE код желтеньким выделяется, если явно не приводить переменные разных типов перед сравнениями или операциями, а так же не-строгое равенство ==, вместо него рекомендуется использовать только строгое равенство === (оно и работает гораздо быстрее, т.к. не пытается понять что и к какому типу приводить). А ещё константы недавно появились, и теперь их от радости лепят всюду, даже там, где они по логике не должны быть:
for (const KEY in obj) console.log(KEY, obj[KEY]);
см. примеры https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in
Это кстати оxуенно и учитель должен поxвалить ребенку за интересное и нестандартное мышление, но затем попросив решить данную задачу иным путем без использования нулей. А девочка молодец
Саске сунул руку в штаны Наруто и усмехнулся, когда блондин застонал от его прикосновения. - Уже, Наруто? Спросил он
Извините, не тот чат
Я по поводу вакансии ]э-программиста
Введите сообщение и нажмите Enter
6+6=66 проверяем: 66-6=6
Всё правильно!
6 + 6 = 12.
Тип строки задается кавычками, без кавычек - числа. В данном случае все крайне просто, кавычек нет, значит не строка.
P.S.: Кстати, в JS есть еще и форсирование числового контекста - Number. Но рукожопы конечно же и об этом не знают.
а js втройне говно, потому что это говно безальтернативно является одним из столпов вэба, и было запилено на коленке
Простые - строки, числа, булевы значения, undefined, null.
Сложные - все остальные, в т.ч. сами объекты, массивы, функции.
Простые передаются в функции, в другие объекты по значению, сложные - по ссылке.
Например, можно сделать бесконечную матрёшку лулзов ради (браузер не зависнет):
var a = [];
a[0] = a;
При сравнении переменных разных типов они автоматически приводятся к одному типу (вот тут да, неочевидно - к какому из). Строки могут преобразовываться в числа при сравнении с числом. Число может преобразоваться в строку, если строка, с которой сравнивают, в число не хочет преобразовываться. Абсолютно всё может преобразоваться в булевый тип (принудительное преобразование - двойная инверсия, !!55), при этом все сложные типы преобразовываются всегда в true, в т.ч. пустые массивы и объекты. False дают только 0, пустая строка, null, NaN, undefined.
for (const KEY in obj) console.log(KEY, obj[KEY]);
см. примеры
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in
https://softwareengineering.stackexchange.com/questions/221615/why-do-dynamic-languages-make-it-more-difficult-to-maintain-large-codebases/221658#221658
там есть сабы
Очень серьезная лекция о подобных проблемах