Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Будет ли каждый раз при переборе массива создание новой функции? (https://javascript.ru/forum/misc/76504-budet-li-kazhdyjj-raz-pri-perebore-massiva-sozdanie-novojj-funkcii.html)

Teamur 18.01.2019 00:54

Будет ли каждый раз при переборе массива создание новой функции?
 
Будет ли во втором случае функция cube создаваться каждый раз во время перебора массива через map? В первом случае, как я понимаю, в возвращаемом объекте просто дается ссылка на функцию.
Случай 1:
function cube(x){ return x**3 };

var arr=[ 1, 2, 3, 4, 5 ];

arr=arr.map(i=>({ cube, value: i }));


Случай 2:
var arr=[ 1, 2, 3, 4, 5 ];

arr=arr.map(i=>({ cube(x){ return x**3 }, value: i }));

Nexus 18.01.2019 09:35

Teamur,
function cube(x){ return x**3 };

var arr=[ 1, 2, 3, 4, 5 ];

arr=arr.map(i=>({ cube, value: i }));
alert(arr[0].cube===arr[1].cube);


var cube=x=>x**3;

var arr=[ 1, 2, 3, 4, 5 ];

arr=arr.map(i=>({ cube(x){ return x**3 }, value: i }));
alert(arr[0].cube===arr[1].cube);

Teamur 18.01.2019 11:45

Nexus,
Спасибо.

Вопрос 1:
Объект obj будет создаваться каждый раз при запуске функции x?
А если объект расположить в глобальном пространстве window, то при обращении к переменной obj, JS-движок будет перебирать миллион свойств объекта window пока не найдет obj?
function x(){
  let obj={
    lorem:1,
    ipsum:2,
    dolor:3,
  };
}


Вопрос 2:
Если в объекте сотни свойств, имеет ли значение близость имени свойства к началу алфавита с точки зрения поиска свойства, когда мы обращаемся к свойству через obj[prop]? Скажем у меня есть DOM-элемент и я записываю в него свойство нап. el.a=5, JS-движок его же быстрее найдет среди сотни нативных свойств элемента, чем если бы свойство начиналось на букву z?

К чему всё это? Я считаю что лучше ссылаться на что-то или присваивать, чем создавать заново, верно )

Alexandroppolus 18.01.2019 13:56

Цитата:

Сообщение от Teamur
Вопрос 1:
Объект obj будет создаваться каждый раз при запуске функции x?
function x(){
  let obj={
    lorem:1,
    ipsum:2,
    dolor:3,
  };
}

да

Цитата:

Сообщение от Teamur
А если объект расположить в глобальном пространстве window, то при обращении к переменной obj, JS-движок будет перебирать миллион свойств объекта window пока не найдет obj?

там не будет никакого перебора свойств, максимум бинарный поиск, если оно внутри реализовано как дерево. Короче, быстро находится.

вообще если надо постоянный объект иметь, то всё делается через замыкание
var x = (function() {
    var obj = {...};  // объект живет постоянно, используется в функции, не виден снаружи

    return function () {... obj ...};
})();
Цитата:

Сообщение от Teamur
Вопрос 2:
Если в объекте сотни свойств, имеет ли значение близость имени свойства к началу алфавита с точки зрения поиска свойства, когда мы обращаемся к свойству через obj[prop]? Скажем у меня есть DOM-элемент и я записываю в него свойство нап. el.a=5, JS-движок его же быстрее найдет среди сотни нативных свойств элемента, чем если бы свойство начиналось на букву z?

как уже говорил, перебора нет, к алфавиту ничего не привязано. Хочешь микрооптимизаций - просто делай имена свойств короче, хотя это мало что дает.

в общем виде объект хранится как карта (ключ, значение). Внутри это может быть дерево или хэш-таблица.
если набор свойств не меняется, то под твой объект создается специальный "внутренний класс", поступ по именам свойств ещё быстрее.

Цитата:

Сообщение от Teamur
К чему всё это? Я считаю что лучше ссылаться на что-то или присваивать, чем создавать заново, верно )

в общем да, временные объекты это мусор, они заставляют сборку мусора чаще запускаться.

но вообще тут тоже всё не так просто.
https://habr.com/ru/company/oleg-bunin/blog/433318/

Teamur 18.01.2019 14:06

Alexandroppolus,
Обалденно всё расписал, Спасибо!


Часовой пояс GMT +3, время: 19:53.