Câu hỏi Làm cách nào để kiểm tra đối tượng JavaScript trống?


Sau một yêu cầu AJAX, đôi khi ứng dụng của tôi có thể trả về một đối tượng trống, như:

var a = {};

Làm thế nào tôi có thể kiểm tra xem đó là trường hợp?


1874
2018-03-25 01:39


gốc


Bạn có sử dụng tập lệnh JSON.js không? Hoặc bất kỳ thư viện JSON nào khác. Sau đó, bạn có thể sử dụng hàm JSON.encode () để chuyển đổi var thành chuỗi và sau đó kiểm tra nó. - Thevs


Các câu trả lời:


ECMA 5+:

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

Pre-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

Dấu gạch dưới:

_.isEmpty({}); // true

Hoek

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

ExtJS

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

AngularJS (phiên bản 1)

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

Ramda

R.isEmpty({}); // true

3088
2018-03-25 01:49



Đây là thử nghiệm hiệu suất giữa jQuery và gạch dưới jsperf.com/isempty-vs-isemptyobject/6 - Mikhail
Object.keys(new Date()).length === 0; vì vậy câu trả lời này có thể gây hiểu nhầm. - cjbarth
Thay vì xâu chuỗi những thứ bạn cũng có thể tận dụng lợi thế của thực tế này: (new Date()).constructor === Datehoặc ngược lại, ({}).constructor === Object. - John Nelson
angular.equals ({}, {}); - Jeremy A. West
Object.keys() không kiểm tra các thuộc tính hoặc ký hiệu không thể đếm được. Bạn cần sử dụng Object.getOwnPropertyNames() và Object.getOwnPropertySymbols() thay thế. Cũng thế, Object.getPrototypeOf() là cách chính xác để lấy mẫu thử nghiệm của đối tượng. obj.constructor có thể dễ dàng giả mạo. Thí dụ: function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true. - Jesse


Không có cách nào dễ dàng để làm điều này. Bạn sẽ phải lặp lại các thuộc tính một cách rõ ràng:

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

    return true;
}

Nếu Hỗ trợ ECMAScript 5 có sẵn, bạn có thể sử dụng Object.keys() thay thế:

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

747
2018-05-19 14:07



Điều này hoạt động tốt, hoặc đơn giản hơn: function isEmpty (object) {for (var i trong đối tượng) {return true; } trả về false; } - Nicholas Kreidberg
Không đúng và sai được đảo ngược trong chức năng này? - namtax
@namtax: no - chức năng được đặt tên isEmpty(), vì vậy nó sẽ trở lại false nếu nó có tài sản - Christoph
đối tượng rỗng sẽ mở rộng lớp Object mặc định nhưng nếu nguyên mẫu đối tượng được sửa đổi, hàm đơn giản hóa của bạn sẽ không xem xét: Object.prototype.a = 'hi'; var obj = {}; cảnh báo (obj.a); // output "hi" isEmpty (obj) // trả về false - venimus
Bạn không nên sử dụng ví dụ thứ hai vì nó là độ phức tạp thời gian O (n) và độ phức tạp không gian O (n), trong khi đầu tiên là O (1). - Brian


Đối với những người bạn có cùng vấn đề nhưng sử dụng jQuery, bạn có thể sử dụng jQuery.isEmptyObject.


539
2018-03-22 20:35



CHÀO! Tôi chỉ mất một vài giờ gỡ lỗi các vấn đề IE 8 chỉ để thấy rằng đó là jQuery.isEmptyObject đã gây ra vấn đề. Nó trả về true nếu đối tượng rỗng. - MFD3000
Tại sao bạn đăng câu trả lời bao gồm jQuery nếu câu hỏi không phải là về jQuery ở tất cả? - Eru
Tôi biết một bình luận cũ của nó, nhưng tôi tự hỏi câu hỏi của bạn @ MFD3000, bởi vì docu nói: trả về true, nếu đối tượng trống (như tên cho biết nó) - Александр Фишер
bao gồm jQuery cho một nhiệm vụ cơ bản như vậy không phải là những gì tôi sẽ gọi là câu trả lời đúng. Đúng là ngày nay jQuery gần như là phổ biến, nhưng chúng ta vẫn không nên quên nó được xây dựng xung quanh một ngôn ngữ rất có khả năng. - Pablo Mescher
Điển hình JS snobbery trong những ý kiến. Mọi người đều biết một tỷ lệ rất lớn của JavaScript trên web được viết trên jQuery, vì vậy nó hoàn toàn chấp nhận được để cung cấp một giải pháp ở đây cho jQuery nếu nó đã có sẵn một phương pháp để thử nghiệm các đối tượng. Có khả năng hàng nghìn nhà phát triển đang tìm kiếm trợ giúp sẽ tìm thấy câu trả lời này hữu ích. Không ai nói đó là cách duy nhất để làm điều đó. Tôi nhận thấy làm thế nào không ai hành động tất cả các elitist về những người đã đăng một giải pháp để sử dụng underscore.js... - BadHorsie


