ฉันกำลังพัฒนาฟังก์ชันแอนิเมชันนี้ แต่ฉันมีปัญหา ดูเหมือนว่าฉันไม่สามารถทำสิ่งที่ควรจะเป็นงานง่ายได้ ฉันไม่สามารถรับความยาวของวัตถุได้ หากคุณตรวจสอบ jsFiddle นั้น คุณจะเห็นว่าฉันกำลังใช้งาน alert(properties.length);
และมันกำลังส่งคืน undefined
ใครเห็นบ้างว่าทำไมถึงเป็นเช่นนั้น?
ความยาวตัวอักษรของวัตถุ JavaScript === ไม่ได้กำหนด?
คำตอบ (5)
ออบเจ็กต์ JavaScript ไม่ มีคุณสมบัติ length
เพียงแต่มี Arrays
เท่านั้น หากคุณต้องการทราบจำนวนคุณสมบัติที่กำหนดไว้บนออบเจ็กต์ คุณต้องวนซ้ำและนับคุณสมบัติเหล่านั้น
นอกจากนี้ for in
loop ของคุณมีแนวโน้มที่จะเกิดข้อผิดพลาดเนื่องจากส่วนขยาย Object.prototype
เนื่องจาก in จะเคลื่อนที่ผ่าน สายโซ่ต้นแบบ ที่สมบูรณ์ และระบุคุณสมบัติ ทั้งหมด ที่อยู่บนสายโซ่
ตัวอย่าง
// Poisoning Object.prototype
Object.prototype.bar = 1;
var foo = {moo: 2};
for(var i in foo) {
console.log(i); // logs both 'moo' AND 'bar'
}
คุณต้องใช้เมธอด hasOwnProperty บนออบเจ็กต์เพื่อที่จะ กรองคุณสมบัติที่ไม่ต้องการเหล่านั้นออกไป
// still the foo from above
for(var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i); // only logs 'moo'
}
}
เฟรมเวิร์ก JavaScript จำนวนมากขยายต้นแบบ การไม่ใช้ hasOwnProperty
มักจะนำไปสู่ข้อบกพร่องที่น่ากลัว
อัปเดต
เกี่ยวกับปัญหาจริงที่โค้ดของคุณไม่มีแอนิเมชั่นทั้งสองคุณสมบัติ
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
เป็น* เป็นแนวทางปฏิบัติที่ดี
- person Ivo Wetzel; 14.01.2011
properties
วัตถุ
- person Ivo Wetzel; 14.01.2011
p
ลงใน wrapper ภาพเคลื่อนไหวด้วย เช่นเดียวกับ i
และ element
เนื่องจาก for in loop
จะแทนที่ p
- person Ivo Wetzel; 14.01.2011
สิ่งนี้ได้รับการรองรับใน node.js และสภาพแวดล้อมที่ใหม่กว่า
var obj = {a: "a", b: "b"};
Object.keys(obj).length // 2
หากคุณใช้ Underscore.js คุณสามารถใช้ _.size()
:
_.size({one : 1, two : 2, three : 3});
=> 3
size()
จะคำนึงถึง hasOwnProperty
- person RaphaelDDL; 10.04.2014
วัตถุไม่มีความยาว คุณจะต้องใช้อาร์เรย์หากต้องการ
หากคุณต้องค้นหาจำนวนคุณสมบัติในวัตถุ มีทางเดียวเท่านั้น:
var length =0;
for(var i in obj) length++;
นี่คือฟังก์ชันทั่วไปของ @Junaid Qadir Shekhanzai สำหรับ "การค้นหาความยาวของวัตถุ" (ซึ่งดังที่เราบอกไปแล้ว ควรเรียกอย่างถูกต้องว่า "การนับคุณสมบัติของวัตถุ") มันรวมโซลูชั่นจาก @Ivo Wetzel และ @Martin Jespersen:
function countProperties(myObj){
var length = 0;
if(typeof myObj != 'object'){
return false;
}
for(var i in myObj) {
length++;
}
return length;
}