Bagaimana cara menguji objek JavaScript kosong?

3111

Setelah permintaan AJAX, terkadang aplikasi saya dapat mengembalikan objek kosong, seperti:

var a = {};

Bagaimana saya dapat memeriksa apakah itu masalahnya?

falmp
sumber
7
Apakah Anda menggunakan skrip JSON.js? Atau perpustakaan JSON lainnya. Kemudian Anda dapat menggunakan fungsi JSON.encode () untuk mengubah var menjadi string dan kemudian mengujinya.
Thevs
if( Object.entries(a).length > 0){ //do }
Muhammad Shahzad

Jawaban:

5427

ECMA 5+ :

// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object

Perhatikan, bagaimanapun, bahwa ini menciptakan array yang tidak perlu (nilai balik dari keys).

Pra-ECMA 5:

function isEmpty(obj) {
  for(var prop in obj) {
    if(obj.hasOwnProperty(prop)) {
      return false;
    }
  }

  return JSON.stringify(obj) === JSON.stringify({});
}

jQuery :

jQuery.isEmptyObject({}); // true

Lodash :

_.isEmpty({}); // true

Garis bawah :

_.isEmpty({}); // true

Hoek

Hoek.deepEqual({}, {}); // true

ExtJS

Ext.Object.isEmpty({}); // true

AngularJS (versi 1)

angular.equals({}, {}); // true

Ramda

R.isEmpty({}); // true
Adam Zerner
sumber
22
Berikut ini adalah tes kinerja antara jQuery dan garis bawah jsperf.com/isempty-vs-isemptyobject/6
Mikhail
20
Object.keys(new Date()).length === 0; jadi jawaban ini bisa menyesatkan.
cjbarth
6
Alih-alih merangkai hal-hal yang Anda bisa juga memanfaatkan fakta ini (new Date()).constructor === Date:, atau sebaliknya ({}).constructor === Object,.
John Nelson
2
angular.equals ({}, {});
Jeremy A. Barat
11
Object.keys()tidak memeriksa properti yang tidak dapat dihitung, atau simbol. Anda harus menggunakan Object.getOwnPropertyNames()dan Object.getOwnPropertySymbols()sebagai gantinya. Juga, Object.getPrototypeOf()adalah cara yang benar untuk mendapatkan prototipe objek. obj.constructordapat dengan mudah dipalsukan. Contoh: function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true.
Jesse
863

Tidak ada cara mudah untuk melakukan ini. Anda harus mengulang properti secara eksplisit:

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }

    return true;
}

Jika dukungan ECMAScript 5 tersedia, Anda dapat menggunakannya Object.keys():

function isEmpty(obj) {
    return Object.keys(obj).length === 0;
}
Christoph
sumber
56
Ini berfungsi dengan baik, atau lebih sederhana: function isEmpty (objek) {for (var i in object) {return true; } return false; }
Nicholas Kreidberg
36
Tidakkah seharusnya benar dan salah dibalik dalam fungsi ini?
namtax
25
@namtax: no - fungsi ini dinamai isEmpty(), jadi ia harus kembali falsejika memiliki properti
Christoph
6
objek kosong akan memperpanjang kelas Objek default tetapi jika prototipe objek diubah fungsi Anda yang disederhanakan akan gagal mempertimbangkan: Object.prototype.a = 'hi'; var obj = {}; waspada (obj.a); // menghasilkan "hi" isEmpty (obj) // mengembalikan false
venimus
29
Anda seharusnya tidak menggunakan contoh kedua karena O (n) kompleksitas waktu dan O (n) kompleksitas ruang, sedangkan yang pertama adalah O (1).
Brian
572

Bagi Anda yang memiliki masalah yang sama tetapi menggunakan jQuery, Anda dapat menggunakan jQuery.isEmptyObject .

