Pertanyaan Bagaimana cara memeriksa apakah suatu objek memiliki properti di JavaScript?


Bagaimana cara memeriksa apakah suatu objek memiliki properti di JavaScript?

Mempertimbangkan:

x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
    //Do this
}

Apakah itu cara terbaik untuk melakukannya?


1180
2017-09-25 19:27


asal


Jawaban:


Saya benar-benar bingung dengan jawaban yang telah diberikan - kebanyakan dari mereka benar-benar salah. Tentu saja Anda dapat memiliki properti objek yang memiliki nilai tidak terdefinisi, null, atau salah. Jadi, kurangi saja pemeriksaan properti typeof this[property] atau, lebih buruk lagi, x.key akan memberi Anda hasil yang sepenuhnya menyesatkan.

Itu tergantung pada apa yang Anda cari. Jika Anda ingin tahu apakah suatu benda secara fisik berisi properti (dan itu tidak datang dari suatu tempat di atas rantai prototipe) kemudian object.hasOwnProperty adalah cara untuk pergi. Semua browser modern mendukungnya. (Yang hilang di Safari versi lama - 2.0.1 dan yang lebih lama - tetapi versi peramban tersebut jarang digunakan lagi.)

Jika yang Anda cari adalah jika suatu objek memiliki properti di atasnya yang dapat diteruskan (ketika Anda mengulang-ulang properti objek, ia akan muncul) lalu melakukan: prop in object akan memberi Anda efek yang Anda inginkan.

Sejak menggunakan hasOwnProperty mungkin apa yang Anda inginkan, dan mempertimbangkan bahwa Anda mungkin ingin metode fallback, saya menyajikan kepada Anda solusi berikut:

var obj = {
    a: undefined,
    b: null,
    c: false
};

// a, b, c all found
for ( var prop in obj ) {
    document.writeln( "Object1: " + prop );
}

function Class(){
    this.a = undefined;
    this.b = null;
    this.c = false;
}

Class.prototype = {
    a: undefined,
    b: true,
    c: true,
    d: true,
    e: true
};

var obj2 = new Class();

// a, b, c, d, e found
for ( var prop in obj2 ) {
    document.writeln( "Object2: " + prop );
}

function hasOwnProperty(obj, prop) {
    var proto = obj.__proto__ || obj.constructor.prototype;
    return (prop in obj) &&
        (!(prop in proto) || proto[prop] !== obj[prop]);
}

if ( Object.prototype.hasOwnProperty ) {
    var hasOwnProperty = function(obj, prop) {
        return obj.hasOwnProperty(prop);
    }
}

// a, b, c found in modern browsers
// b, c found in Safari 2.0.1 and older
for ( var prop in obj2 ) {
    if ( hasOwnProperty(obj2, prop) ) {
        document.writeln( "Object2 w/ hasOwn: " + prop );
    }
}

Di atas adalah solusi lintas-browser yang berfungsi hasOwnProperty, dengan satu peringatan: Hal ini tidak dapat membedakan antara kasus-kasus di mana properti yang identik pada prototipe dan pada contoh - hanya berasumsi bahwa itu berasal dari prototipe. Anda bisa mengubahnya menjadi lebih lunak atau ketat, berdasarkan situasi Anda, tetapi setidaknya ini akan lebih membantu.


1202
2017-09-25 21:52



Dengan Underscore.js atau (bahkan lebih baik) lodash:

_.has(x, 'key');

Panggilan mana Object.prototype.hasOwnProperty, tetapi (a) lebih pendek untuk mengetik, dan (b) menggunakan "referensi aman untuk hasOwnProperty"(Itu berfungsi meskipun hasOwnProperty ditimpa).

Secara khusus, lodash mendefinisikan _.has sebagai:

   function has(object, key) {
      return object ? hasOwnProperty.call(object, key) : false;
   }
   // hasOwnProperty = Object.prototype.hasOwnProperty

235
2017-07-03 17:01



Catatan: berikut ini saat ini sebagian besar usang berkat mode ketat, dan hasOwnProperty. Solusi yang benar adalah menggunakan mode ketat dan untuk memeriksa keberadaan penggunaan properti obj.hasOwnProperty. Jawaban ini mendahului kedua hal ini, setidaknya diterapkan secara luas (ya, itu yang lama). Ambil yang berikut sebagai catatan sejarah.


Camkan itu undefined is (sayangnya) tidak kata cadangan di JavaScript jika Anda tidak menggunakan mode ketat. Oleh karena itu, seseorang (orang lain, tentu saja) dapat memiliki gagasan besar untuk mendefinisikan ulang, memecahkan kode Anda.

Oleh karena itu, metode yang lebih kuat adalah sebagai berikut:

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

Di sisi lain, metode ini jauh lebih verbose dan juga lebih lambat. : - /

Alternatif umum adalah memastikan hal itu undefined aku s sebenarnya tidak terdefinisi, mis. dengan meletakkan kode ke fungsi yang menerima parameter tambahan, yang disebut undefined, itu tidak melewati nilai. Untuk memastikan bahwa itu tidak lulus nilai, Anda bisa langsung memanggilnya sendiri, misalnya:

(function (undefined) {
    … your code …
    if (x.attribute !== undefined)
        … mode code …
})();

108
2017-09-25 19:48



Bagaimana dengan?

var x = {'key': 1};

if ('key' in x) {
    console.log('has');
}

93
2018-02-02 17:56



if (x.key !== undefined)

Armin Ronacher sepertinya sudah kalahkan aku, tapi:

