As For JS
3.29K subscribers
211 photos
22 videos
4 files
544 links
As For JavaScript...
Обсуждения — @AsForJsTalks
Download Telegram
As For JavaScript Coalesce Expression - Nullish coalescing operator - ??

Abstract
О том, почему coalesce expression является идиотизмом притянутым в спецификацию идиотами не понимающими архитектуру языка, а так же о том как разработчики V8 реализовали эту парашу именно как парашу.


Что это такое ваше за Coalesce Expression - я забыл - напомни мне - я упырь
не волноваться, я тоже упырь и совершенно не понимаю как придумывают эти названия.
Потому вот документация и примеры:
Официальная спецификация ECMA
MDN
пример:
var theThing;
(theThing ?? "Yo");
// Если theThing связан с undefined или null результат вычисления выражения будет "Yo
"


В чем проблема проверять и на null и на undefined одной конструкцией
undefined - это primitive value которое устанавливается для идентификаторов созданных при помощи variable statement.
null
- это primitive value которое связывают с идентификатором который в прошлом или в будущем был/будет связан с обьектом, но в его текущем состоянии обьект не определен. То есть null - это обьект с нулевой структурой. Не путать с указателями из других языков.

Эта разница принципиальна для runtime. На основе этой информации RunTime может предпринимать совершенно разные шаги каким образом можно работать с нашим кодом. Очевидно, что идентификатор связанный с undefined - это идентификатор поведение которого в будущем предсказать невозможно. Идентификатор связанный с null - в будущем будет обьектом или ранее использовался как обьект.

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

Конечно если в Ваши задачи входит писать эффективный код. То есть код, который претендует на максимальную производительность.

Посмотрите на официальные API - если API должно вернуть обьект, но при этом что-то произошло, что не позволяет это сделать, то API всегда вернет null. Чем прямо сообщает RunTime - да я должен был вернуть обьект, но что-то пошло не так.


Байт код от V8 для Coalesce expression
Именно ради этого раздела я и затеял все это словоблудие.

JavaScript код:
var theThing;
(theThing ?? "Yo");

byteCode V8:
    Ldar r0
/* Регистр r0 это наш идентификатор theThing.
Ldar - это загрузка содержимого регистра в регистр аккумулятора.
Регистр аккумулятора - это особенный уникальный регистр,
который существует в единственном числе в V8. Через него делаются практически все операции.
*/

    JumpIfUndefinedOrNull "label1"
/* Это непосредственно операция ??,
на языке байткода V8 звучит как - если в регистре аккумулятора находится что-то
что является undefined или null то сделать переход к метке label1
*/

    Jump "label2"    
// безусловный переход к метке label2

label1:              
// метка label1 к которой происходит переход

    LdaConstant [0]  
// загрузить в аккумулятор подготовленную константу. В нашем случае это будет ссылка на "Yo"

label2:              
// метка label2 к которой происходит переход
 
// Other code

Этот же код без комментариев:
    Ldar r0 
JumpIfUndefinedOrNull "label1"
Jump "label2"
label1:
LdaConstant [0]
label2:


Ничего не покоробило в логике этого кода?
🔥3
⎡JSbook: 02.03⎦ JavaScript: От мифов к спецификации. Выражения.
https://www.youtube.com/watch?v=lq5vi6DmEpA

#JSbook #chap_02_03
#JavaScript_От_мифов_к_спецификации
#video #timecodes #відео #таймкоди
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

00:00:00, ожидание начала
https://www.youtube.com/watch?v=lq5vi6DmEpA

#_js_radio_
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

00:07:39, тема трансляции
https://www.youtube.com/watch?v=lq5vi6DmEpA&t=459s
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

00:08:05, благодарности
https://www.youtube.com/watch?v=lq5vi6DmEpA&t=485s

#_Благодарности_
#Susuwatari #Сусуватарі #Сусуватари #煤渡
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

00:21:29, антидисклеймер
https://www.youtube.com/watch?v=lq5vi6DmEpA&t=1289s

#AntiDisclamer #АнтиДисклеймер
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

00:23:54, О чем был первый раздел: js - скриптовый язык. js и хост среда
https://www.youtube.com/watch?v=lq5vi6DmEpA&t=1434s

#JSbook #ScriptingLanguage #СкриптоваМова #СкриптовыйЯзык #EmbeddedLanguage #ВбудованаМова #ВстраиваемыйЯзык #Host #Хост #RunTime #РанТайм #Agent #Агент #V8 #SpyderMonkey #JSC #JavaScriptCore #API #Browser #Браузер #DOM #CSSOM #EventLoop #NodeJS #setTimeout #HTML5 #CallBack #КолБек #КолБэк
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

00:33:36, js - скриптовый язык: что есть и чего нет
https://www.youtube.com/watch?v=lq5vi6DmEpA&t=2016s

#JSbook #ScriptingLanguage #СкриптоваМова #СкриптовыйЯзык #EmbeddedLanguage #ВбудованаМова #ВстраиваемыйЯзык
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

00:35:26, О чем был второй раздел: js: структурирование информации
https://www.youtube.com/watch?v=lq5vi6DmEpA&t=2126s

#JSbook #InformationStructuring #СтруктуруванняІнформації #СтруктурированиеИнформации #Key #Ключ #Property #Властивість #Свойство #Проперті #Проперти

#ECMA
#InternalMethod [[Get]]
#InternalSlot [[PrivateElements]]
#sec_object_internal_methods_and_internal_slots
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

00:57:50, музыкальная пауза
https://www.youtube.com/watch?v=lq5vi6DmEpA&t=3470s

#_ПАУЗА_ #_js_radio_
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

01:02:24, вопрос про структурирование информации и прототипное наследование
https://www.youtube.com/watch?v=lq5vi6DmEpA&t=3744s

#alert #Browser #Браузер #process_stdout_write #NodeJS #print #D8 #console #console_log #prototype #Prototypes #Прототипи #Прототипы #Inheritance #Наслідування #Наследование
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

01:12:17, Второй раздел: выражения
https://www.youtube.com/watch?v=lq5vi6DmEpA&t=4337s

#JSbook #InformationStructuring #СтруктуруванняІнформації #СтруктурированиеИнформации #alert #Browser #Браузер #process_stdout_write #NodeJS #print #D8 #console #console_log #Host #Хост #Expression #Вираз #Выражение
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

01:17:55, пауза
https://www.youtube.com/watch?v=lq5vi6DmEpA&t=4675s

#_ПАУЗА_
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

01:19:47, выражения
https://www.youtube.com/watch?v=lq5vi6DmEpA&t=4787s

#JSbook #Expression #Вираз #Выражение #arguments #Аргументи #Аргументы
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

01:58:00, Созвон, объяснение функционирования console.log("Hello world");
https://www.youtube.com/watch?v=lq5vi6DmEpA&t=7080s

#Expression #Вираз #Выражение #arguments #Аргументи #Аргументы #console #console_log #prototype #String #Рядок #Строка #StringExoticObject #ExoticObject

#ECMA
#clauses #subclause
#BinaryLogicalOperators
#sec_binary_logical_operators
#production
#LogicalANDExpression
#prod_LogicalANDExpression
#LogicalORExpression
#prod_LogicalORExpression
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

03:06:09, итоги по сказанному
https://www.youtube.com/watch?v=lq5vi6DmEpA&t=11169s
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

⬇️⬇️⬇️
2