JavaScript判斷對(duì)象是否為空對(duì)象的幾種常見方法
var data = {}; var b = $.isEmptyObject(data); //true
判斷是否為空對(duì)象在實(shí)際開發(fā)中很常見,今天就讓我們來整理一下有哪些方法吧。
1、空對(duì)象對(duì)應(yīng)的字符串為 "{}"
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()方法
這個(gè)方法是對(duì)第二個(gè)方法的封裝。
var data = {}; var b = $.isEmptyObject(data); console.log(b); //true
4、Object.getOwnPropertyNames()
Object 對(duì)象的 getOwnPropertyNames 方法,獲取到對(duì)象中的屬性名,存到一個(gè)數(shù)組中,返回?cái)?shù)組對(duì)象,我們可以通過判斷數(shù)組的 length 來判斷此對(duì)象是否為空。
var data = {}; var arr = Object.getOwnPropertyNames(data); console.log(arr.length == 0); // true
5、ES6 的 Object.keys()
此方法也是返回對(duì)象中屬性名組成的數(shù)組。
var data = {}; var arr = Object.keys(data); console.log(arr.length == 0); // true
JSON.stringify()擴(kuò)展
JSON.stringify() 方法用于將 JavaScript 值轉(zhuǎn)換為 JSON 字符串。
語法:
JSON.stringify(value[, replacer[, space]])
參數(shù)說明:
- value:必需,要轉(zhuǎn)換的 JavaScript 值(通常為對(duì)象或數(shù)組)。
- replacer: 可選。用于轉(zhuǎn)換結(jié)果的函數(shù)或數(shù)組。 如果 replacer 為函數(shù),則 JSON.stringify 將調(diào)用該函數(shù),并傳入每個(gè)成員的鍵和值。使用返回值而不是原始值。 如果此函數(shù)返回 undefined,則排除成員。根對(duì)象的鍵是一個(gè)空字符串:""。如果 replacer 是一個(gè)數(shù)組,則僅轉(zhuǎn)換該數(shù)組中具有鍵值的成員。成員的轉(zhuǎn)換順序與鍵在數(shù)組中的順序一樣。
- space:可選,文本添加縮進(jìn)、空格和換行符,如果 space 是一個(gè)數(shù)字,則返回值文本在每個(gè)級(jí)別縮進(jìn)指定數(shù)目的空格,如果 space 大于 10,則文本縮進(jìn) 10 個(gè)空格。space 也可以使用非數(shù)字,如:\t。
- 返回值:返回包含 JSON 文本的字符串。
JSON.stringify()特性挺多的,具體如下:
1、第一大特性
對(duì)于 undefined、任意的函數(shù)以及 symbol 三個(gè)特殊的值分別作為對(duì)象屬性的值、數(shù)組元素、單獨(dú)的值時(shí) JSON.stringify() 將返回不同的結(jié)果。 來看這道題:
const data = { a: "aaa", b: undefined, c: Symbol("dd"), fn: function () { return true; }, }; JSON.stringify(data); // 輸出:? // "{"a":"aaa"}"
這是因?yàn)?undefined、任意的函數(shù)以及 symbol 作為對(duì)象屬性值時(shí) JSON.stringify() 將跳過(忽略)對(duì)它們進(jìn)行序列化。
假設(shè) undefined、任意的函數(shù)以及 symbol 值作為數(shù)組元素會(huì)是怎樣呢?
JSON.stringify([ "aaa", undefined, function aa() { return true; }, Symbol("dd"), ]); // 輸出:? // "["aaa",null,null,null]"
這是因?yàn)?undefined、任意的函數(shù)以及 symbol 作為數(shù)組元素值時(shí),JSON.stringify() 會(huì)將它們序列化為 null。
還有,undefined、任意的函數(shù)以及 symbol 被 JSON.stringify() 作為單獨(dú)的值進(jìn)行序列化時(shí)都會(huì)返回 undefined。
JSON.stringify(function a() { console.log("a"); }); // undefined JSON.stringify(undefined); // undefined JSON.stringify(Symbol("dd")); // undefined
小結(jié)
- undefined、任意的函數(shù)以及 symbol 作為對(duì)象屬性值時(shí) JSON.stringify() 對(duì)跳過(忽略)它們進(jìn)行序列化。
- undefined、任意的函數(shù)以及 symbol 作為數(shù)組元素值時(shí),JSON.stringify() 將會(huì)將它們序列化為 null。
- undefined、任意的函數(shù)以及 symbol 被 JSON.stringify() 作為單獨(dú)的值進(jìn)行序列化時(shí),都會(huì)返回 undefined。
2、第二大特性
非數(shù)組對(duì)象的屬性不能保證以特定的順序出現(xiàn)在序列化后的字符串中。因?yàn)?JSON.stringify() 序列化時(shí)會(huì)忽略一些特殊的值,所以不能保證序列化后的字符串還是以特定的順序出現(xiàn)(數(shù)組除外)。
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、第三大特性
轉(zhuǎn)換值如果有 toJSON() 函數(shù),該函數(shù)返回什么值,序列化結(jié)果就是什么值,并且忽略其他屬性的值。
JSON.stringify({ say: "hello JSON.stringify", toJSON: function() { return "today i learn"; } }) // "today i learn"
4、第四大特性
JSON.stringify() 將會(huì)正常序列化 Date 的值。
JSON.stringify({ now: new Date() }); // "{"now":"2019-12-08T07:42:11.973Z"}"
5、第五大特性
NaN 和 Infinity 格式的數(shù)值及 null 都會(huì)被當(dāng)做 null。
JSON.stringify(NaN) // "null" JSON.stringify(null) // "null" JSON.stringify(Infinity) // "null"
6、第六大特性
布爾值、數(shù)字、字符串的包裝對(duì)象在序列化過程中會(huì)自動(dòng)轉(zhuǎn)換成對(duì)應(yīng)的原始值。
JSON.stringify([new Number(1), new String("false"), new Boolean(false)]); // "[1,"false",false]"
7、第七大特性
其他類型的對(duì)象,包括 Map/Set/WeakMap/WeakSet,僅會(huì)序列化可枚舉的屬性。
// 不可枚舉的屬性默認(rèn)會(huì)被忽略: JSON.stringify( Object.create( null, { x: { value: 'json', enumerable: false }, y: { value: 'stringify', enumerable: true } } ) ); // "{"y":"stringify"}"
8、第八大特性
深拷貝最粗暴的方式是JSON.parse(JSON.stringify()),這個(gè)方式實(shí)現(xiàn)深拷貝會(huì)因?yàn)樾蛄谢闹T多特性從而導(dǎo)致諸多的坑點(diǎn):比如現(xiàn)在我們要說的循環(huán)引用問題。
// 對(duì)包含循環(huán)引用的對(duì)象(對(duì)象之間相互引用,形成無限循環(huán))執(zhí)行此方法,會(huì)拋出錯(cuò)誤。 const obj = { name: "loopObj" }; const loopObj = { obj }; // 對(duì)象之間形成循環(huán)引用,形成閉環(huán) obj.loopObj = loopObj; // 封裝一個(gè)深拷貝的函數(shù) function deepClone(obj) { return JSON.parse(JSON.stringify(obj)); } // 執(zhí)行深拷貝,拋出錯(cuò)誤 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 */
總結(jié)
到此這篇關(guān)于JavaScript判斷對(duì)象是否為空對(duì)象的幾種常見方法的文章就介紹到這了,更多相關(guān)js判斷對(duì)象為空對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
能說明你的Javascript技術(shù)很爛的五個(gè)原因分析
Javascript在互聯(lián)網(wǎng)上名聲很臭,但你又很難再找到一個(gè)像它這樣如此動(dòng)態(tài)、如此被廣泛使用、如此根植于我們的生活中的另外一種語言2011-10-10JS實(shí)現(xiàn)骰子3D旋轉(zhuǎn)效果
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)骰子3D旋轉(zhuǎn)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10JavaScript檢測(cè)是否開啟了控制臺(tái)(F12調(diào)試工具)
通過js來檢測(cè)開發(fā)者工具是否打開,防止別人惡意調(diào)試我們的代碼,最近我發(fā)現(xiàn)還是有蠻多人去瀏覽那篇文章,所以這里再放出一段代碼,算是個(gè)升級(jí)版吧2020-10-10用最通俗易懂的代碼幫助新手理解javascript閉包 推薦
我同樣也是個(gè)javascript新手,怎么說呢,先學(xué)的jquery,精通之后發(fā)現(xiàn)了javascript的重要性,再回過頭來學(xué)javascript面向?qū)ο缶幊?/div> 2012-03-03js實(shí)現(xiàn)rem自動(dòng)匹配計(jì)算font-size的示例
本篇文章主要介紹了js實(shí)現(xiàn)rem自動(dòng)匹配計(jì)算font-size的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11JavaScript獲取鼠標(biāo)移動(dòng)時(shí)的坐標(biāo)(兼容IE8、chome谷歌、Firefox)
這篇文章主要介紹了JavaScript獲取鼠標(biāo)移動(dòng)時(shí)的坐標(biāo)(兼容IE8、chome谷歌、Firefox瀏覽器),需要的朋友可以參考下2014-09-09微信公眾平臺(tái)獲取access_token的方法步驟
這篇文章主要介紹了微信公眾平臺(tái)獲取access_token的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03最新評(píng)論