Bạn có thể dùng Underscore.js.

_.isEmpty({}); // true

184
2017-07-12 07:46



Hoặc bạn có thể sử dụng lodash là trống (lodash.com/docs#isEmpty), nhưng làm thế nào mà bất kỳ khác nhau từ việc sử dụng một giải pháp jQuery - bạn vẫn cần phải cài đặt một thư viện bổ sung. Tôi nghĩ rằng một giải pháp vani javascript là ý định. - tfmontague
Nó khác nếu bạn muốn sử dụng JS trên backend với Node.js. Rất ít người sẽ muốn sử dụng jQuery (một thư viện front-end được sử dụng chủ yếu cho các thao tác DOM) trên backend. - Nahn
@tfmontague gạch dưới là rất phổ biến trên các ứng dụng nút, gần như ở khắp mọi nơi như jQ là ở phía khách hàng. Tôi đã có dấu gạch dưới bắt buộc nhưng không nhận ra nó có chức năng này - rw-nandemo
Dấu gạch dưới đang được thay thế bằng lodash. Sử dụng thay vào đó. - demisx
Chỉ cần cẩn thận với các kiểu Date, isEmpty luôn trả về true cho Date, xem github.com/jashkenas/underscore/issues/445 - mentat


Đây là giải pháp ưa thích của tôi:

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty

181
2017-11-06 13:48



Sự cố tương thích với IE9 BTW. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - doublejosh
giải pháp này hoạt động với ie8? - Jero Franzani
@Jero Franzani: không có nó không - nikoskip
Chiều dài của Object.keys ({}) chậm hơn 10 lần so với tùy chọn (cho ... trong ...) - tôi khuyên bạn nên tránh nó như một cách để kiểm tra xem objetc có rỗng không. - davidhadas
Object.keys(new Date()).length === 0; vì vậy câu trả lời này có thể gây hiểu nhầm. - cjbarth


if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

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


103
2018-01-23 20:07



Điều này không hoạt động trong IE8 trở xuống. - Stilltorik
Điều này bao gồm các thuộc tính không thể liệt kê, trong trường hợp bạn quan tâm.
Chiều dài của Object.getOwnPropertyNames ({}) chậm hơn 10 lần so với tùy chọn (cho ... trong ...) - Tôi khuyên bạn nên tránh nó như một cách để kiểm tra xem objetc có rỗng không. - davidhadas
Object.getOwnPropertyNames(new Date()).length === 0; vì vậy câu trả lời này có thể gây hiểu nhầm. - cjbarth


Làm thế nào về việc sử dụng JSON.stringify? Nó gần như có sẵn trong tất cả các trình duyệt hiện đại.

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}

62
2018-01-31 10:55



return (JSON.stringify (obj) == '{}') - Vic
Đây là vấn đề chậm và tốc độ cho loại tiện ích này. Kiểm tra nhanh chóng ở đây: jsperf.com/empty-object-test - rur
Đây là tùy chọn rất chậm - tôi khuyên bạn nên sử dụng tùy chọn (cho ... trong) - davidhadas
Và nó không hoạt động cho các đối tượng chứa hàm. - Felix Kling


Câu hỏi cũ, nhưng chỉ có vấn đề. Bao gồm cả JQuery không thực sự là một ý tưởng tốt nếu mục đích duy nhất của bạn là kiểm tra xem đối tượng có trống không. Thay vào đó, chỉ cần thâm nhập sâu vào Mã của JQueryvà bạn sẽ nhận được câu trả lời:

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

51
2017-09-22 05:38



Điều này chỉ hữu ích nếu một số quy trình khác chưa thêm nguyên mẫu vào đối tượng cơ sở của bạn. Để làm cho điều này thực sự khả thi, bạn cần kiểm tra obj.hasOwnProperty (tên) - mpemburn