JavaScript判斷對象是否為空對象的幾種方法
https://blog.csdn.net/MyFuture_MyDream/article/details/116225441
var data = {};
var b = $.isEmptyObject(data); //true
判斷是否為空對象在實際開發中很常見,今天就讓我們來整理一下有哪些方法吧。
1、空對象對應的字符串為 "{}"
-
var data = {};
-
var b =
JSON.
stringify(data) ==
"{}";
-
console.
log(b);
// true
2、for in
-
var obj = {};
-
var b =
function (
) {
-
for (
var key
in obj) {
-
return
false;
-
}
-
return
true;
-
};
-
console.
log(
b());
//true
3、jquery 的 isEmptyObject()方法
這個方法是對第二個方法的封裝。
-
var data = {};
-
var b = $.
isEmptyObject(data);
-
console.
log(b);
//true
4、Object.getOwnPropertyNames()
Object 對象的 getOwnPropertyNames 方法,獲取到對象中的屬性名,存到一個數組中,返回數組對象,我們可以通過判斷數組的 length 來判斷此對象是否為空。
-
var data = {};
-
var arr =
Object.
getOwnPropertyNames(data);
-
console.
log(arr.
length ==
0);
// true
5、ES6 的 Object.keys()
此方法也是返回對象中屬性名組成的數組。
-
var data = {};
-
var arr =
Object.
keys(data);
-
console.
log(arr.
length ==
0);
// true
JSON.stringify()擴展
JSON.stringify() 方法用於將 JavaScript 值轉換為 JSON 字符串。
語法:
JSON.stringify(value[, replacer[, space]])
參數說明:
-
value:必需,要轉換的 JavaScript 值(通常為對象或數組)。
-
replacer: 可選。用於轉換結果的函數或數組。 如果 replacer 為函數,則 JSON.stringify 將調用該函數,並傳入每個成員的鍵和值。使用返回值而不是原始值。 如果此函數返回 undefined,則排除成員。根對象的鍵是一個空字符串:""。如果 replacer 是一個數組,則僅轉換該數組中具有鍵值的成員。成員的轉換順序與鍵在數組中的順序一樣。
-
space:可選,文本添加縮進、空格和換行符,如果 space 是一個數字,則返回值文本在每個級別縮進指定數目的空格,如果 space 大於 10,則文本縮進 10 個空格。space 也可以使用非數字,如:\t。
-
返回值:返回包含 JSON 文本的字符串。
JSON.stringify()特性挺多的,具體如下:
1、第一大特性
對於 undefined、任意的函數以及 symbol 三個特殊的值分別作為對象屬性的值、數組元素、單獨的值時 JSON.stringify() 將返回不同的結果。 來看這道題:
-
const data = {
-
a:
"aaa",
-
b:
undefined,
-
c:
Symbol(
"dd"),
-
fn:
function (
) {
-
return
true;
-
},
-
};
-
JSON.
stringify(data);
// 輸出:?
-
-
// "{"a":"aaa"}"
這是因為 undefined、任意的函數以及 symbol 作為對象屬性值時 JSON.stringify() 將跳過(忽略)對它們進行序列化。
假設 undefined、任意的函數以及 symbol 值作為數組元素會是怎樣呢?
-
JSON.
stringify([
-
"aaa",
-
undefined,
-
function
aa(
) {
-
return
true;
-
},
-
Symbol(
"dd"),
-
]);
// 輸出:?
-
-
// "["aaa",null,null,null]"
這是因為 undefined、任意的函數以及 symbol 作為數組元素值時,JSON.stringify() 會將它們序列化為 null。
還有,undefined、任意的函數以及 symbol 被 JSON.stringify() 作為單獨的值進行序列化時都會返回 undefined。
-
JSON.
stringify(
function
a(
) {
-
console.
log(
"a");
-
});
-
// undefined
-
JSON.
stringify(
undefined);
-
// undefined
-
JSON.
stringify(
Symbol(
"dd"));
-
// undefined
小結
-
undefined、任意的函數以及 symbol 作為對象屬性值時 JSON.stringify() 對跳過(忽略)它們進行序列化。
-
undefined、任意的函數以及 symbol 作為數組元素值時,JSON.stringify() 將會將它們序列化為 null。
-
undefined、任意的函數以及 symbol 被 JSON.stringify() 作為單獨的值進行序列化時,都會返回 undefined。
2、第二大特性
非數組對象的屬性不能保證以特定的順序出現在序列化后的字符串中。因為 JSON.stringify() 序列化時會忽略一些特殊的值,所以不能保證序列化后的字符串還是以特定的順序出現(數組除外)。
-
const data = {
-
a:
"aaa",
-
b:
undefined,
-
c:
Symbol(
"dd"),
-
fn:
function (
) {
-
return
true;
-
},
-
d:
"ddd",
-
};
-
JSON.
stringify(data);
// 輸出:?
-
// "{"a":"aaa","d":"ddd"}"
-
-
JSON.
stringify([
-
"aaa",
-
undefined,
-
function
aa(
) {
-
return
true;
-
},
-
Symbol(
"dd"),
-
"eee",
-
]);
// 輸出:?
-
-
// "["aaa",null,null,null,"eee"]"
3、第三大特性
轉換值如果有 toJSON() 函數,該函數返回什么值,序列化結果就是什么值,並且忽略其他屬性的值。
-
JSON.
stringify({
-
say:
"hello JSON.stringify",
-
toJSON:
function(
) {
-
return
"today i learn";
-
}
-
})
-
// "today i learn"
4、第四大特性
JSON.stringify() 將會正常序列化 Date 的值。
-
JSON.stringify({ now:
new
Date() });
-
//
"{"now
":"
2019
-12
-08T07:
42:
11.973Z
"}"
5、第五大特性
NaN 和 Infinity 格式的數值及 null 都會被當做 null。
-
JSON.stringify(
NaN)
-
//
"null"
-
JSON.stringify(
null)
-
//
"null"
-
JSON.stringify(
Infinity)
-
//
"null"
6、第六大特性
布爾值、數字、字符串的包裝對象在序列化過程中會自動轉換成對應的原始值。
-
JSON.stringify([
new
Number(
1),
new
String(
"false"),
new
Boolean(
false)]);
-
//
"[1,"
false
",false]"
7、第七大特性
其他類型的對象,包括 Map/Set/WeakMap/WeakSet,僅會序列化可枚舉的屬性。
-
// 不可枚舉的屬性默認會被忽略:
-
JSON.stringify(
-
Object.create(
-
null,
-
{
-
x: { value:
'json', enumerable:
false },
-
y: { value:
'stringify', enumerable:
true }
-
}
-
)
-
);
-
//
"{"y
":"stringify
"}"
8、第八大特性
深拷貝最粗暴的方式是JSON.parse(JSON.stringify()),這個方式實現深拷貝會因為序列化的諸多特性從而導致諸多的坑點:比如現在我們要說的循環引用問題。
-
// 對包含循環引用的對象(對象之間相互引用,形成無限循環)執行此方法,會拋出錯誤。
-
const obj = {
-
name:
"loopObj"
-
};
-
const loopObj = {
-
obj
-
};
-
// 對象之間形成循環引用,形成閉環
-
obj.
loopObj = loopObj;
-
-
// 封裝一個深拷貝的函數
-
function
deepClone(
obj) {
-
return
JSON.
parse(
JSON.
stringify(obj));
-
}
-
// 執行深拷貝,拋出錯誤
-
deepClone(obj)
-
/**
-
VM44:9 Uncaught TypeError: Converting circular structure to JSON
-
--> starting at object with constructor 'Object'
-
| property 'loopObj' -> object with constructor 'Object'
-
--- property 'obj' closes the circle
-
at JSON.stringify (<anonymous>)
-
at deepClone (<anonymous>:9:26)
-
at <anonymous>:11:13
-
*/
歡迎關注公眾號【前端技術驛站】,關注獲取視頻資源,共同學習!