Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.10.2014, 04:12
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

Использование for in
Считается, что for in медленный. Это действительно так, но я ща подумал, он сука, медленный не столько сам по себе, сколько из-за этого:

proto={a: 1, b: 2, c: 3, d: 4, e: 5}
ob=Object.create(proto)
ob.foo=10
ob.bar=20
ob.baz=30

monkeyFu=function(){
   for(var i in this){
      if(this.hasOwnProperty(i)){
          console.log("Monkey do stuff with "+ this[i])
      }
      console.log("Monkey usage: "+this[i])
   }
}

normalFu=function(){
   for(var i in this){
      if(!(this.hasOwnProperty(i))) break
      console.log("Right usage: "+this[i])
   }
}

monkeyFu.call(ob)
normalFu.call(ob)

//  Monkey do stuff with 10
//  Monkey usage: 10
//  Monkey do stuff with 20
//  Monkey usage: 20
//  Monkey do stuff with 30
//  Monkey usage: 30
//  Monkey usage: 1
//  Monkey usage: 2
//  Monkey usage: 3
//  Monkey usage: 4
//  Monkey usage: 5
//  Right usage: 10
//  Right usage: 20
//  Right usage: 30

Именно так его обычно пользуют. А цепочка прототипов может ведь состоять и из тыщи объектов. Соответственно, если нужны только свойства самого объекта, без прототипов, использование по типу monkeyFu просто недопустимо. Это серьезный косяк.

Последний раз редактировалось terminator-101, 22.10.2014 в 04:32.
Ответить с цитированием
  #2 (permalink)  
Старый 22.10.2014, 08:28
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

Сообщение от terminator-101 Посмотреть сообщение
А цепочка прототипов может ведь состоять и из тыщи объектов.
теоретически да. а по факту к сожалению мне не удавалось видеть объект унаследованный из 1000 и более объектов. может более опытные программисты видели))
Ответить с цитированием
  #3 (permalink)  
Старый 22.10.2014, 10:15
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

skrudjmakdak,
Имеется в виду что в прототипе могут лежать тысячи свойств и при этом не обязательно иметь цепоочку в 1000 наследований. Достаточно 2 наследования по 500 свойств.

Вообще есть метод Object.getOwnPropertyNames, если забить на старые браузеры. Если совсем заморачиваться можно сделать чтобы каждый объект хранил в себе массив своих ключей, но проще не использовать for in там где нужна скорость.
Ответить с цитированием
  #4 (permalink)  
Старый 22.10.2014, 10:30
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

tsigel,
Достаточно делать

if(!(this.hasOwnProperty(i))) break

вместо

if(this.hasOwnProperty(i)){...

И все будет норм. Я об этом
Ответить с цитированием
  #5 (permalink)  
Старый 22.10.2014, 10:47
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

terminator-101,
Возможны косяки в старых браузерах, хотя не проверял.
Ответить с цитированием
  #6 (permalink)  
Старый 22.10.2014, 10:51
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от tsigel
Object.getOwnPropertyNames
Есть ES5 Object.keys, есть es5-shim, так что не обязательно забивать. Кстати в чем разница между этими методами?

terminator-101, а почему ты игнорируешь свойства из прототипа?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #7 (permalink)  
Старый 22.10.2014, 10:55
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

Сообщение от danik.js
а почему ты игнорируешь свойства из прототипа?
Потому что если мы используем hasOwnProperty предполагается, что нам прототипы не нужны. Поэтому лучше выйти, чтобы не тратить время на бесполезный перебор. А если нужны, то тогда конечно не нужно. Я про случай, когда не нужны.
Ответить с цитированием
  #8 (permalink)  
Старый 22.10.2014, 11:26
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

terminator-101, а что говорит ECMA спецификация о порядке обхода свойств?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #9 (permalink)  
Старый 22.10.2014, 11:35
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

Сообщение от danik.js
говорит ECMA спецификация о порядке обхода свойств?
Не знаю, но из примера видно, что обход идет от начала, от объекта.
Ответить с цитированием
  #10 (permalink)  
Старый 22.10.2014, 12:13
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от danik.js
Кстати в чем разница между этими методами?
getOwnPropertyNames возвращает все свойства, в том числе enumerable:false
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JavaScript. Уровень 3в. Серверное программирование на Node.js maxy666 Node.JS 8 10.08.2014 00:36
Использование web камеры freelancer.rnd Общие вопросы Javascript 0 24.07.2014 16:30
Использование скриптов в нескольких проектах jsru_ Общие вопросы Javascript 0 04.09.2013 10:55
FileManager c использование ajax nata031189 Серверные языки и технологии 0 30.03.2012 02:40
Про использование cookies zloctb Общие вопросы Javascript 3 11.02.2012 09:36