Cách xác định xem một đối tượng có thuộc tính đã cho trong JavaScript không


311

Làm thế nào tôi có thể xác định liệu một đối tượng xcó thuộc tính được xác định y, bất kể giá trị của x.y?

Tôi hiện đang sử dụng

if (typeof(x.y) !== 'undefined')

nhưng điều đó có vẻ hơi lộn xộn. Có cách nào tốt hơn?

Câu trả lời:


584

Đối tượng có tài sản:

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')) { 
  // ......
}

Đối tượng hoặc nguyên mẫu của nó có một thuộc tính:

Bạn có thể sử dụng intoán tử để kiểm tra các thuộc tính được kế thừa.

if ('y' in x) {
  // ......
}

23
Hoặc thậm chí tốt hơn - 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;)
kangax

4
Hoặc thậm chí ngắn hơn - {}.hasOwnProperty.call(x, 'y').
axmrnv


78

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 hasOwnPropertysẽ 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 intoá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

18

Underscore.js hoặc Lodash

if (_.has(x, "y")) ...

:)


Không. Nó chỉ là một bí danh cho Object.prototype.hasOwnProperty.call(x, "y"). Đối với mảng Tôi nghĩ bạn có thể muốn Array.prototype.indexOf, _.indexOfhoặc_.contains
nackjicholson

13

Bạn có thể cắt nó lên một chút như thế này:

if ( x.y !== undefined ) ...

15
Điều đó sẽ thất bại vớix = {y:undefined}
James

20
Có ai cần phân biệt giữa "không xác định" và "được xác định là không xác định?"
jpsimons

16
@darkporter Đôi khi tôi làm;)
mmm

6

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ó xtồ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 xxem 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.


Bạn luôn có thể sử dụng (x && x.hasOwnProperty('y'))hoặc(x && 'y' in x)
gnarf

Tôi đồng ý, thử nghiệm cho x nên là một trường hợp riêng biệt. Cũng mang lại báo cáo lỗi tốt hơn.
b01

Điều đó thất bại với tôi. Nếu x không được xác định thì typeof (xy) trả về một ReferenceErrorthay vì chuỗi 'không xác định'
Craig

1

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

-2

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!");

1
Bởi vì nó xấu để đọc và không gõ nghiêm ngặt. Tôi phải hỏi bạn: tại sao không đơn giản x.hasOwnProperty('y')?
Fabian Picon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.