欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript判斷對象是否為空對象的幾種常見方法

 更新時間:2023年06月12日 11:46:20   作者:小二·  
經(jīng)典面試題,研發(fā)時也經(jīng)常遇見的一個問題,如何判斷一個對象是空對象,這篇文章主要給大家介紹了關(guān)于JavaScript判斷對象是否為空對象的幾種常見方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
var data = {};
var b = $.isEmptyObject(data); //true

判斷是否為空對象在實際開發(fā)中很常見,今天就讓我們來整理一下有哪些方法吧。

1、空對象對應(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()方法

這個方法是對第二個方法的封裝。

var data = {};
var b = $.isEmptyObject(data);
console.log(b); //true

4、Object.getOwnPropertyNames()

Object 對象的 getOwnPropertyNames 方法,獲取到對象中的屬性名,存到一個數(shù)組中,返回數(shù)組對象,我們可以通過判斷數(shù)組的 length 來判斷此對象是否為空。

var data = {};
var arr = Object.getOwnPropertyNames(data);
console.log(arr.length == 0); // true

5、ES6 的 Object.keys()

此方法也是返回對象中屬性名組成的數(shù)組。

var data = {};
var arr = Object.keys(data);
console.log(arr.length == 0); // true

JSON.stringify()擴展

JSON.stringify() 方法用于將 JavaScript 值轉(zhuǎn)換為 JSON 字符串。

語法:

JSON.stringify(value[, replacer[, space]])

參數(shù)說明:

  • value:必需,要轉(zhuǎn)換的 JavaScript 值(通常為對象或數(shù)組)。
  • replacer: 可選。用于轉(zhuǎn)換結(jié)果的函數(shù)或數(shù)組。 如果 replacer 為函數(shù),則 JSON.stringify 將調(diào)用該函數(shù),并傳入每個成員的鍵和值。使用返回值而不是原始值。 如果此函數(shù)返回 undefined,則排除成員。根對象的鍵是一個空字符串:""。如果 replacer 是一個數(shù)組,則僅轉(zhuǎn)換該數(shù)組中具有鍵值的成員。成員的轉(zhuǎn)換順序與鍵在數(shù)組中的順序一樣。
  • space:可選,文本添加縮進、空格和換行符,如果 space 是一個數(shù)字,則返回值文本在每個級別縮進指定數(shù)目的空格,如果 space 大于 10,則文本縮進 10 個空格。space 也可以使用非數(shù)字,如:\t。
  • 返回值:返回包含 JSON 文本的字符串。

JSON.stringify()特性挺多的,具體如下:

1、第一大特性

對于 undefined、任意的函數(shù)以及 symbol 三個特殊的值分別作為對象屬性的值、數(shù)組元素、單獨的值時 JSON.stringify() 將返回不同的結(jié)果。 來看這道題:

const data = {
  a: "aaa",
  b: undefined,
  c: Symbol("dd"),
  fn: function () {
    return true;
  },
};
JSON.stringify(data); // 輸出:?
// "{"a":"aaa"}"

這是因為 undefined、任意的函數(shù)以及 symbol 作為對象屬性值時 JSON.stringify() 將跳過(忽略)對它們進行序列化。

假設(shè) undefined、任意的函數(shù)以及 symbol 值作為數(shù)組元素會是怎樣呢?

JSON.stringify([
  "aaa",
  undefined,
  function aa() {
    return true;
  },
  Symbol("dd"),
]); // 輸出:?
// "["aaa",null,null,null]"

這是因為 undefined、任意的函數(shù)以及 symbol 作為數(shù)組元素值時,JSON.stringify() 會將它們序列化為 null。

還有,undefined、任意的函數(shù)以及 symbol 被 JSON.stringify() 作為單獨的值進行序列化時都會返回 undefined。

JSON.stringify(function a() {
  console.log("a");
});
// undefined
JSON.stringify(undefined);
// undefined
JSON.stringify(Symbol("dd"));
// undefined

小結(jié)

  • undefined、任意的函數(shù)以及 symbol 作為對象屬性值時 JSON.stringify() 對跳過(忽略)它們進行序列化。
  • undefined、任意的函數(shù)以及 symbol 作為數(shù)組元素值時,JSON.stringify() 將會將它們序列化為 null。
  • undefined、任意的函數(shù)以及 symbol 被 JSON.stringify() 作為單獨的值進行序列化時,都會返回 undefined。

2、第二大特性

非數(shù)組對象的屬性不能保證以特定的順序出現(xiàn)在序列化后的字符串中。因為 JSON.stringify() 序列化時會忽略一些特殊的值,所以不能保證序列化后的字符串還是以特定的順序出現(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() 將會正常序列化 Date 的值。

JSON.stringify({ now: new Date() });
// "{"now":"2019-12-08T07:42:11.973Z"}"

5、第五大特性

NaN 和 Infinity 格式的數(shù)值及 null 都會被當(dāng)做 null。

JSON.stringify(NaN)
// "null"
JSON.stringify(null)
// "null"
JSON.stringify(Infinity)
// "null"

6、第六大特性

布爾值、數(shù)字、字符串的包裝對象在序列化過程中會自動轉(zhuǎn)換成對應(yīng)的原始值。

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()),這個方式實現(xiàn)深拷貝會因為序列化的諸多特性從而導(dǎo)致諸多的坑點:比如現(xiàn)在我們要說的循環(huán)引用問題。

// 對包含循環(huán)引用的對象(對象之間相互引用,形成無限循環(huán))執(zhí)行此方法,會拋出錯誤。 
const obj = {
  name: "loopObj"
};
const loopObj = {
  obj
};
// 對象之間形成循環(huán)引用,形成閉環(huán)
obj.loopObj = loopObj;
// 封裝一個深拷貝的函數(shù)
function deepClone(obj) {
  return JSON.parse(JSON.stringify(obj));
}
// 執(zhí)行深拷貝,拋出錯誤
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判斷對象是否為空對象的幾種常見方法的文章就介紹到這了,更多相關(guān)js判斷對象為空對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論