Erik Töyrä Silfverswärd
sumber
43
HEI! Saya hanya menghabiskan beberapa jam men-debug masalah IE 8 hanya untuk menemukan bahwa itu jQuery.isEmptyObject yang menyebabkan masalah. Ini mengembalikan true jika objek kosong.
MFD3000
162
Mengapa Anda memposting jawaban termasuk jQuery jika pertanyaannya bukan tentang jQuery sama sekali?
Eru
47
Saya tahu ini komentar lama, tapi saya ingin tahu pertanyaan Anda @ MFD3000, karena dokumen mengatakan: mengembalikan true, jika objek kosong (seperti namanya)
Александр Фишер
21
termasuk jQuery untuk tugas dasar seperti itu bukanlah apa yang saya sebut jawaban yang tepat. Memang benar bahwa saat ini jQuery hampir ada di mana-mana, tetapi kita tidak boleh lupa bahwa jQuery dibangun dengan bahasa yang sangat mampu.
Pablo Mescher
54
Keangkuhan JS dalam komentar ini. Semua orang tahu sebagian besar JavaScript di web ditulis di jQuery, jadi sangat dapat diterima untuk memberikan solusi di sini untuk jQuery jika sudah memiliki metode bawaan untuk menguji objek. Kemungkinan ribuan pengembang mencari bantuan akan menemukan jawaban ini bermanfaat. Tidak ada yang mengatakan itu satu-satunya cara untuk melakukannya. Saya perhatikan bagaimana tidak ada yang bertindak semua elitis tentang orang yang memposting solusi untuk digunakan underscore.js...
BadHorsie
276

Ini adalah solusi pilihan saya:

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
dhruvio
sumber
1
Masalah kompatibilitas dengan IE9 BTW. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
doublejosh
3
@Ero Franzani: tidak, tidak
nikoskip
Panjang Object.keys ({}). 10 kali lebih lambat dari opsi (untuk ... dalam ...) - Saya sarankan untuk menghindarinya sebagai cara untuk menguji apakah objetc kosong.
davidhadas
10
Object.keys(new Date()).length === 0; jadi jawaban ini bisa menyesatkan.
cjbarth
new Date()bukan obyek. nd = new Date(); nd.constructor === Object;hasil dalam false.
pors
204

Anda dapat menggunakan Underscore.js .

_.isEmpty({}); // true
Baggz
sumber
19
Atau Anda dapat menggunakan lodash kosong ( lodash.com/docs#isEmpty ), tetapi bagaimana bedanya dengan menggunakan solusi jQuery - Anda masih perlu menginstal pustaka tambahan. Saya pikir solusi javascript vanilla adalah tujuannya.
tfmontague
10
Ini berbeda jika Anda ingin menggunakan JS di backend dengan Node.js. Beberapa orang akan ingin menggunakan jQuery (perpustakaan front-end yang sebagian besar digunakan untuk manipulasi DOM) di backend.
Nahn
3
@tfmontague garis bawah sangat umum pada aplikasi node, hampir sama di mana-mana seperti jQ di sisi klien. Saya sudah memiliki garis bawah yang diperlukan tetapi tidak menyadari itu memiliki fungsi ini
rw-nandemo
5
Garis bawah sedang diganti dengan lodash. Gunakan itu sebagai gantinya.
demisx
2
Berhati-hatilah dengan tipe Date, isEmpty selalu mengembalikan true untuk Date, lihat github.com/jashkenas/underscore/issues/445
mentat
116
if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

lihat http://bencollier.net/2011/04/javascript-is-an-object-empty/

es cologne
sumber
5
Ini termasuk properti non-enumerable, jika Anda peduli.
Panjang Object.getOwnPropertyNames ({}). 10 kali lebih lambat dari opsi (untuk ... dalam ...) - Saya sarankan untuk menghindarinya sebagai cara untuk menguji apakah objetc kosong.
davidhadas
4
Object.getOwnPropertyNames(new Date()).length === 0; jadi jawaban ini bisa menyesatkan.
cjbarth
80

Bagaimana dengan menggunakan JSON.stringify? Ini hampir tersedia di semua browser modern.

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}
Ateszki
sumber
23
return (JSON.stringify (obj) == '{}')
Vic
26
Ini lambat dan masalah kecepatan untuk utilitas semacam ini. Tes perf cepat di sini: jsperf.com/empty-object-test
1
Ini adalah pilihan yang sangat lambat - saya sarankan untuk menggunakan opsi (untuk ... dalam) sebagai gantinya
davidhadas
2
Dan itu tidak berfungsi untuk objek yang berisi fungsi.
Felix Kling
1
Ini juga akan menimbulkan kesalahan jika ada referensi melingkar di objek. Jadi lambat, tidak bisa diandalkan dan bisa melempar kesalahan dan merusak yang lainnya. Tidak ada alasan untuk menggunakannya.
Burak
62

