Saya sedang mengerjakan fungsi animasi ini tetapi saya mempunyai masalah. Sepertinya saya tidak dapat melakukan tugas yang seharusnya mudah, saya tidak dapat mengetahui panjang suatu benda. Jika Anda memeriksa jsFiddle, Anda dapat melihat bahwa saya menjalankan alert(properties.length);
dan mengembalikan undefined
. Adakah yang bisa mengerti mengapa hal ini bisa terjadi?
Panjang literal objek JavaScript === tidak terdefinisi?
Jawaban (5)
Objek JavaScript tidak memiliki properti length
, hanya Arrays
yang memilikinya. Jika Anda ingin mengetahui jumlah properti yang didefinisikan pada suatu objek, Anda harus mengulanginya dan menghitungnya.
Selain itu, loop for in
Anda rentan terhadap bug karena ekstensi Object.prototype
karena in akan melintasi rantai prototipe lengkap dan menghitung semua properti yang ada pada rantai tersebut.
Contoh
// Poisoning Object.prototype
Object.prototype.bar = 1;
var foo = {moo: 2};
for(var i in foo) {
console.log(i); // logs both 'moo' AND 'bar'
}
Anda harus menggunakan metode hasOwnProperty pada objek untuk menyaring properti yang tidak diinginkan tersebut.
// still the foo from above
for(var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i); // only logs 'moo'
}
}
Banyak kerangka kerja JavaScript di luar sana yang memperluas prototipe, tidak menggunakan hasOwnProperty
sering kali menyebabkan bug yang mengerikan.
Perbarui
Mengenai masalah sebenarnya bahwa kode Anda tidak menganimasikan kedua properti.
for(var p in properties) {
...
for(var i = 0; i <= frames; i++)
{
setTimeout((function(exti, element) {
return function() {
// p gets overriden by for outer for in loop
element.style[p] = original + (pixels * exti) + 'px';
}
// you need to pass in a copy of the value of p here
// just like you do with i and element
})(i, element), i * (1000 / 60), element);
}
....
}
hasOwnProperty
adalah* merupakan praktik yang baik.
- person Ivo Wetzel; 14.01.2011
properties
objek.
- person Ivo Wetzel; 14.01.2011
p
ke dalam pembungkus animasi, seperti i
dan element
karena for in loop
jika tidak maka akan menimpa p
.
- person Ivo Wetzel; 14.01.2011
Ini didukung di node.js dan lingkungan yang lebih baru.
var obj = {a: "a", b: "b"};
Object.keys(obj).length // 2
Jika Anda menggunakan Underscore.js, Anda dapat menggunakan _.size()
:
_.size({one : 1, two : 2, three : 3});
=> 3
size()
mempertimbangkan hasOwnProperty
.
- person RaphaelDDL; 10.04.2014
Objek tidak memiliki panjang, Anda harus menggunakan array jika menginginkannya.
Jika Anda harus mencari jumlah properti suatu objek hanya ada satu cara:
var length =0;
for(var i in obj) length++;
Inilah fungsi umum @Junaid Qadir Shekhanzai untuk "menemukan panjang suatu benda" (yang seperti diberitahukan kepada kita, seharusnya disebut "menghitung properti suatu benda"). Ini menggabungkan solusi dari @Ivo Wetzel dan @Martin Jespersen:
function countProperties(myObj){
var length = 0;
if(typeof myObj != 'object'){
return false;
}
for(var i in myObj) {
length++;
}
return length;
}