Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Мелкие/важные/интересные оптимизации (https://javascript.ru/forum/misc/52904-melkie-vazhnye-interesnye-optimizacii.html)

y0uix 12.01.2015 14:10

Мелкие/важные/интересные оптимизации
 
Здравствуйте, уважаемые форумчане!

Читаю код Underscore и пока что два вопроса:
0)
if (length === +length) {
//...
}

Насколько я понимаю, поскольку метод _.each() итерируется и по свойствам объекта, то проверяется наличие length и его корректность.
То есть в случае объекта мы получим:
undefined === NaN

что не позволит выполниться этой ветке условного оператора.
Возможно, это можно сделать по другому, насколько такой метод корректен, ведь:
var obj = {
  a: 100,
  // не является зарезервированным словом, ничто не мешает, кроме здравого смысла, это использовать
  length: 1
},
len = obj.length; // в Underscore length = obj.length;
len === +len; // true, пошли итерироваться как по массиву!


1)
var length = (keys || obj).length,
        results = Array(length);

Насколько может быть целесообразно аллоцировать необходимое под массив место при инициализации через конструктор?

Спасибо всем.

vasa_c 12.01.2015 15:47

0. Попробуйте вызвать each с вашим объектом и узнаете насколько корректно underscore обрабатывает это.

SV0L0CH 13.01.2015 15:04

Это аналог
typeof length === 'number'
, только заодно отфильтровывает NaN.

Возможно это связано с необходимостью вернуть массив ожидаемо размера даже в случае возникновения исключения чтобы код продолжил работать корректно. Современные JS движки оптимизированы под такие особенности. Если значение не присвоено, то память не выделяется. Так что этим можно пользоваться.

y0uix 18.01.2015 17:43

Спасибо!


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