Saya hanya mengalami situasi yang sama. Saya tidak ingin menggunakan JQuery, dan ingin melakukan ini menggunakan Javascript murni.

Dan apa yang saya lakukan adalah, menggunakan kondisi berikut, dan itu berhasil untuk saya.

var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
   //Code here..
}

Untuk tidak sama dengan, gunakan ini: JSON.stringify(obj) !== '{}'

Lihatlah JSFiddle ini

Anish Nair
sumber
4
Akan gagal untuk objek dengan referensi melingkar seperti JSON.stringify secara khusus melempar pengecualian untuk mereka.
Pedro Montoto García
1
@ PedroMontotoGarcía Ok dan bagaimana benda kosong akan memiliki referensi melingkar?
KthProg
8
Jika objek tidak kosong (dan itu harus bekerja untuk mereka juga).
Pedro Montoto García
Ini tampaknya telah disebutkan oleh @Ateszki dan merupakan salah satu cara paling lambat untuk memeriksa apakah suatu objek tidak kosong.
cwadding
Oh ya .. aku melewatkannya. Saya mengalami situasi di mana saya ingin mencapai javascript ini, dan setelah sedikit berpikir saya menemukan cara ini. @Ateszki, Bahkan saya berpikir seperti yang Anda lakukan. :-) Btw, ada banyak jawaban untuk ini, jadi saya melewatkan jawaban Anda.
Anish Nair
60

Pertanyaan lama, tetapi baru saja memiliki masalah. Termasuk JQuery sebenarnya bukan ide yang bagus jika tujuan Anda satu-satunya adalah memeriksa apakah objek tidak kosong. Sebaliknya, cukup jauh ke dalam kode JQuery , dan Anda akan mendapatkan jawabannya:

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}
Jonathan Petitcolas
sumber
5
Ini hanya berguna jika beberapa proses lain belum menambahkan prototipe ke objek dasar Anda. Untuk membuat ini benar-benar bisa diterapkan, Anda perlu menguji untuk obj.hasOwnProperty (nama)
mpemburn
1
Ini tidak menambah apa pun pada jawaban Christoph dari 2009.
Dan Dascalescu
39

Ada cara sederhana jika Anda menggunakan browser yang lebih baru. Object.keys(obj).length == 0

unduh
sumber
1
Dari mana keysproperti itu berasal?
2
Ini adalah metode standar dalam ECMAScript 5.1
unduh
1
Bagaimana komentar di atas memiliki 4 upvotes? Ya, Object.keysadalah metode standar tetapi objek tidak memiliki properti kunci. Jadi kode ini akan melaporkan objek apa pun sebagai kosong kecuali secara tidak sengaja memiliki properti bernama keydengan nilai yang lagi sebagai properti bernama lengthyang bukan nol. Mengerikan!
scravy
Object.keys(new Date()).length === 0; jadi jawaban ini bisa menyesatkan.
cjbarth
11
@scravy Object adalah Object kelas. Objek memiliki metode statis bernama 'kunci' yang menerima objek sebagai argumen. Metode ini mengembalikan array string di mana string adalah nama properti. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Sgnl
34

Performa

Hari ini 2020.01.17 Saya melakukan tes pada MacOs HighSierra 10.13.6 di Chrome v79.0, Safari v13.0.4 dan Firefox v72.0, untuk solusi yang dipilih.

Kesimpulan

  • solusi berdasarkan for-in(A, J, L, M) adalah yang tercepat
  • solusi berdasarkan JSON.stringify(B, K) lambat
  • mengherankan juga solusi berdasarkan Object(N) lambat

masukkan deskripsi gambar di sini

Detail

Dalam cuplikan di bawah ini disajikan 15 solusi. Jika Anda ingin menjalankan tes kinerja pada mesin Anda, klik DI SINI .

