Làm thế nào để kiểm tra nếu thuộc tính đối tượng tồn tại với một biến giữ tên thuộc tính?


680

Tôi đang kiểm tra sự tồn tại của một thuộc tính đối tượng với một biến chứa tên thuộc tính được đề cập.

var myObj;
myObj.prop = "exists";
var myProp = "p"+"r"+"o"+"p";

if(myObj.myProp){
    alert("yes, i have that property");
};

Điều này là undefineddo nó đang tìm kiếm myObj.myPropnhưng tôi muốn nó kiểm tramyObj.prop


2
Có thể hữu ích: Từ một nhận xét của Pablo Cabrera tại NCZOnline : "Tôi nghĩ rằng đáng lưu ý rằng nếu hasOwnPropertyphương pháp được ghi đè, bạn có thể dựa vào Object.prototype.hasOwnProperty.call(object, property)."
HumanInDisguise

10
stackoverflow.com/questions/4244896/... một bản sao của câu hỏi này? làm như thế nào? 'kiểm tra sự tồn tại' và 'truy cập giá trị' là những điều khác nhau? Xin hãy sửa tôi nếu tôi sai ....
adnan2nd

đây không phải là một bản sao
Jeff Clayton

Câu trả lời:


1307
var myProp = 'prop';
if(myObj.hasOwnProperty(myProp)){
    alert("yes, i have that property");
}

Hoặc là

var myProp = 'prop';
if(myProp in myObj){
    alert("yes, i have that property");
}

Hoặc là

if('prop' in myObj){
    alert("yes, i have that property");
}

Lưu ý rằng hasOwnPropertykhông kiểm tra các thuộc tính được kế thừa, trong khi inđó. Ví dụ 'constructor' in myObjlà đúng, nhưng myObj.hasOwnProperty('constructor')không phải.


23
hasOwnProperty()sau đó tốt hơn myObj[myProp](từ các câu trả lời khác) vì nó hoạt động ngay cả khi giá trị myProplà 0
Matt R

9
Toán tử "in" không hoạt động với chuỗi. ví dụ: 'length' trong 'qqq' sẽ tạo ra một ngoại lệ. Vì vậy, nếu bạn muốn kiểm tra mục đích chung, bạn cần sử dụng hasOwnProperty.
Jacob

1
@Jacob Ý bạn là gì khi bạn nói 'Toán tử "trong" không hoạt động với chuỗi'? với toán tử "in" ', biểu thức bên trái phải là một chuỗi hoặc giá trị có thể chuyển đổi thành một chuỗi. Có, bạn không thể viết 'độ dài' trong 'qqq' nhưng bạn không thể viết 'qqq'.hasOwnProperty (' length ')
Wachburn 21/07/2015

2
@Wachburn: 'qqq'.hasOwnProperty('length')true, bạn có thể làm điều đó.
Rocket Hazmat

1
@ gaurav5430 Tôi tin rằng điều tôi đang đề cập là nếu myProplà 0, câu lệnh if sẽ trông giống như if (myObj[0])nếu myObjcó bất kỳ thuộc tính nào, biểu thức sẽ đánh giá true. Và myObj[0]có thể không phải là tài sản bạn đang tìm kiếm.
Matt R

51

Bạn có thể sử dụng hasOwnProperty , nhưng dựa trên tham chiếu bạn cần trích dẫn khi sử dụng phương pháp này:

