2种声明方式

  1. let obj1 = {name: "jack", age: 18}
  2. let obj2 = new Object({name: "jack", age: 18})
  3. // 新建空对象
  4. let obj1 = {}
  5. let obj2 = new Object()

细节

  • 键名是字符串,不是标识符,可以包含任意字符
  • 引号可以省略,省略之后只能写成标识符或纯数字形式
  • 就算省略引号,键名也还是字符串

奇怪的属性名

  1. let obj = {
  2. 1: 'a',
  3. 3.2: 'b',
  4. 1e2:true,
  5. 1e-2:true,
  6. .234:true,
  7. 0xFF:true
  8. }
  9. Object.keys(obj) // (6) ["1", "100", "255", "3.2", "0.01", "0.234"]

变量做属性名

  1. let sss = "name"
  2. let obj = {
  3. [sss]:"jack"
  4. }
  5. // {name: "jack"}

[]会先求值再转为字符串

原型和原型链

每个对象都有一个隐藏属性proto,指向一个由共有属性组成的对象
image.png

window.Object.prototype是对象的根
image.png
image.png

修改原型

  1. let obj = {}
  2. obj.__proto__.toString = "xxx" // 不推荐
  3. Object.prototype.toString = "xxx"
  4. let common = {name: "hello"}
  5. let obj = Object.create(common) // 以common为共有属性创建对象

修改原型为其他对象,则产生原型链

image.png

  1. Object.keys() // 获取自身所有属性名
  2. Object.values() // 获取自身所有属性值
  3. Object.entries() // 获取自身所有键值对数组
  4. console.dir() // 查看自身和共有的属性
  5. // 判断属性名是否在对象内(包括自身和共有的)
  6. "toString" in obj // true
  7. // 判断一个属性是自身还是共有的:
  8. obj.hasOwnProperty('toString') // false
  9. /* 访问属性 */
  10. obj["name"] // 字符串
  11. obj.name // 标识符形式键名
  12. obj[name] // 变量
  13. // 数字形式的键名只能用 obj["123"]
  14. // 也可以不加引号 obj[123]

  1. delete obj["xxx"] // 完全删除
  2. obj["xxx"] = undefined // 并未删除

增/改

  1. let obj = {}
  2. obj.name = "jack" // 新增
  3. obj.name = "rose" // 修改
  4. Object.assign(obj, {age: 18, weight: 100}) // 批量赋值