masukkan deskripsi gambar di sini

Kamil Kiełczewski
sumber
banyak dari ini tidak masuk akal karena Anda mendasarkan semuanya pada pengembalian yang salah dan atau benar. Terkadang pemrograman membutuhkan pernyataan if atau operator ternary. just fyi
Christian Matthew
1
Ini adalah jawaban terbaik, terima kasih, solusi pertama bekerja seperti pesona
Carlos Jesus Arancibia Taborga
33

Menggunakan Object.keys (obj) .length (seperti yang disarankan di atas untuk ECMA 5+) 10 kali lebih lambat untuk objek kosong! tetap dengan opsi sekolah lama (untuk ... dalam).

Diuji di bawah Node, Chrome, Firefox dan IE 9, menjadi jelas bahwa untuk sebagian besar kasus penggunaan:

  • (untuk ... dalam ...) adalah opsi tercepat untuk digunakan!
  • Object.keys (obj). Panjangnya 10 kali lebih lambat untuk objek kosong
  • JSON.stringify (obj). Panjang selalu yang paling lambat (tidak mengejutkan)
  • Object.getOwnPropertyNames (obj) .length membutuhkan waktu lebih lama dari Object.keys (obj) .length bisa lebih lama pada beberapa sistem.

Kinerja bottom line, gunakan:

function isEmpty(obj) { 
   for (var x in obj) { return false; }
   return true;
}

atau

function isEmpty(obj) {
   for (var x in obj) { if (obj.hasOwnProperty(x))  return false; }
   return true;
}

Lihat hasil pengujian terperinci dan kode pengujian di Apakah objek kosong?

davidhadas
sumber
Object.keyslambat, tetapi kode kurang. Pada halaman kecil, di mana ini disebut ... mungkin 10 kali ... Apakah ini masih lebih lambat mengingat waktu penguraian tambahan kode tambahan?
yankee
32

Anda dapat memeriksa jumlah kunci Objek:

if (Object.keys(a).length > 0) {
    // not empty
}
Ashutosh Ranjan
sumber
8
Mengapa Anda menambahkan komentar untuk jawaban yang sudah diberikan dan memberikan jawaban yang lebih buruk? stackoverflow.com/a/32108184/4229159 dan ini adalah jawaban pertama dari bulan April
Alejandro Vales
Bagaimana jika saya memiliki objek yang sangat besar dan melakukannya pada setiap loop hanya untuk melihat apakah objek itu kosong?
StefansArya
27
  1. Hanya solusinya. Bisakah server Anda menghasilkan beberapa properti khusus jika tidak ada data?

    Sebagai contoh:

    var a = {empty:true};

    Maka Anda dapat dengan mudah memeriksanya dalam kode panggilan balik AJAX Anda.

  2. Cara lain untuk memeriksanya:

    if (a.toSource() === "({})")  // then 'a' is empty

EDIT : Jika Anda menggunakan pustaka JSON (fe JSON.js), maka Anda dapat mencoba fungsi JSON.encode () dan menguji hasilnya terhadap string nilai kosong.

Mereka
sumber
6
toSource()tidak standar dan tidak berfungsi di IE atau Opera (dan berpotensi peramban lain yang tidak saya periksa)
Christoph
4
@Thevs: mungkin Anda memiliki salinan berbeda dari versi ECMA-262 saat ini, tetapi milik saya tidak mencantumkan toSourceproperti di bagian 15.2.4; menurut MDC, ini diperkenalkan di JS1.3 (yaitu Netscape Navigator 4.06), tetapi BUKAN dalam ECMA-262, edisi ke-3!
Christoph
4
@Thevs: yah, setidaknya 2 vendor browser penting tidak mengimplementasikannya, jadi ini hampir tidak de-facto-standar, dan karena tidak ada di ECMA-262, itu juga bukan yang asli ...
Christoph
4
Bahkan ketika itu berhasil, toSource()adalah cara yang mengerikan untuk melakukan ini (sebagaimana adanya JSON.encode()). Perlu membuat string yang mewakili seluruh objek Anda hanya untuk memeriksa apakah itu kosong. Ada overhead mengkonversi hal-hal menjadi string, tetapi terlebih lagi itu perlu mengkonversi sejuta hal jika objek Anda memiliki sejuta properti, sementara sebenarnya hanya dengan melihat satu saja akan memberi tahu Anda bahwa itu tidak kosong.
Jasper
4
@ Mereka overhead lebih besar, bahkan jika itu mungkin (saya tidak yakin itu dalam setiap keadaan) dalam urutan yang sama besarnya. Namun, jawaban itu melibatkan pengembalian yang salah segera setelah properti yang berbeda ditemukan yang membuat ceritanya berbeda secara bersamaan ...
Jasper
25

