Мелкие/важные/интересные оптимизации
Здравствуйте, уважаемые форумчане!
Читаю код 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); Насколько может быть целесообразно аллоцировать необходимое под массив место при инициализации через конструктор? Спасибо всем. |
0. Попробуйте вызвать each с вашим объектом и узнаете насколько корректно underscore обрабатывает это.
|
Это аналог
typeof length === 'number', только заодно отфильтровывает NaN. Возможно это связано с необходимостью вернуть массив ожидаемо размера даже в случае возникновения исключения чтобы код продолжил работать корректно. Современные JS движки оптимизированы под такие особенности. Если значение не присвоено, то память не выделяется. Так что этим можно пользоваться. |
Спасибо!
|
Часовой пояс GMT +3, время: 16:46. |