2013-06-17 23 views
9

hasOwnProperty có một số cảnh báo và quirks (cửa sổ/sử dụng rộng rãi trong các vấn đề ie8/etc).Lợi ích của việc sử dụng Object.hasOwnProperty vs kiểm tra nếu Thuộc tính không được xác định

tôi đã tự hỏi nếu có lý do nào để thậm chí sử dụng nó, và nếu chỉ đơn giản là kiểm tra nếu một tài sản là undefined là hợp lý tốt hơn & đơn giản hơn.

Ví dụ:

var obj = { a : 'here' }; 

if (obj.hasOwnProperty('a')) { /* do something */ } 

if (obj.a !== undefined) { /* do something */ } 
// or maybe (typeof (obj.a) !== 'undefined') 

Chỉ cần tự hỏi nếu có ai có bất cứ cái nhìn sâu sắc tốt về điều này, tôi muốn được sử dụng nhiều nhất qua trình duyệt thân thiện, và lên đến phương pháp ngày.

Tôi cũng đã nhìn thấy mẫu thử nghiệm này trên-ghi cho hasOwnProperty, mà làm việc, nhưng tôi không bán trên tính hữu dụng của nó ...

if (!Object.prototype.hasOwnProperty) { 
    Object.prototype.hasOwnProperty = function(prop) { 
     var proto = this.__proto__ || this.constructor.prototype; 
     return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]); 
    }; 
} 
+1

Bất cứ điều gì khác hơn là sử dụng 'hasOwnProperty' được đảm bảo tạo ra các kết quả dương hoặc âm sai – Xotic750

+0

nếu tôi biết Tôi đang tìm kiếm một mảng hoặc đối tượng hoặc chức năng, tôi thích nó thậm chí còn đơn giản hơn: if (obj.a). Tất nhiên, nếu obj.a có thể là số không, "" hoặc sai, thì so sánh nó là! == undefined là bắt buộc. Ngoài ra, đối tượng này có một "a" theo ("a" trong obj), nhưng không nếu (obj.a): {a: undefined} – dandavis

+1

Thông tin bổ sung: Bạn có thể thấy bài kiểm tra jsPerf này thú vị: http: // jsperf .com/hasownproperty-vs-in/2. Điểm mấu chốt: '.hasOwnProperty' là ** chậm hơn rất nhiều so với bất kỳ cách nào khác để kiểm tra sự tồn tại của tài sản (điều đó thật đáng ngạc nhiên đối với tôi TBH). –

Trả lời

3

Để biết thêm thông tin về câu trả lời được đưa ra bởi @Pavel Gruba và polyfil mà bạn đã cung cấp. Theo hiểu biết tốt nhất của tôi, không có cách nào tốt cho polyfil hasOwnProperty đối với các trình duyệt không hỗ trợ nó nguyên bản. Tôi đã thấy một vài cái khác nhau trong tự nhiên và tất cả chúng đều tạo ra những mặt tích cực hoặc âm bản sai. Nếu tôi hoàn toàn không có thay thế thì đây là những gì tôi tạo ra để sử dụng của tôi, nó cũng bị sai tích cực và tiêu cực. Theo số MSDN.

được hỗ trợ trong các phương thức tài liệu sau đây: Quirks, Internet Explorer 6 tiêu chuẩn, trình duyệt Internet Explorer 7 tiêu chuẩn, trình duyệt Internet Explorer 8 tiêu chuẩn, trình duyệt Internet Explorer 9 tiêu chuẩn, trình duyệt Internet Explorer 10 tiêu chuẩn. Cũng được hỗ trợ trong các ứng dụng Windows Store.

Javascript

function is(x, y) { 
    if (x === y) { 
     if (x === 0) { 
      return 1/x === 1/y; 
     } 

     return true; 
    } 

    var x1 = x, 
     y1 = y; 

    return x !== x1 && y !== y1; 
} 

function hasOwnProperty(object, property) { 
    var prototype; 

    return property in object && (!(property in (prototype = object.__proto__ || object.constructor.prototype)) || !is(object[property], prototype[property])); 
} 

function NewClass() {} 
NewClass.prototype = { 
    a: 'there' 
}; 

var obj = new NewClass(); 

if (obj.hasOwnProperty("a")) { 
    console.log("has property") 
} 

if (hasOwnProperty(obj, "a")) { 
    console.log("has property") 
} 

On jsfiddle

12

Phương pháp hasOwnProperty kiểm tra rằng tài sản được gán cho đối tượng trực tiếp . Vì vậy, nếu thuộc tính 'a' là nguyên mẫu hasOwnProperty sẽ lọc nó.

function NewClass() {} 
NewClass.prototype = { a: 'there' }; 
var obj = new NewClass(); 

if (obj.hasOwnProperty('a')) { /* code does not work */ } 
if (obj.a !== undefined) { /* code works */ } 

Vì vậy, hasOwnProperty an toàn hơn trong nhiều trường hợp.

+0

Rất đúng ... Chỉ cần nhận ra điều này sau Tôi đang gặp khó khăn trong việc tìm kiếm hỗ trợ trình duyệt cho hasOwnProperty, có ít nhất là IE7 + tương thích không? –

5

hasOwnProperty không kiểm tra cho các giá trị không xác định chỉ kiểm tra nếu tài sản được asigned đến đối tượng ngay cả khi là undefined

var obj = { a : undefined }; 
obj.hasOwnProperty("a") //true 
obj.a === undefined  //true 
obj.hasOwnProperty("b") //false 
obj.b === undefined  //true 
Các vấn đề liên quan