Saya telah membuat fungsi lengkap untuk menentukan apakah objek kosong.

Ini menggunakan Object.keysdari fungsionalitas ECMAScript 5 (ES5) jika memungkinkan untuk mencapai kinerja terbaik (lihat tabel kompatibilitas ) dan mundur ke pendekatan yang paling kompatibel untuk mesin yang lebih lama (browser).

Larutan

/**
 * Returns true if specified object has no properties,
 * false otherwise.
 *
 * @param {object} object
 * @returns {boolean}
 */
function isObjectEmpty(object)
{
    if ('object' !== typeof object) {
        throw new Error('Object must be specified.');
    }

    if (null === object) {
        return true;
    }

    if ('undefined' !== Object.keys) {
        // Using ECMAScript 5 feature.
        return (0 === Object.keys(object).length);
    } else {
        // Using legacy compatibility mode.
        for (var key in object) {
            if (object.hasOwnProperty(key)) {
                return false;
            }
        }
        return true;
    }
}

Inilah Intisari untuk kode ini.

Dan inilah JSFiddle dengan demonstrasi dan tes sederhana.

Saya harap ini akan membantu seseorang. Bersulang!

Slava Fomin II
sumber
3
Ini gagal untuk nullobjek.
Hai @torazaburo! Terima kasih telah memperhatikan! Saya telah memperbarui semua sumber dengan implementasi yang benar.
Slava Fomin II
1
Panjang Object.keys ({}). 10 kali lebih lambat dari opsi (untuk ... dalam ...) - Saya sarankan untuk menghindarinya sebagai cara untuk menguji apakah objetc kosong.
davidhadas
1
Object.keys(new Date()).length === 0; jadi jawaban ini bisa menyesatkan.
cjbarth
19

Saya menggunakan ini.

function isObjectEmpty(object) {
  var isEmpty = true;
  for (keys in object) {
     isEmpty = false;
     break; // exiting since we found that the object is not empty
  }
  return isEmpty;
}

Misalnya:

var myObject = {}; // Object is empty
var isEmpty  = isObjectEmpty(myObject); // will return true;

// populating the object
myObject = {"name":"John Smith","Address":"Kochi, Kerala"}; 

// check if the object is empty
isEmpty  = isObjectEmpty(myObject); // will return false;

dari sini

Memperbarui

ATAU

Anda dapat menggunakan implementasi jQuery dari isEmptyObject

function isEmptyObject(obj) {
  var name;
  for (name in obj) {
    return false;
  }
  return true;
}
kiranvj
sumber
Hai. ketika Anda menguji fungsi ini dengan angka atau boolean true atau false return true dan ini bukan hasil yang benar. isObjectEmpty (true). isObjectEmpty (false). isObjectEmpty (1)
iman
2
Kami memeriksa apakah objek kosong, bukan jika tipe data adalah objek. Dalam kasus Anda untuk memeriksa apakah ini sebuah objek, kita perlu sesuatu seperti if (typeof a === "object") {...}
kiranvj
15

Contoh berikut menunjukkan cara menguji apakah objek JavaScript kosong, jika dengan kosong kami berarti tidak memiliki properti sendiri.

Script berfungsi pada ES6.

