Ilia
ну тут вопрос реализации самого .push
Viktor
Viktor
я про это и сказал, что прикольно, что они там рекурсивно что-то под капотом пушат.
Viktor
я про это
Порридж В Ко-ливинге
Viktor
Порридж В Ко-ливинге
// The JSArray describes JavaScript Arrays
// Such an array can be in one of two modes:
// - fast, backing storage is a FixedArray and length <= elements.length();
// Please note: push and pop can be used to grow and shrink the array.
// - slow, backing storage is a HashTable with numbers as keys.
Viktor
Viktor
Viktor
прикольно, чё сказать.
Порридж В Ко-ливинге
Viktor
ну, точнее объявить я её могу, но не вызвать.
Порридж В Ко-ливинге
Ну вызвать 1000 тоже можно. Опять же, рекурсивно раз 1000 максимум
Порридж В Ко-ливинге
// 6. Repeat, while args is not empty.
for (int i = 0; i < arg_count; ++i) {
// a. Remove the first element from args and let E be the value of the
// element.
Handle<Object> element = args->at(i + 1);
// b. Perform ? Set(O, ! ToString(len), E, true).
if (length <= static_cast<double>(JSArray::kMaxArrayIndex)) {
RETURN_FAILURE_ON_EXCEPTION(
isolate, Object::SetElement(isolate, receiver, length, element,
ShouldThrow::kThrowOnError));
} else {
LookupIterator::Key key(isolate, length);
LookupIterator it(isolate, receiver, key);
MAYBE_RETURN(Object::SetProperty(&it, element, StoreOrigin::kMaybeKeyed,
Just(ShouldThrow::kThrowOnError)),
ReadOnlyRoots(isolate).exception());
}
// c. Let len be len+1.
++length;
}
Порридж В Ко-ливинге
// 6. Repeat, while args is not empty.
for (int i = 0; i < arg_count; ++i) {
// a. Remove the first element from args and let E be the value of the
// element.
Handle<Object> element = args->at(i + 1);
// b. Perform ? Set(O, ! ToString(len), E, true).
if (length <= static_cast<double>(JSArray::kMaxArrayIndex)) {
RETURN_FAILURE_ON_EXCEPTION(
isolate, Object::SetElement(isolate, receiver, length, element,
ShouldThrow::kThrowOnError));
} else {
LookupIterator::Key key(isolate, length);
LookupIterator it(isolate, receiver, key);
MAYBE_RETURN(Object::SetProperty(&it, element, StoreOrigin::kMaybeKeyed,
Just(ShouldThrow::kThrowOnError)),
ReadOnlyRoots(isolate).exception());
}
// c. Let len be len+1.
++length;
}
Никаих рекурсий нет. Как я люблю, через for loop обходит переданные аргумент
Viktor
// 6. Repeat, while args is not empty.
for (int i = 0; i < arg_count; ++i) {
// a. Remove the first element from args and let E be the value of the
// element.
Handle<Object> element = args->at(i + 1);
// b. Perform ? Set(O, ! ToString(len), E, true).
if (length <= static_cast<double>(JSArray::kMaxArrayIndex)) {
RETURN_FAILURE_ON_EXCEPTION(
isolate, Object::SetElement(isolate, receiver, length, element,
ShouldThrow::kThrowOnError));
} else {
LookupIterator::Key key(isolate, length);
LookupIterator it(isolate, receiver, key);
MAYBE_RETURN(Object::SetProperty(&it, element, StoreOrigin::kMaybeKeyed,
Just(ShouldThrow::kThrowOnError)),
ReadOnlyRoots(isolate).exception());
}
// c. Let len be len+1.
++length;
}
не очень ясно только в какой момент появляется RangeError
Порридж В Ко-ливинге
Viktor
Lynn «Кофеман»
Порридж В Ко-ливинге
Ну хотя бы быстрее или медленнее, как думаете? 😅
Ilia
Порридж В Ко-ливинге
(((
~/Desktop/server/sorts: ts-node pushtest.ts
arr1 = arr1.concat(arr2): 0.014033047
arr5 = [...arr5, ...arr4]: 0.131159957
~/Desktop/server/sorts: ts-node pushtest.ts
arr1 = arr1.concat(arr2): 0.013801819
arr5 = [...arr5, ...arr4]: 0.14310669
~/Desktop/server/sorts: ts-node pushtest.ts
arr1 = arr1.concat(arr2): 0.013905106
arr5 = [...arr5, ...arr4]: 0.148461756
Порридж В Ко-ливинге
В 10 раз медленнее при больших массивах
Ilia
Я пропустил про миллион
Ilia
Тогда медленнее )
Ilia
Блин, с компа минуту ждать, чтобы сообщение отправить, А с телефона 10 секунд, магия какая-то )
Viktor
Порридж В Ко-ливинге
Даже при маленьких массивах
arr1 = arr1.concat(arr2): 0.000023067
arr5 = [...arr5, ...arr4]: 0.000088995
Порридж В Ко-ливинге
Все таки как спред оператор не был бы хорош, но медот конкатенации на то и метод конкатенации.
Ilia
интересно а в обьектах как )
Порридж В Ко-ливинге
интересно а в обьектах как )
Пхаха, в объектах вы иначе не сделаете.
Object.assign ОЧЕНЬ ОЧЕНЬ дорогой метод. Вообще никогда не используйте его.
Viktor
Порридж В Ко-ливинге
function test(i, ...args){
console.log(i);
test(i + 1, ...args);
}
–––––––––––––––––––––––––
test(0, ... new Array(100_000))
VM3946:2 0
VM3946:3 Uncaught RangeError: Maximum call stack size exceeded
at test (<anonymous>:3:1)
at <anonymous>:5:1
Порридж В Ко-ливинге
test(0, ... new Array(10_000))
VM3975:2 0
VM3975:2 1
VM3975:2 2
VM3975:2 3
VM3975:2 4
VM3975:2 5
VM3975:2 6
VM3975:2 7
VM3975:2 8
VM3975:2 9
VM3975:2 10
VM3975:2 11
VM3975:3 Uncaught RangeError: Maximum call stack size exceeded
Порридж В Ко-ливинге
Как я и думал. В Браузерах ограничение на 100 000 байтов
Порридж В Ко-ливинге
Т.е. можно вызвать 1 раз 100_000 или 10 раз 10_000 или 100 раз 1_000
Порридж В Ко-ливинге
121 раз при 1000 аргументах вызвалось
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Viktor
Там нигде нет числа 121
расчёт на глазок был. если я правильно помню дефолтный размер стека метр, а число в джаваскрипте 64 битное.
Viktor
ну где-то просчитался видать
Viktor
я почему-то посчитал 121к вместо 125к
Viktor
ну и правильно. все-таки на стеке ещё служебные данные лежат, а не только аргументы мои.
Viktor
Порридж В Ко-ливинге
Lynn «Кофеман»
Мне лень смотреть в кишки v8, но обычно аргументы функции кладутся на стек и положить туда миллион чисел это так себе идея
Viktor
Viktor
после долгих рассуждений мы это выяснили 😃
Порридж В Ко-ливинге
Viktor
отличный вопрос для собеседования, чтобы проверить понимает ли кандидат что такое стек и что такое куча.
Viktor
и где что хранит джаваскрипт.
Viktor
мне кажется, что это одна из первых концепций, которые изучают студенты на курсе с++
Viktor
ну, после того как немного освоились с синтаксисом
Viktor
Sergei
Попал на страницу выдачи Яндекса без мыши и оказывается там нет skip to main content ссылки. Я понимаю с пандусами в России все плохо, но главная выдача Яндекса - это же очень много пользователей страдает. Просто боль была скакать табом по всем ссылкам в шапке.
Sergei
Репортните там, по возможности
Порридж В Ко-ливинге
Viktor
Порридж В Ко-ливинге
Viktor
а если серьезно, то я уверен делали не один подход к a11y, но это большая и сложная тема, особенно на главной странице.
Viktor
все будет, но не сейчас 😊
Порридж В Ко-ливинге
Да, нет как в Ютюбе красивой выскакивающей кнопки, но внизу показывает ссылку и видно что он это предлагает
Порридж В Ко-ливинге
В самом низу слева
Sergei
Хз я вот сейчас на маке зашёл и там первый таб вообще в Директ отправляет
Sergei
Там магия какая-то, определенно старались, это видно, но я не смог
Порридж В Ко-ливинге
Может вы попали в выборку, над которой экперементируют