1 声明对象的两种语法

1.1 定义

JS的对象, 是指无序的数据集合、键值对的集合.

1.2 一般语法

  1. let a = { 'name': 'Jack', 'age': 18 }
  2. let a = new Object ( {'name':'Jack'} )
  3. console.log ( {'name': 'Jack, 'age': 18} )

注意:

  • 键名是字符串(string), 不是标识符, 可以包含任意字符;
  • 引号可省略, 省略之后就只能写标识符;
  • 就算引号省略了, 键名也还是字符串(重要).

    1.3 用变量做属性名的语法

    1. let p1 = 'name'
    2. let obj = { p1 : 'Jack'} // 属性名为'p1'
    3. let obj = { [p1] : 'Jack' } // 属性名为'name'

    对比:

  • 不加 [ ] 的属性名会自动变成字符串;

  • 加了 [ ] 则会当做变量求值;
  • 值如果不是字符串, 则会自动变成字符串.

2 对象的隐藏属性

  • JS中每一个对象都有一个隐藏属性;
  • 这个隐藏属性储存着其共有属性组成的对象的地址;
  • 这个共有属性组成的对象叫做原型;
  • 隐藏属性储存着原型的地址.

举例:

  • var obj = { }
  • obj.toString( ) //居然不报错
  • 因为obj的隐藏属性对应的对象上有 toString( )

3 删除对象的属性

3.1 语法

  1. delete obj.xxx
  2. delete obj['xxx']

3.2 不含属性名

语法:

  1. 'xxx' in obj === false

3.3 含有属性名, 但属性值为undefined

语法:

  1. 'xxx' in obj &&obj.xxx=== undefined
  2. 'xxx' in obj && obj['xxx']

注意: obj.xxx=== undefined, 不能断定’xxx’是否为obj的属性

4 查看对象的属性

4.1 查看自身所有属性

语法:

  1. Object.keys(obj)

只能查看属性, 但不能查看属性值.

4.2 查看自身+共有属性

语法:

  1. console.dir(obj)
  2. Object.entries(obj).

能查看属性和属性值.

4.3 查看某个属性

  1. obj ['key'] //中括号语法(优先使用)
  2. obj.key //点语法
  3. obj [key] // 这是坑新人语法. 变量key值一般不为'key'.

4.4 ‘name’ in obj 与 obj.hasOwnProperty(‘name’)的区别

hasOwnPropert( )方法, 如果返回值为true, 则可以确定指定的属性为对象自身的属性(此方法会忽略掉那些从原型链上继承到的属性).
in 运算符, 是指如果指定的属性在指定的对象或其原型链中, 则in 运算符返回true.
举例:

  1. let obj = { 'name': 'Jack' }
  2. 'name' in obj // 返回 true.
  3. obj.hasOwnProperty('name') // 返回 true.
  4. obj.hasOwnProperty('toString') // 返回 false. 因为toString是共有属性, 不是对象自身的属性.

5 修改或增加对象的属性

5.1 直接赋值

  1. let obj = {name: 'Jack'} //name是字符串
  2. obj.name = 'Jack' // name是字符串
  3. obj['name'] = 'Jack'
  4. obj[name]= 'frank'//错,因name值不确定
  5. obj['na'+'me'] = 'Jack'
  6. let key = 'name'; obj[key] = 'Jack'
  7. let key = 'name';obj.key= 'Jack'//错. 因为obj.key等价于obj['key']

5.2 批量赋值

语法:

  1. Object.assign(obj, {age: 18, gender: 'man'})

5.3 修改共有属性

语法:

  1. Object.prototype.toString= 'xxx'

注意: 一般来说, 不要修改原型, 会引起很多问题.

5.4 修改隐藏属性

推荐使用Object.create.
语法:

  1. let obj =Object.create(common)
  2. obj.name = 'Tom'
  3. let obj2 =Object.create(common)
  4. obj2.name = 'jack'

注意: 隐藏属性如果要改, 那么一开始就要改, 不要中途改.