Câu trả lời:
Bạn có thể lặp qua các thuộc tính của đối tượng của bạn như sau:
for(var prop in ad) {
if (ad.hasOwnProperty(prop)) {
// handle prop as required
}
}
Điều quan trọng là sử dụng hasOwnProperty()phương thức, để xác định xem đối tượng có thuộc tính được chỉ định làm thuộc tính trực tiếp hay không và không được kế thừa từ chuỗi nguyên mẫu của đối tượng.
Từ các bình luận: Bạn có thể đặt mã đó vào một hàm và làm cho nó trả về sai ngay khi nó đến phần có bình luận
Kiểm tra hiệu suất
Test Of Object.Keys vs For..In Khi kiểm tra bất kỳ thuộc tính nào
Object.keyssẽ dễ dàng nhất: var a = [1,2,3];a.something=4;console.log(Object.keys(a))Bởi vì nó đã là một phần của ECMA 5, bạn có thể bắt đầu một cách an toàn: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
Object.defineProperty(obj, 'foo', {enumerable:false, value:'foo'}).
Bạn có thể sử dụng Object.keysphương thức dựng sẵn để lấy danh sách các khóa trên một đối tượng và kiểm tra độ dài của nó.
var x = {};
// some code where value of x changes and than you want to check whether it is null or some object with values
if(Object.keys(x).length > 0){
// Your code here if x has some properties
}
var str = "MyString"; Object.keys(str);, bàn điều khiển xuất ra 8 phím, từ 0 đến 7, cho mỗi ký tự. Hay tôi vẫn chưa hiểu câu trả lời.
Điều gì về việc thực hiện một chức năng đơn giản?
function isEmptyObject(obj) {
for(var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
return false;
}
}
return true;
}
isEmptyObject({}); // true
isEmptyObject({foo:'bar'}); // false
Các hasOwnProperty gọi phương thức trực tiếp trên Object.prototypechỉ để thêm chút an toàn , hãy tưởng tượng như sau bằng cách sử dụng một obj.hasOwnProperty(...)cuộc gọi bình thường :
isEmptyObject({hasOwnProperty:'boom'}); // false
Lưu ý: (cho tương lai) Phương pháp trên chỉ dựa vào for...incâu lệnh và câu lệnh này chỉ lặp lại trên các thuộc tính có thể đếm được , trong Tiêu chuẩn ECMAScript được triển khai rộng rãi nhất (phiên bản thứ 3) mà lập trình viên không có cách nào để tạo ra các thuộc tính không thể đếm được .
Tuy nhiên, điều này đã thay đổi ngay bây giờ với ECMAScript Phiên bản thứ 5 và chúng tôi có thể tạo các thuộc tính không thể đếm được, không thể ghi hoặc không xóa được, vì vậy phương pháp trên có thể thất bại , ví dụ:
var obj = {};
Object.defineProperty(obj, 'test', { value: 'testVal',
enumerable: false,
writable: true,
configurable: true
});
isEmptyObject(obj); // true, wrong!!
obj.hasOwnProperty('test'); // true, the property exist!!
Một giải pháp ECMAScript 5 cho vấn đề này sẽ là:
function isEmptyObject(obj) {
return Object.getOwnPropertyNames(obj).length === 0;
}
Các Object.getOwnPropertyNamestrở về phương pháp một Arraychứa tên của tất cả các đặc tính riêng của một đối tượng, đếm được hay không , phương pháp này đang được thực hiện tại bởi các nhà cung cấp trình duyệt, nó đã có trên 5 Beta Chrome và mới nhất WebKit đêm xây dựng.
Object.defineProperty cũng có sẵn trên các trình duyệt và các bản phát hành Firefox 3.7 Alpha mới nhất.
hasOwnPropertytính, chức năng có thể bị sập ... Tôi biết tôi hơi hoang tưởng ... nhưng đôi khi bạn không biết mã của mình sẽ được sử dụng trong loại môi trường nào, nhưng bạn biết phương pháp nào bạn muốn sử dụng ...
Object.prototypeđó, thì nó không được liệt kê theo for...in. Vậy isEmptyObject({toString:1})sẽ thất bại. Đây là một trong những lý do không may bạn không thể hoàn toàn sử dụng Objectnhư một ánh xạ có mục đích chung.
Với jQuery bạn có thể sử dụng:
$.isEmptyObject(obj); // Returns: Boolean
Kể từ jQuery 1.4, phương thức này kiểm tra cả hai thuộc tính trên chính đối tượng và các thuộc tính được kế thừa từ các nguyên mẫu (trong đó nó không sử dụng hasOwnProperty).
Với ECMAScript Phiên bản thứ 5 trong các trình duyệt hiện đại (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +), bạn có thể sử dụng phương thức Object.keys tích hợp :
var obj = { blah: 1 };
var isEmpty = !Object.keys(obj).length;
Hoặc JavaScript cũ đơn giản:
var isEmpty = function(obj) {
for(var p in obj){
return false;
}
return true;
};
Hầu hết các trình duyệt gần đây (và node.js) đều hỗ trợ Object.keys () trả về một mảng với tất cả các khóa trong đối tượng bằng chữ của bạn để bạn có thể làm như sau:
var ad = {};
Object.keys(ad).length;//this will be 0 in this case
Hỗ trợ trình duyệt: Firefox 4, Chrome 5, Internet Explorer 9, Opera 12, Safari 5
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
Nếu bạn đang sử dụng underscore.js thì bạn có thể sử dụng hàm _.isEmpty :
var obj = {};
var emptyObject = _.isEmpty(obj);
_.isEmpty([]) // true Hãy chắc chắn kiểm tra trước: stackoverflow.com/a/22482737/1922747
Nếu bạn sẵn sàng sử dụng lodash , bạn có thể sử dụng somephương pháp này.
_.some(obj) // returns true or false
Xem ví dụ jsbin nhỏ này
_.some([1, 2]) // true Hãy chắc chắn kiểm tra trước: stackoverflow.com/a/13356338/1922747
for (var hasProperties in ad) break;
if (hasProperties)
... // ad has properties
Nếu bạn phải an toàn và kiểm tra các nguyên mẫu Object (chúng được thêm bởi một số thư viện nhất định và không có ở đó theo mặc định):
var hasProperties = false;
for (var x in ad) {
if (ad.hasOwnProperty(x)) {
hasProperties = true;
break;
}
}
if (hasProperties)
... // ad has properties
for(var memberName in ad)
{
//Member Name: memberName
//Member Value: ad[memberName]
}
Thành viên có nghĩa là tài sản thành viên, biến thành viên, bất cứ điều gì bạn muốn gọi nó> _>
Đoạn mã trên sẽ trả về MỌI THỨ, bao gồm cả toString ... Nếu bạn chỉ muốn xem liệu nguyên mẫu của đối tượng đã được mở rộng chưa:
var dummyObj = {};
for(var memberName in ad)
{
if(typeof(dummyObj[memberName]) == typeof(ad[memberName])) continue; //note A
//Member Name: memberName
//Member Value: ad[memberName]
}
Lưu ý A: Chúng tôi kiểm tra xem liệu thành viên của đối tượng giả có cùng loại với thành viên của đối tượng thử nghiệm của chúng tôi không. Nếu là phần mở rộng, loại thành viên của dummyobject phải là "không xác định"
var hasAnyProps = false; for (var key in obj) { hasAnyProps = true; break; }
// as of this line hasAnyProps will show Boolean whether or not any iterable props exist
Đơn giản, hoạt động trong mọi trình duyệt và mặc dù về mặt kỹ thuật đó là một vòng lặp cho tất cả các khóa trên đối tượng, nó KHÔNG lặp qua tất cả ... hoặc là 0 và vòng lặp không chạy hoặc có một số và nó bị hỏng sau lần đầu tiên một (vì tất cả chúng ta đang kiểm tra là nếu có BẤT CỨ ... vậy tại sao lại tiếp tục?)
Khi chắc chắn rằng đối tượng là đối tượng do người dùng xác định, cách dễ nhất để xác định xem UDO có trống không, sẽ là đoạn mã sau:
isEmpty=
/*b.b Troy III p.a.e*/
function(x,p){for(p in x)return!1;return!0};
Mặc dù phương pháp này (về bản chất) là một phương pháp suy diễn, - nó nhanh nhất và nhanh nhất có thể.
a={};
isEmpty(a) >> true
a.b=1
isEmpty(a) >> false
ps :! không sử dụng nó trên các đối tượng do trình duyệt xác định.
Bạn có thể sử dụng như sau:
Đôi bang !! tra cứu tài sản
var a = !![]; // true
var a = !!null; // false
hasOwnProperty Đây là thứ mà tôi đã từng sử dụng:
var myObject = {
name: 'John',
address: null
};
if (myObject.hasOwnProperty('address')) { // true
// do something if it exists.
}
Tuy nhiên, JavaScript đã quyết định không bảo vệ tên của phương thức, vì vậy nó có thể bị giả mạo.
var myObject = {
hasOwnProperty: 'I will populate it myself!'
};
chống đỡ trong myObject
var myObject = {
name: 'John',
address: null,
developer: false
};
'developer' in myObject; // true, remember it's looking for exists, not value.
loại
if (typeof myObject.name !== 'undefined') {
// do something
}
Tuy nhiên, nó không kiểm tra null.
Tôi nghĩ rằng đây là cách tốt nhất.
trong nhà điều hành
var myObject = {
name: 'John',
address: null
};
if('name' in myObject) {
console.log("Name exists in myObject");
}else{
console.log("Name does not exist in myObject");
}
kết quả:
Tên tồn tại trong myObject
Đây là một liên kết đi sâu vào chi tiết hơn về toán tử trong: Xác định nếu một thuộc tính đối tượng tồn tại
Chức năng ES6
/**
* Returns true if an object is empty.
* @param {*} obj the object to test
* @return {boolean} returns true if object is empty, otherwise returns false
*/
const pureObjectIsEmpty = obj => obj && obj.constructor === Object && Object.keys(obj).length === 0
Ví dụ:
let obj = "this is an object with String constructor"
console.log(pureObjectIsEmpty(obj)) // empty? true
obj = {}
console.log(pureObjectIsEmpty(obj)) // empty? true
obj = []
console.log(pureObjectIsEmpty(obj)) // empty? true
obj = [{prop:"value"}]
console.log(pureObjectIsEmpty(obj)) // empty? true
obj = {prop:"value"}
console.log(pureObjectIsEmpty(obj)) // empty? false
Còn cái này thì sao?
var obj = {},
var isEmpty = !obj;
var hasContent = !!obj