LINUX.ORG.RU

for in

 


0

1

Считается, что 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 его обычно и пользуют. А цепочка прототипов может ведь состоять и из тыщи объектов. Соответственно, если нужны только свойства самого объекта, без прототипов, использование по типу monkeyFu просто недопустимо. Это серьезный косяк.



Последнее исправление: terminator-101 (всего исправлений: 2)

Ответ на: комментарий от Eddy_Em

Да ну нах, не нужна, щас наооборот дрочат на скорость, он уже си догоняет.

terminator-101
() автор топика

он уже си догоняет

Даже не знаю: смеяться или плакать? Жабкоскрипту до С как пендостану до цивилизации!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Даже не знаю: смеяться или плакать? Жабкоскрипту до С как пендостану до цивилизации!

Смеяться над terminator-101, плакать от осознания того что в мире существует жс.

Debasher ★★★★★
()

угадал автора со второго слова.

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

а нельзя разве написать без отрицания?

if(this.hasOwnProperty(i)) console.log(«Right usage: »+this)

anonymous
()
Ответ на: комментарий от anonymous

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

terminator-101
() автор топика
Ответ на: комментарий от terminator-101
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)) console.log("Right usage: "+this[i])
   }
}


normalFu без break и отрицания, вывод такой-же как и в твоем примере, код более чистый просто, или я что-то упустил?
anonymous
()
Ответ на: комментарий от terminator-101

стоп, давай разберемся, разве в твоем случае в normalFu инструкция for не обходит все свойства прототипа?

Обходит, но в цикле происходит break и переход к следущему элементу если это свойство прототипа.

У меня просто условие по другому сделано а обход всех элементов в обоих случаях

anonymous
()
Ответ на: комментарий от anonymous

Не думаю. В этом вот примере видно лучше


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

normalFu.call(ob)
// ::: Right usage: 10
// ::: Right usage: 10
// ::: Right usage: 20
// ::: Right usage: 20
// ::: Right usage: 30
// ::: Right usage: 30
// ::: Right usage: 1
// ::: 

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

понял - я только изучаю js, думал что break прерывает текующую итерацию и переходит к следующему элементу, а это выход из цикла вообще

получается сначала идут свойства объекта, а потом из прототипа Тогда такой вопрос - при переборе свойств - этот порядок свойств всегда такой - сначала own properties а потом из портотипа?

anonymous
()
Ответ на: комментарий от anonymous

Думаю да. Ингаче было бы глупо, так как, если одноименное св-во перекрывается, оно должно найтись сперва в объекте.

proto={a:10}
o=Object.create(proto)
o.a=1
console.log(o.a)// 1
Таков нормальный порядок, иначе это противоречило бы семантике.

terminator-101
() автор топика

anonimous, ты?

Если тебе хочется итерировать объект с цепочкой прототипов из тыщи объектов, то что-то ты делаешь не то.

metrokto ★★
()
Ответ на: комментарий от terminator-101

Порядок итерации в for...in зависит от реализации, а это значит что цикл в твоем примере может прерваться до того, как обойдет все собственные свойства объекта.

metrokto ★★
()
Ответ на: комментарий от metrokto

Это какая-то ахинея. Во первых, порядок итерации for in не зависит от реализации. Во вторых, даже если бы зависел, хз, с чего бы ему прерываться не перебрав свойств. Короче, приведи пример, разберем, а так я обсуждать не готов.

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

Во первых, порядок итерации for in не зависит от реализации.

The mechanics and order of enumerating the properties is not specified.

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

Натыкается на свойство прототипа — выполняется break.

Короче, приведи пример, разберем, а так я обсуждать не готов.

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

metrokto ★★
()
Ответ на: комментарий от metrokto

The mechanics and order of enumerating the properties is not specified.

Тут имеется в виду не итерация в рамках одной таблицы. А это не имеет никакого значения. Перебор не начнется от прототипа к объекту, по любому, так что мимо

Натыкается на свойство прототипа — выполняется break.

Ну так это и нужно в даном случае

terminator-101
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.