ฉันสับสนมากกับคำตอบที่ได้รับ - ส่วนใหญ่ไม่ถูกต้อง แน่นอนคุณสามารถมีคุณสมบัติของวัตถุที่มีค่าไม่ได้กำหนดเป็นโมฆะหรือเท็จ ดังนั้นเพียงแค่ลดการตรวจสอบคุณสมบัติไปที่typeof this[property]
หรือยิ่งแย่ลงx.key
จะให้ผลลัพธ์ที่ทำให้เข้าใจผิดอย่างสมบูรณ์
ขึ้นอยู่กับสิ่งที่คุณกำลังมองหา หากคุณต้องการทราบว่าวัตถุมีคุณสมบัติทางกายภาพหรือไม่ (และไม่ได้มาจากที่ใดที่หนึ่งบนโซ่ต้นแบบ) ก็object.hasOwnProperty
เป็นวิธีที่จะไป เบราว์เซอร์สมัยใหม่ทั้งหมดรองรับ (มันหายไปใน Safari เวอร์ชันเก่า - 2.0.1 และเก่ากว่า - แต่เบราว์เซอร์เวอร์ชันเหล่านั้นไม่ค่อยได้ใช้อีกแล้ว)
หากสิ่งที่คุณกำลังมองหาคือถ้าวัตถุมีคุณสมบัติที่สามารถทำซ้ำได้ (เมื่อคุณวนซ้ำคุณสมบัติของวัตถุนั้นจะปรากฏขึ้น) จากนั้นทำ: prop in object
จะให้ผลที่คุณต้องการ
เนื่องจากการใช้hasOwnProperty
อาจเป็นสิ่งที่คุณต้องการและการพิจารณาว่าคุณอาจต้องการวิธีสำรองฉันจึงเสนอวิธีแก้ไขปัญหาต่อไปนี้แก่คุณ:
var obj = {
a: undefined,
b: null,
c: false
};
// a, b, c all found
for ( var prop in obj ) {
document.writeln( "Object1: " + prop );
}
function Class(){
this.a = undefined;
this.b = null;
this.c = false;
}
Class.prototype = {
a: undefined,
b: true,
c: true,
d: true,
e: true
};
var obj2 = new Class();
// a, b, c, d, e found
for ( var prop in obj2 ) {
document.writeln( "Object2: " + prop );
}
function hasOwnProperty(obj, prop) {
var proto = obj.__proto__ || obj.constructor.prototype;
return (prop in obj) &&
(!(prop in proto) || proto[prop] !== obj[prop]);
}
if ( Object.prototype.hasOwnProperty ) {
var hasOwnProperty = function(obj, prop) {
return obj.hasOwnProperty(prop);
}
}
// a, b, c found in modern browsers
// b, c found in Safari 2.0.1 and older
for ( var prop in obj2 ) {
if ( hasOwnProperty(obj2, prop) ) {
document.writeln( "Object2 w/ hasOwn: " + prop );
}
}
ด้านบนคือการทำงานข้ามเบราว์เซอร์วิธีแก้ปัญหาhasOwnProperty
ด้วยข้อแม้หนึ่งข้อ: มันไม่สามารถแยกแยะระหว่างกรณีที่มีคุณสมบัติที่เหมือนกันอยู่บนต้นแบบและบนอินสแตนซ์ - เพียงแค่สมมติว่ามันมาจากต้นแบบ คุณสามารถเปลี่ยนเป็นผ่อนปรนหรือเข้มงวดมากขึ้นตามสถานการณ์ของคุณ แต่อย่างน้อยที่สุดสิ่งนี้ควรมีประโยชน์มากกว่า