Louis's blog
GitHub
GitHub
  • 瀏覽器運作原理
  • 閉包
  • this
  • arguments 和 array-like
  • apply、call、bind
  • 函式程式設計
  • 物件和原型
  • 原型鏈和繼承
  • ES6 和 Class
  • ES6 中新增的數據類型
  • ES6 語法糖
  • var、let、const
  • ES7~ES12
  • Strict Mode
  • 補充
  • Proxy 和 Reflect
  • Promise
  • Iterator
  • 生成器
  • async、await
  • Event loop
  • 錯誤處理
  • 模塊化
  • 套件管理工具
  • JSON
  • WebStorage
  • IndexDB
  • Cookie
  • BOM
  • DOM
  • 防抖(debounce)和節流(throttle)
  • Deep copy
  • 事件總線

JSON

JSON 是一種數據格式,目前最長用在服務器和客戶端之間的資料傳輸,全稱為 JavaScript Object Notation(JavaScript 物件符號),已經有相當多的程式語言都實現了將 JSON 格式轉換成對應模型的方法,使用場景通常為:

  • 網路數據傳輸
  • 項目配置文件
  • 非關係型資料庫(NoSQL)

基本使用

JSON 支持三種類型的值:

  • 簡單值:Number、String、Boolean、null
  • 物件值:由 key 和 value 組成,key 為 String 類型並且必須添加雙引號
  • 陣列值:陣列的元素可以是簡單值、物件值、陣列值

JSON.stringify

某些時候會將 JavaScript 中的複雜類型轉換成 JSON 字串,可以透過 JSON.stringify 進行轉化:

const obj = {
  name: 'Louis',
  age: 26
}

const jsonString1 = JSON.stringify(obj)
// {"name":"Louis","age":26}
console.log(jsonString1)

並且 stringify 的第二個參數可以進行過濾:

const obj = {
  name: 'Louis',
  age: 26
}

const jsonString2 = JSON.stringify(obj, ['name'])
// {"name":"Louis"}
console.log(jsonString2)

stringify 的第二個參數也可以是函數:

const obj = {
  name: 'Louis',
  age: 26
}

const jsonString3 = JSON.stringify(obj, (key, value) => {
  if (key === 'age') {
    return value + 1
  }
  return value
})
// {"name":"Louis","age":27}
console.log(jsonString3)

透過第三個參數能夠進行格式化:

const obj = {
  name: 'Louis',
  age: 26
}

// 第三個參數 space
const jsonString4 = JSON.stringify(obj, undefined, ' ')
// {
//   "name": "Louis",
//   "age": 26
//  }
console.log(jsonString4)

如果轉化的目標物件包含 toJSON 方法,會執行該方法並返回結果:

const obj = {
  name: 'Louis',
  age: 26,
  toJSON() {
    return '111'
  }
}

const jsonString1 = JSON.stringify(obj)
// "111"
console.log(jsonString1)

JSON.parse

JSON 物件除了 stringify 方法,還有 parse 方法能對 JSON 字串進行解析,第二個參數也能對 key 和 value 進行修改:

const JSONString = '{"name":"Louis","age":27}'

const info = JSON.parse(JSONString, (key, value) => {
  if (key === 'age') {
    return value + 1
  }
  return value
})

// { name: 'Louis', age: 28 }
console.log(info)

Deep copy

通常要複製物件,會使用淺拷貝,淺拷貝最簡單的方式就是解構賦值:

const obj = {
  name: 'Louis',
  age: 26,
  friends: [
    {
      name: 'Renny',
      age: 18
    }
  ]
}

const info = { ...obj }

info 中的 friends 和 obj 中的 freinds 是指向同一個記憶體地址, 如果修改掉 info 中的 friends 會影響掉 obj 中的 friends 屬性。

透過 JSON.stringify 和 JSON.parse 能夠進行物件的深拷貝,也就是會讓 friends 屬性指向不同的記憶體地址:

const obj = {
  name: 'Louis',
  age: 26,
  friends: [
    {
      name: 'Renny',
      age: 18
    }
  ]
}

// 深拷貝
const jsonString = JSON.stringify(obj)
const info3 = JSON.parse(jsonString)

不過以上的方法有一個最大的缺點,就是 JSON 這種數據格式中沒有函數,如果物件中有函數作為屬性會在轉化的過程中被刪去。

Edit this page
Last Updated:
Contributors: louis, louis61619
Prev
套件管理工具
Next
WebStorage