const isEmpty = (obj) => {
    if (obj === null ||
        obj === undefined ||
        Array.isArray(obj) ||
        typeof obj !== 'object'
    ) {
        return true;
    }
    return Object.getOwnPropertyNames(obj).length === 0;
};
console.clear();
console.log('-----');
console.log(isEmpty(''));           // true
console.log(isEmpty(33));           // true
console.log(isEmpty([]));           // true
console.log(isEmpty({}));           // true
console.log(isEmpty({ length: 0, custom_property: [] })); // false
console.log('-----');
console.log(isEmpty('Hello'));      // true
console.log(isEmpty([1, 2, 3]));    // true
console.log(isEmpty({ test: 1 }));  // false
console.log(isEmpty({ length: 3, custom_property: [1, 2, 3] })); // false
console.log('-----');
console.log(isEmpty(new Date()));   // true
console.log(isEmpty(Infinity));     // true
console.log(isEmpty(null));         // true
console.log(isEmpty(undefined));    // true

GibboK
sumber
15

Sesuai spesifikasi ES2017 pada Object.entries () , pemeriksaannya sederhana menggunakan peramban modern mana pun -

Object.entries({}).length === 0
Vikrant
sumber
3
Apakah ada manfaat menggunakan ini di atas Object.keysatau Object.values?
faintsignal
@faintsignal menggunakan itu baik-baik saja. Saya baru saja menambahkan entri karena tidak menemukannya di komentar.
Vikrant
13
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}
Lightness Races di Orbit
sumber
4
Itu akan melaporkan juga benar, ketika, misalnya, perpustakaan JavaScript diperluas Object dengan metode melalui rantai prototipe, karena itu enumerable dan for inpernyataan loop melalui properti enumerable.
viam0Zah
12

jQuery memiliki fungsi khusus isEmptyObject()untuk kasus ini:

jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false

Baca lebih lanjut di http://api.jquery.com/jQuery.isEmptyObject/


sumber
12

Saya akan memeriksa apakah memiliki setidaknya satu kunci. Itu sudah cukup untuk memberi tahu saya bahwa itu tidak kosong.

typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
Tudor Morar
sumber
1
bagaimana jika kunci pertama mengembalikan falsenilai? hasilnya adalah falseyang salah.
Jimmy Obonyo Abor
Saya sudah menguji untuk itu. Bisakah Anda memberi contoh kerja?
Tudor Morar
1
ini singkat dan ringkas, tetapi akan menghasilkan kesalahan runtime jika Objek tidak terdefinisi
Mrinmoy
11

Di bawah tenda semua metode pemeriksaan kosong di semua perpustakaan menggunakan kunci objek memeriksa logika. Ini cara yang aneh untuk membuatnya dimengerti, yang dapat Anda masukkan ke dalam metode, Dijelaskan di sini .

for(key in obj){
   //your work here.
 break;
}

Yang telah berevolusi dalam ES5 , sekarang secara sederhana Anda dapat memeriksa panjang kunci objek, menggunakan Object.Keysmetode yang mengambil objek Anda sebagai parameternya:

if(Object.keys(obj).length > 0){
 //do your work here
}

Atau jika Anda menggunakan Lodash (Anda harus) maka.

 _.isEmpty(obj) //==true or false
ahmadalibaloch
sumber
Meskipun benar sebagai cara aneh untuk membuat pernyataan if - itu mungkin akan membingungkan seseorang yang akan mempertahankan kode setelah Anda.
Soren
10


Anda dapat menggunakan kode sederhana ini yang tidak menggunakan jQuery atau perpustakaan lain

var a=({});

//check is an empty object
if(JSON.stringify(a)=='{}') {
    alert('it is empty');
} else {
    alert('it is not empty');
}

Kelas JSON dan fungsinya ( parse dan stringify ) sangat berguna tetapi memiliki beberapa masalah dengan IE7 yang dapat Anda perbaiki dengan kode sederhana ini http://www.json.org/js.html .

Other Simple Way (Cara paling sederhana):
Anda bisa menggunakan cara ini tanpa menggunakan objek jQuery atau JSON .

var a=({});

function isEmptyObject(obj) {
    if(typeof obj!='object') {
        //it is not object, so is not empty
        return false;
    } else {
        var x,i=0;
        for(x in obj) {
            i++;
        }
        if(i>0) {
            //this object has some properties or methods
            return false;
        } else {
            //this object has not any property or method
            return true;
        }
    }
}

