Có một người khai thác không phải là người điều hành trong vùng JavaScript trong JavaScript để kiểm tra các thuộc tính của đối tượng không?


182

Có bất kỳ loại toán tử "không có" nào trong JavaScript để kiểm tra xem một thuộc tính không tồn tại trong một đối tượng không? Tôi không thể tìm thấy bất cứ điều gì về điều này xung quanh Google hoặc Stack Overflow. Đây là một đoạn mã nhỏ Tôi đang làm việc ở nơi tôi cần loại chức năng này:

var tutorTimes = {};

$(checked).each(function(idx){
  id = $(this).attr('class');

  if(id in tutorTimes){}
  else{
    //Rest of my logic will go here
  }
});

Như bạn có thể thấy, tôi sẽ đưa mọi thứ vào elsetuyên bố. Tôi thấy có vẻ sai khi thiết lập một câu lệnh if- elsechỉ để sử dụng elsephần đó.


4
Tôi nghĩ rằng bạn có thể muốn var id = ...trong chức năng của bạn.
Cobby

Câu trả lời:


338

Tôi có vẻ sai khi thiết lập một câu lệnh if / other chỉ để sử dụng phần khác ...

Chỉ cần phủ nhận điều kiện của bạn và bạn sẽ nhận được elselogic bên trong if:

if (!(id in tutorTimes)) { ... }

11
Kiểu này cũng sửa lỗi cảnh báo "Sử dụng nhầm lẫn '!" Của JSHint mà bạn nhận được nếu bạn đã làm nếu( ! somekey in someobj )
mikemaccana

3
Xin lưu ý rằng trong các tìm kiếm cho tên thuộc tính bất cứ nơi nào trong chuỗi nguyên mẫu. Xem câu trả lời của tôi để biết thêm chi tiết.
một số

25
Tôi hiểu đây là giải pháp tốt nhất, nhưng có ai khác đồng ý rằng điều này hơi xấu không?
Giô-na

3
Nếu nó xấu thì chỉ cần bọc nó trong một chức năng và đặt cho nó một cái tên đẹplet keyExists = (key, obj) => key in obj
Kamafeather

Tôi hoàn toàn đồng ý. Thật vậy, kỹ năng đặt tên của tôi cũng có thể được cải thiện. let hasProperty"có vẻ" tốt hơn
Kamafeather

37

Như Jordão đã nói, chỉ cần phủ nhận nó:

if (!(id in tutorTimes)) { ... }

Lưu ý: Thử nghiệm trên nếu tutorTimes có thuộc tính với tên được chỉ định trong id, ở bất kỳ đâu trong chuỗi nguyên mẫu. Ví dụ "valueOf" in tutorTimestrả về true vì nó được định nghĩa trong Object.prototype .

Nếu bạn muốn kiểm tra xem một thuộc tính không tồn tại trong đối tượng hiện tại, hãy sử dụng hasOwnProperty:

if (!tutorTimes.hasOwnProperty(id)) { ... }

Hoặc nếu bạn có một khóa có hasOwnPropery, bạn có thể sử dụng khóa này:

if (!Object.prototype.hasOwnProperty.call(tutorTimes,id)) { ... }

an toàn hơn để bọc chìa khóa trong dấu ngoặc kép và sử dụng if(!tutorTimes.hasOwnProperty('id')) ...?
Majid fouadpour

@MajidFouladpour idlà một biến có thể có bất kỳ giá trị nào, 'id'là một chuỗi có hai chữ cái id , vì vậy hãy hasOwnProperty(id)kiểm tra xem thuộc tính được chỉ định trong id biến có tồn tại không và hasOwnProperty('id')kiểm tra xem có thuộc tính có tên id không.
một số

16

Cá nhân tôi tìm thấy

if (id in tutorTimes === false) { ... }

dễ đọc hơn

if (!(id in tutorTimes)) { ... }

nhưng cả hai sẽ làm việc


14

Hai khả năng nhanh chóng:

if(!('foo' in myObj)) { ... }

hoặc là

if(myObj['foo'] === undefined) { ... }

5
Sử dụng 'undefined' === typeof xxxthay thế. undefinedkhông phải là một từ dành riêng và thực sự là một biến toàn cục có thể được ghi đè (dẫn đến các lỗi khó tìm)
hugomg

9
@hippietrail không hoạt động ... cần có parens sau dấu "!" và xung quanh'foo' in myObj)
Phil Cooper

4
myObj['foo']có thể tồn tại như một thuộc tính và chỉ cần được đặt thành undefined(nghĩa là với câu lệnh myObj.foo = undefined). Nếu bạn thực sự muốn xem liệu tài sản đó không tồn tại, bạn cần !('foo' in myObj)ký hiệu.
Richard Connamacher

Đối với hiệu suất có ý thức giữa chúng tôi, việc kiểm tra myObj.foo === undefinednhanh hơn nhiều (mặc dù có khả năng nguy hiểm): jsperf.com/not-in-vs-is-und xác định .
etpinard

@hugomg Tôi không nghĩ đó là một lý lẽ rất tốt cho việc không sử dụng === undefined. Rất nhiều thứ có thể bị phá vỡ nếu mọi người lạm dụng ngôn ngữ lập trình bằng cách thực hiện những việc như, ví dụ, ghi đè undefinedbằng JavaScript. Ngoài ra, hãy xem: stackoverflow.com/questions/8783510/
Kẻ
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.