if (myObj.hasOwnProperty('myProp')) {
    // do something
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

Một cách khác là sử dụng trong toán tử, nhưng bạn cũng cần báo giá ở đây:

if ('myProp' in myObj) {
    // do something
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in


6
Đó không phảihasOwnProperty() là cách thực hiện.
canon

7
Điều này là không chính xác. Bằng cách đặt dấu ngoặc kép quanh tên myProp, bạn không còn tham chiếu giá trị của myProp nữa, thay vào đó bạn đang khai báo một Chuỗi () mới của 'myProp' và không có thuộc tính 'myProp' nào trong myObj.
Chiến thắng

1
TriumpST: từ MDN được liên kết ở trên, "prop - Chuỗi hoặc ký hiệu đại diện cho tên thuộc tính hoặc chỉ mục mảng (không phải là ký hiệu sẽ bị ép buộc thành chuỗi)."
Ben Creasy

Chính xác. Nếu bạn không muốn sử dụng một biến, nhưng chỉ khi có 'myProp' cụ thể, bạn cần có dấu ngoặc kép.
Katinka Hesselink

@KatinkaHesselink: Nhận xét của bạn là sai lệch. Câu hỏi là "Làm thế nào để kiểm tra xem thuộc tính đối tượng có tồn tại với một biến giữ tên thuộc tính không?"
Herbert Van-Vliet

26

Cảm ơn sự giúp đỡ của mọi người và thúc đẩy để thoát khỏi tuyên bố tệ nạn. Các biến cần thiết phải nằm trong ngoặc, không phải ký hiệu chấm. Điều này hoạt động và là sạch sẽ, mã thích hợp.

Mỗi trong số này là các biến: appChoice, underI, underObstr.

if(typeof tData.tonicdata[appChoice][underI][underObstr] !== "undefined"){
    //enter code here
}

Điều này có vẻ như là một vấn đề với tôi. Nếu tData.tonicdata[appChoice]kết quả trong một giá trị không có thuộc tính / chỉ số phù hợp underI, thì điều này sẽ dẫn đến TypeErrorviệc bị ném.
Ynot

Mặc dù ý định của bạn với bài viết ban đầu của bạn, bạn thực sự đã hỏi một câu hỏi khác với câu hỏi mà bạn đã cung cấp câu trả lời này. Bạn muốn kiểm tra sự tồn tại của một tài sản, bạn không đề cập bất cứ điều gì về cách truy cập nó. Điều này làm cho câu trả lời này không liên quan đến câu hỏi thực tế.
Thức ăn gia súc

18

Đối với tài sản riêng:

var loan = { amount: 150 };
if(Object.prototype.hasOwnProperty.call(loan, "amount")) 
{ 
   //will execute
}

Lưu ý: sử dụng Object.prototype.hasOwnProperty tốt hơn loan.hasOwnProperty (..), trong trường hợp hasOwnProperty tùy chỉnh được xác định trong chuỗi nguyên mẫu (không phải là trường hợp ở đây), như

var foo = {
      hasOwnProperty: function() {
        return false;
      },
      bar: 'Here be dragons'
    };

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

Để bao gồm các thuộc tính được kế thừa trong tìm kiếm, hãy sử dụng toán tử trong : (nhưng bạn phải đặt một đối tượng ở phía bên phải của 'in', các giá trị nguyên thủy sẽ đưa ra lỗi, ví dụ: 'length' trong 'home' sẽ ném lỗi, nhưng 'length' trong Chuỗi mới ('nhà') sẽ không)

const yoshi = { skulk: true };
const hattori = { sneak: true };
const kuma = { creep: true };
if ("skulk" in yoshi) 
    console.log("Yoshi can skulk");

if (!("sneak" in yoshi)) 
    console.log("Yoshi cannot sneak");

if (!("creep" in yoshi)) 
    console.log("Yoshi cannot creep");

Object.setPrototypeOf(yoshi, hattori);

if ("sneak" in yoshi)
    console.log("Yoshi can now sneak");
if (!("creep" in hattori))
    console.log("Hattori cannot creep");

Object.setPrototypeOf(hattori, kuma);

if ("creep" in hattori)
    console.log("Hattori can now creep");
if ("creep" in yoshi)
    console.log("Yoshi can also creep");

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in

Lưu ý: Người ta có thể muốn sử dụng trình truy cập thuộc tính typeof và [] làm mã sau không hoạt động luôn ...

var loan = { amount: 150 };

loan.installment = undefined;

if("installment" in loan) // correct
{
    // will execute
}

if(typeof loan["installment"] !== "undefined") // incorrect
{
    // will not execute
}

13

Một cách an toàn hơn nhiều để kiểm tra xem thuộc tính có tồn tại trên đối tượng hay không là sử dụng đối tượng trống hoặc nguyên mẫu đối tượng để gọi hasOwnProperty()

var foo = {
  hasOwnProperty: function() {
    return false;
  },
  bar: 'Here be dragons'
};

foo.hasOwnProperty('bar'); // always returns false

// Use another Object's hasOwnProperty and call it with 'this' set to foo
({}).hasOwnProperty.call(foo, 'bar'); // true

// It's also possible to use the hasOwnProperty property from the Object
// prototype for this purpose
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

Tham khảo từ Tài liệu web MDN - Object.prototype.hasOwnProperty ()


4
Nếu bạn đang kết hợp JavaScript có thể làm điều gì đó xấu xa như ghi đè hasOwnProperty, thì không có số lượng bảo vệ nào như thế này sẽ giúp mã của bạn an toàn hoặc bảo mật.
meustrus

@meustrus Tôi biết bạn đến từ đâu, nhưng từ góc độ kinh doanh, rất có thể nhận được rằng một nhà phát triển thiếu kinh nghiệm sẽ sử dụng tên tài sản này, điều đó không nhất thiết có nghĩa là họ đang cố tình làm điều gì đó xấu xa.
skmasq

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.