- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
function main() {
let a: number | string;
a = "Hello";
if (typeof(a) == "string")
{
print("str val:", a);
}
a = 10.0;
if (typeof(a) == "number")
{
print("num val:", a);
}
print("done")
}
guest6 06.12.2021 12:07 # 0
ASD_77 06.12.2021 12:07 # 0
bormand 06.12.2021 12:24 # +1
if (std::string* p = std::get_if<std::string*>(&x)) { ... }
ASD_77 06.12.2021 13:55 # 0
bormand 06.12.2021 13:56 # 0
ASD_77 06.12.2021 14:30 # 0
bormand 06.12.2021 14:33 # 0
Soul_re@ver 06.12.2021 14:34 # +1
bormand 06.12.2021 15:13 # 0
Скопипастим-ка эту портянку ещё 20 раз... Или у них boost preprocessor уже тогда работал?
guest6 06.12.2021 14:34 # 0
ASD_77 06.12.2021 17:23 # 0
JaneBurt 06.12.2021 21:11 # 0
bormand 06.12.2021 21:15 # +1
Они же пытались очень тонкую прокладку для проверки типов сделать, а не новый язык. Видимо поэтому и не могут добавить какие-то скрытые магические поля в структуры.
ASD_77 06.12.2021 21:58 # 0
guest6 06.12.2021 22:02 # 0
ASD_77 06.12.2021 22:04 # 0
guest6 06.12.2021 22:06 # 0
Это касается только проверки типов. В результирующем JS ничего этого нет
ASD_77 07.12.2021 00:00 # 0
bormand 07.12.2021 03:38 # 0
JaneBurt 06.12.2021 21:15 # 0
let a: number = 4;
typeof(a);
bormand 06.12.2021 21:17 # 0
JaneBurt 06.12.2021 21:18 # 0
bormand 06.12.2021 21:21 # 0
З.Ы. Если их тип статически известен, конечно. Из void* он тип уже не вытрясет.
ISO 06.12.2021 21:23 # 0
bormand 06.12.2021 21:24 # 0
ISO 06.12.2021 21:28 # 0
bormand 06.12.2021 21:29 # 0
Проблема ведь с оптимизацией, когда ты точно знаешь тип и для экономии памяти и тактов выбрасываешь всю рантайм инфу о нём.
guest6 06.12.2021 21:30 # 0
Конкретной реализации ASD конечняо ничего не мешает
ASD_77 07.12.2021 00:04 # 0
function foo(a: int | float) {
console.log(a); // Не получается статически, насяльника.
// а теперь получается начальника
if (typeof(a) == "number") console.log(a); // мы знаем, что в коде после typeof(a) 100% number
}
foo(42);
foo(16.16);
JaneBurt 06.12.2021 21:24 # 0
bormand 06.12.2021 21:25 # 0
Тут главное в рантайме не дать string засунуть в этот number потом... Но я думаю это учтено.
guest6 06.12.2021 21:25 # 0
мы думали, что там говно в куче лежит, и динамически диспатчится по указателю
bormand 06.12.2021 21:27 # 0
guest6 06.12.2021 21:29 # 0
Этоже только в TS ты можешь скзаать
а в JS этого знания нет.
алсо, как там хранится строка?
JaneBurt 06.12.2021 21:33 # 0
JaneBurt 06.12.2021 21:30 # 0
enum Variable {
Number(uint64),
String{ length: int64; begin: *char },
Object(*void),
Boolean(bool),
// ...
}
На самом деле встроенных "типов" (различающихся по memory layout в т.ч.) больше
https://v8.dev/blog/elements-kinds
guest6 06.12.2021 21:34 # 0
Или всмысле там юнион из uint64в котором может быть number, указатель на объект, bool, и указатель на строку с длиной на перевес?
В общем как я и сказал почти:
> говно в куче лежит, и динамически диспатчится по указателю
только с исключением на Number и Boolean (строка тоже в куче)
Документацию и пейперы лучше распостранять текстом. Если там очередное тикток видео на полтора часа, то оно не нужно
JaneBurt 06.12.2021 21:38 # 0
> Или всмысле там юнион из uint64в котором может быть number, указатель на объект, bool, и указатель на строку с длиной на перевес?
Скорее структура, которая хранит char-тег и юнион из uint64 (= number), указателя на объект, булеана, view для строки (сама строка лежит в куче) и пр.
" говно в куче лежит, и динамически диспатчится по указателю" - это когда сами данные относящиеся к переменной, всегда хранятся в куче, а переменнная хранит лишь указатель на них не?
guest6 06.12.2021 21:41 # 0
если бы она была текстом, то проблем бы не было. Видео на полтора часа неприлично предлагать:)
>Скорее структура
Ну да, я понял: у нас есть 64 бита, в них мы храним булен, намбр, указатель итд, смотря что за сущность у нас.
Так что typeof можно получить довольно быстро, действительно. А вот за instanceof придется ходить в объект вероятно по указателю
JaneBurt 06.12.2021 21:45 # 0
Да, информация о классе/функции создавшей объект, хранится уже внутри объекта. Так впрочем ведет себя и Джава с Шарпом (иначе невозможна была бы рефлексия).
> если бы она была текстом, то проблем бы не было. Видео на полтора часа неприлично предлагать:)
По ссылке не только видео на полтора часа. Но ладно.
guest6 06.12.2021 21:52 # 0
Угу. В JS есть типы boolean/string/итд/object, а уже object может быть инстансом класса. Информация о типе хранится прямо в юнионе, а о классе уже по ссылке
> Так впрочем ведет себя и Джава с Шарпом (иначе невозможна была бы рефлексия).
В C# есть value types структуры, их тип можно понять статически, но смысла в этом обычно нет.
JaneBurt 06.12.2021 21:21 # 0
ASD_77 07.12.2021 12:08 # +1
ASD_77 07.12.2021 00:27 # +1
bormand 07.12.2021 00:28 # +2
ASD_77 07.12.2021 02:38 # +1
JaneBurt 14.12.2021 20:22 # +2
Превращается перед компиляцией в байт-код во что-то типа:
(как с плюсовыми шаблонами примерно)
bormand 14.12.2021 20:24 # 0
JaneBurt 14.12.2021 20:31 # 0
bormand 14.12.2021 20:33 # 0
JaneBurt 14.12.2021 20:33 # 0
bormand 14.12.2021 20:34 # 0
JaneBurt 14.12.2021 20:36 # 0
bormand 14.12.2021 20:37 # 0
JaneBurt 14.12.2021 20:46 # 0
bormand 14.12.2021 20:50 # +1
Т.е. например функция принимает int|string, мы в неё передаём int, но она внутри в эту переменную ложит string.