Object.prototype.hasOwnProperty = function(property) {
    return this[property] !== undefined;
};

x = {'key': 1};

if (x.hasOwnProperty('key')) {
    alert('have key!');
}

if (!x.hasOwnProperty('bar')) {
    alert('no bar!');
}

Solusi yang lebih aman, tetapi lebih lambat, seperti yang ditunjukkan oleh Konrad Rudolph dan Armin Ronacher akan menjadi:

Object.prototype.hasOwnProperty = function(property) {
    return typeof this[property] !== 'undefined';
};

35
2017-09-25 19:32



Anda dapat menggunakan in operator untuk memeriksa apakah properti ada pada objek:

x = {'key': 1};
alert("key" in x);

Anda juga dapat mengulang melalui semua properti objek menggunakan for - in loop, dan kemudian periksa properti spesifik:

for (prop in x) {
    if (prop == "key") {
        //Do something
    }
}

Anda harus mempertimbangkan apakah properti objek ini adalah enumerable atau tidak, karena properti non-enumerable tidak akan muncul dalam a for-in lingkaran. Juga, jika properti enumerable membayangi properti prototipe yang tidak dapat dihitung, ia tidak akan muncul di dalamnya Internet Explorer 8 dan sebelumnya.

Jika Anda menginginkan daftar semua properti instan, apakah dapat dihitung atau tidak, Anda dapat menggunakannya

Object.getOwnPropertyNames(x);

Ini akan mengembalikan larik nama semua properti yang ada pada suatu objek.

Akhirnya, Anda dapat menggunakan operator typeof untuk secara langsung memeriksa tipe data properti objek:

if (typeof x.key == "undefined") {
    alert("undefined");
}

Jika properti tidak ada pada objek, maka akan mengembalikan string yang tidak terdefinisi. Lain itu akan mengembalikan tipe properti yang sesuai. Namun, perhatikan bahwa ini tidak selalu merupakan cara yang valid untuk memeriksa apakah suatu objek memiliki properti atau tidak, karena Anda dapat memiliki properti yang diatur ke tidak terdefinisi, dalam hal ini, menggunakan typeof x.key masih akan kembali benar (meskipun kuncinya masih dalam objek).

Pembaruan: Anda dapat memeriksa apakah properti ada dengan membandingkan ke properti javascript tidak terdefinisi

if (x.key === undefined) {
    alert("undefined");
}

Ini harus berfungsi kecuali kunci secara khusus diatur undefined pada objek x


30
2018-03-30 06:18



Mari kita potong beberapa kebingungan di sini. Pertama, mari kita sederhanakan dengan asumsi hasOwnProperty sudah ada; ini berlaku untuk sebagian besar browser saat ini digunakan.

hasOwnProperty mengembalikan true jika nama atribut yang diteruskan ke itu telah ditambahkan ke objek. Ini sepenuhnya independen dari nilai aktual yang diberikan kepadanya yang mungkin tepat undefined.

Karenanya:

var o = {}
o.x = undefined

var a = o.hasOwnProperty('x')  // a is true
var b = o.x === undefined // b is also true

Namun:

var o = {}

var a = o.hasOwnProperty('x')  // a is now false
var b = o.x === undefined // b is still true

Masalahnya adalah apa yang terjadi ketika sebuah objek dalam rantai prototipe memiliki atribut dengan nilai tidak terdefinisi? hasOwnProperty akan salah untuk itu, dan begitu juga !== undefined. Namun, for..in masih akan mencantumkannya dalam pencacahan.

Intinya adalah tidak ada cara lintas-browser (karena Internet Explorer tidak mengekspos __prototype__) untuk menentukan bahwa pengidentifikasi khusus belum dilampirkan pada objek atau apa pun dalam rantai prototipenya.


23
2017-09-26 09:16



Jika Anda mencari properti, maka "TIDAK". Kamu ingin:

if ('prop' in obj) { }

Secara umum Anda tidak boleh peduli apakah properti itu berasal dari prototipe atau objek.

Namun, karena Anda menggunakan 'kunci' dalam kode contoh Anda, sepertinya Anda memperlakukan objek sebagai hash, dalam hal ini jawaban Anda akan masuk akal. Semua kunci hash akan menjadi properti di objek, dan Anda menghindari properti tambahan yang disumbangkan oleh prototipe.

Jawaban John Resig sangat komprehensif, tetapi saya pikir itu tidak jelas. Terutama dengan kapan menggunakan "'prop' dalam obj".


14
2018-05-21 15:57



Ya itu :) Saya pikir Anda juga bisa melakukannya Object.prototype.hasOwnProperty.call(x, 'key') yang seharusnya juga berfungsi jika xmemiliki properti yang disebut hasOwnProperty :)

Tapi itu tes untuk properti sendiri. Jika Anda ingin memeriksa apakah itu memiliki properti yang mungkin juga dapat Anda gunakan typeof x.foo != 'undefined'.


12
2017-09-25 19:30



if (typeof x.key != "undefined") {

}

Karena

if (x.key)

gagal jika x.key memutuskan untuk false (sebagai contoh, x.key = "").


12
2017-09-25 19:39



Anda juga bisa menggunakan ES6 Reflect obyek:

x = {'key': 1};
Reflect.has( x, 'key'); // returns true

Dokumentasi pada MDN untuk Reflect.has dapat ditemukan sini.

Statis Reflect.has() metode berfungsi seperti di operator sebagai sebuah fungsi.


9
2017-10-26 15:19