Câu trả lời:
Nếu bạn đang kiểm tra các thuộc tính nằm trên chính đối tượng (không phải là một phần của chuỗi nguyên mẫu của nó), bạn có thể sử dụng .hasOwnProperty()
:
if (x.hasOwnProperty('y')) {
// ......
}
Bạn có thể sử dụng in
toán tử để kiểm tra các thuộc tính được kế thừa.
if ('y' in x) {
// ......
}
{}.hasOwnProperty.call(x, 'y')
.
Nếu bạn muốn biết nếu đối tượng vật lý chứa tài sản @ gnarf của câu trả lời sử dụng hasOwnProperty
sẽ làm việc.
Nếu bạn muốn biết liệu tài sản có tồn tại ở bất cứ đâu, trên chính đối tượng hoặc trong chuỗi nguyên mẫu, bạn có thể sử dụng in
toán tử .
if ('prop' in obj) {
// ...
}
Ví dụ.:
var obj = {};
'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically
Underscore.js hoặc Lodash
if (_.has(x, "y")) ...
:)
Object.prototype.hasOwnProperty.call(x, "y")
. Đối với mảng Tôi nghĩ bạn có thể muốn Array.prototype.indexOf
, _.indexOf
hoặc_.contains
Một tính năng của mã gốc của tôi
if ( typeof(x.y) != 'undefined' ) ...
Điều này có thể hữu ích trong một số trường hợp là nó an toàn khi sử dụng cho dù có x
tồn tại hay không. Với một trong các phương pháp trong câu trả lời của gnarf, trước tiên người ta nên kiểm tra x
xem có nghi ngờ gì không nếu nó tồn tại.
Vì vậy, có lẽ cả ba phương pháp đều có một vị trí trong túi thủ thuật của một người.
(x && x.hasOwnProperty('y'))
hoặc(x && 'y' in x)
ReferenceError
thay vì chuỗi 'không xác định'
Vì câu hỏi liên quan đến sự vụng về của việc kiểm tra thuộc tính và một usecase thông thường cho việc xác thực các đối tượng tùy chọn đối số chức năng, tôi nghĩ rằng tôi đã đề cập đến một cách ngắn để kiểm tra sự tồn tại của nhiều thuộc tính. Tuyên bố miễn trừ trách nhiệm: Nó yêu cầu ECMAScript 5 (nhưng IMO bất cứ ai vẫn sử dụng IE8 đều xứng đáng bị hỏng web).
function f(opts) {
if(!["req1","req2"].every(opts.hasOwnProperty, opts)) {
throw new Error("IllegalArgumentException");
}
alert("ok");
}
f({req1: 123}); // error
f({req1: 123, req2: 456}); // ok
Tại sao không đơn giản:
if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");
Hoặc nếu bạn mong đợi một loại cụ thể:
if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");
x.hasOwnProperty('y')
?
Object.prototype.hasOwnProperty.call(x, 'y')
, để tài sản có tên "hasOwnProperty" sẽ không xung đột với quy trình kiểm tra;)