alert(isEmptyObject(a));    //true is alerted
iman
sumber
JSON.stringifysolusi gagal jika objek berisi properti yang tidak dapat di-stringifikasi seperti fungsi atau "tidak terdefinisi", meskipun diberikan bahwa itu adalah kasus tepi.
10

Cara terbaik yang saya temukan:

function isEmpty(obj)
{
    if (!obj)
    {
        return true;
    }

    if (!(typeof(obj) === 'number') && !Object.keys(obj).length)
    {
        return true;
    }

    return false;
}

Bekerja untuk:

    t1: {} -> true
    t2: {0:1} -: false
    t3: [] -> true
    t4: [2] -> false
    t5: null -> true
    t6: undefined -> true
    t7: "" -> true
    t8: "a" -> false
    t9: 0 -> true
    t10: 1 -> false
DiegoAraujo
sumber
3
Saya akan mengatakan bahwa 0 tidak kosong karena sebenarnya angka. semuanya terlihat bagus tetapi perbaikannya mudah. dalam pernyataan if pertama tambahkan ini. if (!obj && obj !== 0).
mjwrazor
9

Saya ambil:

function isEmpty(obj) {
    return !Object.keys(obj).length > 0;
}

var a = {a:1, b:2}
var b = {}

console.log(isEmpty(a)); // false
console.log(isEmpty(b)); // true

Hanya, saya tidak berpikir semua browser menerapkan Object.keys()saat ini.

NiKo
sumber
2
Object.keys(new Date()).length === 0; jadi jawaban ini bisa menyesatkan.
cjbarth
3
Tergantung jika Anda menganggap kencan selalu "penuh" meskipun tidak pernah membuka kunci. Tetapi saya setuju bahwa jika itu adalah rencana Anda, menambahkan beberapa contoh pemeriksaan tambahan untuk konstruktor Tanggal adalah pilihan yang baik.
NiKo
9

Jika jQuery dan browser web tidak tersedia, ada juga fungsi isEmpty di underscore.js.

_.isEmpty({}) // returns true

Selain itu, ia tidak menganggap parameter input sebagai objek. Untuk daftar atau string atau tidak terdefinisi, itu juga akan mengubah jawaban yang benar.

jichi
sumber
7

Peringatan! Waspadai batasan JSON.

javascript:
  obj={  f:function(){}  };
  alert( "Beware!! obj is NOT empty!\n\nobj = {  f:function(){}  }" + 
               "\n\nJSON.stringify( obj )\n\nreturns\n\n" +
                        JSON.stringify( obj ) );

menampilkan

    Waspadalah !! obj TIDAK kosong!

    obj = {f: function () {}}

    JSON.stringify (obj)

    kembali

    {}
Ekim
sumber
7

Jawaban yang benar adalah:

const isEmptyObject = obj =>
  Object.getOwnPropertyNames(obj).length === 0 &&
  Object.getOwnPropertySymbols(obj).length === 0 &&
  Object.getPrototypeOf(obj) === Object.prototype;

Ini memeriksa bahwa:

  • Objek tidak memiliki properti sendiri (terlepas dari enumerability).
  • Objek tidak memiliki simbol properti sendiri.
  • Prototipe objeknya persis Object.prototype.

Dengan kata lain, objek tidak dapat dibedakan dari objek yang dibuat {}.

Jesse
sumber
6

Selain jawaban Thevs:

var o = {};
alert($.toJSON(o)=='{}'); // true

var o = {a:1};
alert($.toJSON(o)=='{}'); // false

itu jquery + jquery.json

starikovs
sumber
Saya tidak suka menggunakan JSON karena tidak dapat bekerja dengan struktur objek melingkar.
berfungsi
2
Jika halaman Anda memuat jQuery lalu gunakan $.isEmptyObject(), jangan buang siklus dengan konversi yang tidak jelas.
skierpage
6

Sugar.JS menyediakan objek yang diperluas untuk tujuan ini. Kode ini bersih dan sederhana:

Buat objek yang diperluas:

a = Object.extended({})

Periksa ukurannya:

a.size()
mikemaccana
sumber