Использование 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 просто недопустимо. Это серьезный косяк. |
Цитата:
|
skrudjmakdak,
Имеется в виду что в прототипе могут лежать тысячи свойств и при этом не обязательно иметь цепоочку в 1000 наследований. Достаточно 2 наследования по 500 свойств. Вообще есть метод Object.getOwnPropertyNames, если забить на старые браузеры. Если совсем заморачиваться можно сделать чтобы каждый объект хранил в себе массив своих ключей, но проще не использовать for in там где нужна скорость. |
tsigel,
Достаточно делать if(!(this.hasOwnProperty(i))) break вместо if(this.hasOwnProperty(i)){... И все будет норм. Я об этом |
terminator-101,
Возможны косяки в старых браузерах, хотя не проверял. |
Цитата:
terminator-101, а почему ты игнорируешь свойства из прототипа? |
Цитата:
|
terminator-101, а что говорит ECMA спецификация о порядке обхода свойств?
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Есть такое дело, break и continue неведомы многим, а некоторыми даже порицаются, я уж не говорю о таком кощунстве как return из тела цикла, как из тела кусок вырываешь понимаешь.
|
Цитата:
|
Цитата:
|
Цитата:
Насколько я вижу этот сайт целиком на js работает и вроде не тормозит. Может мало форичей, то есть форинов? |
Цитата:
arr=[1, 2, 3, 4, 5] throw_=function(wanted, x){if(x===wanted) throw x} return_=function(wanted, x){if(x===wanted) return x} main=function(wanted, f, comment){ try{ arr.forEach(function(x){console.log(comment+": "+x); f(wanted, x)}) }catch(ret){return ret} } console.log("from throw_ call: "+main(3, throw_, "throw")) console.log("from return_ call: "+main(3, return_, "return")) |
ECMAScript говорит
Цитата:
|
Часовой пояс GMT +3, время: 09:53. |