https://t.me/AsForJsTalks/90966Почему в JS нет переменных
О моем отношении к термину переменная и терминологии в целомЄффективность общения программиста с другим программистом для случая их профессиональной деятельности, зависит от того насколько язык который они используют понятен для них обоих.
Чем сложнее и глубже термин - тем эффективнее их общение, в случае если они его понимают одинаково.
Например: .
если я Вам скажу TypeScript, то Вы меня поймете строго однозначным образом.
если я Вам скажу Promise (в контексте языка JavaScript) - Вы меня поймете однозначным образом.
НО
если в контексте языка JavaScript - я Вам скажу переменная, то Вы меня поймете в зависимости от Вашего уровня погруженности в тему.
Большинство расскажет что это некая коробочка, которая содержит в себе некое значение и шабаш.
В то же время, условный ДецПердец скажет - ты ебанулся не иначе. Никаких коробочек для значений в JS нет.
То есть мы не поймем друг-друга.
И разница в понимании того, что именно не так, будет прямо влиять на качество вашего программирования.
О перегруженности терминовЭту проблему, обычно, решают на уровне спецификации - описывая Terms и Conditions. То есть то как следует понимать те или иные термины в рамках этого документа.
Например спецификация содержит термин Exotic Object. Что это такое?
Или что такое undefined? Из определения строго следует - что это особое Value (значение). Физически существующее значение, но не статус Identifier как многие думают.
В JavaScript, если Ваш идентификатор undefined - то это не означает его статус. Это означает что идентификатор связан с особым значением Undefiend. Равно как и Null.
В то же время в других языках, это может быть именно особый статус Идентификатора.
Что это значит для программиста? Это значит, что когда идентификатор === undefiend - мы проводим ровно туже операцию сравнения что и для идентификатор === 7; Что поведение этого идентификатора определено том же самым правилом, как если бы он был связан с любым другим типом. Он не имеет особого поведения.
Я как программист, знакомясь с JS и прочитав об этом в спецификации, сделал для себя совершенно очевидный вывод:
Если я хочу быстрый код, то мне лучше иметь, подобно тому как это делают в языке Ассемблера или Си, свои числовые константы, которые получают максимальную производительность. Тем самым избавив себя от лишней абстракции.
К чему тут переменныеТермин переменная никак не определен на уровне спецификации. НИКАК. Употребление слова variable касается только внутренней кухни самой спецификации.
Как работают Идентификаторы в JS?
Каждый Ваш идентификатор - это строковый ключ в обьекте (эта аналогия чрезвычайно близка к реальности). Где property этого обьекта содержит 32 или 64 битный адрес в памяти на структуру, которая описывае с чем именно связан идентификатор.
На уровне спецификации это описывается парой строчек - Reference Like. Мой рассказ про структуру и ссылку и биты - это из реализации V8 того самого Reference Like.
Как следствие вопрос - а где тут коробочки?
Если они и есть на уровне спецификации - то только для того, чтобы в них лежали ссылки.
Вернемся к разговору двух программистов. Если я пришел из Си и услышал слово перменная, которое никак не регламентируется на уровне спецификации JavaScript - я автоматом подумаю ПРО РЕАЛЬНУЮ КОРОБОЧКУ. Потому что в языке Си при компиляции, ваше число будет не какойто ссылкой на структуру в памяти - а рельаным его представлением либо в 32 либо в 64 либо в форме с плавающей точкой.
И я подумаю. О круто - переменная и число. Экономия память. Фаст перформанс. Кул кул.
И ахренею когда узнаю что это вранье. И в JavaScript все reference like.
Где это применяется? Пример.
У Вас строка в 1 мегабайт. Вы ее передаете в функцию. Вам говорят - там копируются по значению. И Вы как Си программист сидите такой и думаете - ипать копать, а как в функцию передать строку, чтобы не создать ее копию?
И вопрос этот у программиста возник именно потому что он думает что термин переменная с которым он пришел в JS не совпадает с тем как это есть в JS.