写代码啦
JS对象总结
回复数(0) 浏览数(66)
{{topic.upvote_count || 0}} 编辑 回复

对象

唯一一种复杂类型

- 定义

  • 无序的数据组合
  • 键值对的集合

- 结构

  • let obj = { '属性名': '属性值'}
  • let obj = { 'key': 'value'}

举例:

  • let obj = { 'name': 'paula', 'age': 18 }
  • let obj = new Object({'name': 'paula'})  【正规写法】
  • console.log({ 'name': 'paula, 'age': 18 })

- 重要细节

  • 键名是字符串,不是标识符,可以包含任意字符
  • 引号可以省略,省略后只能写标识符
  • 就算引号省略了,键名还是字符串  【重要】

- 特殊例子

  • 如果键名是数值,会被自动转为字符串。
var obj = {
  1: 'a',
  3.2: 'b',
  1e2: true,
  1e-2: true,
  .234: true,
  0xFF: true
};

obj
// Object {
//   1: "a",
//   3.2: "b",
//   100: true,
//   0.01: true,
//   0.234: true,
//   255: true
// }

补充:Object.keys(obj)可以得到obj的所有key

  • 如何用变量作属性名

举例:
let p1 = 'name'
let obj = { p1 = 'paula'}   【这样写,属性名为'p1'】
let obj = { [p1] = 'paula'}   【这样写,属性名为'name'】

解释:

  1. 不加[]的属性名会自动变成字符串
  2. 加了[]则会当做变量求值
  3. 值如果不是字符串,则会自动变成字符串

- 隐藏属性

  • JS中每个对象都有一个隐藏属性proto
  • 这个隐藏属性储存着其共有属性组成的对象的地址
  • 这个共有属性组成的对象叫做原型
  • 也就是说,隐藏属性储存着原型的地址

- 其他

  • Symbol()也能做属性名 【在学习迭代时会用到】

举例:

  • let a = Symbol()
  • let obj = { [a]: 'Hello' }

对象的增删改查

- 删除属性

结构:

  • delete obj.xxx
  • delete obj['xxx']

检查对象是否含有'xxx'属性:

  • 'xxx' in obj  【返回true/false】

检查含有属性名,但是值为undefined:

  • 'xxx' in obj && obj.xxx === undefined

【注意:obj.xxx === undefined 不能断定'xxx'是否为obj的属性】

- 查看属性(读属性)

查看自身所有属性:

  • Object.keys(obj)

查看自身所有属性值:

  • Object.values(obj)

查看自身所有属性与属性值:

  • Object.entries(obj)
  • obj

查看自身与共有属性:

  • console.dir(obj)
  • obj.proto

判断一个属性是共有的还是自身的:

  • obj.hasOwnProperty('toString')

【补充】
obj.hasOwnProperty('name') 与 'name' in obj 的区别

  • 'name' in obj无法判断该属性是否是obj对象的共有属性,但是obj.hasOwnProperty('name')可以

查看自身某个属性:

  • obj['key']  【新人优先选用】
  • obj.key
  • obj[key] 【注意,这里的key是个变量】

考题:使person的所有属性被打印出来

  • 选项1:console.log(person.name)
  • 选项2:console.log(person[name])  【正确】
    javascript let list = ['name', 'age', 'gender'] let person = {name:'frank', age:18, gender:'man'} for(let i = 0; i < list.length; i++){ let name = list[i] console.log(person__???__) }

- 修改或增加属性(写属性)

直接赋值:

  • let obj = {name: 'frank'}  【name是字符串】
  • obj.name = 'frank'          【name是字符串】
  • obj['name'] = 'frank'
  • obj[name] = 'frank'         【错,因为name值不确定】
  • obj['na'+'me'] = 'frank'
  • let key = 'name'; obj[key] = 'frank'
  • let key = 'name'; obj.key = 'frank'    【错,因为obj.key等价于obj['key']】   

批量赋值:

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

无法通过自身修改或增加共有属性:

  • let obj1 ={}, obj2 ={}    【共有toString】
  • obj1.toString = 'xxx'    【只会修改obj1自身属性】
  • obj2.toString还是在原型上

如何强制修改或增加原型上的属性:【建议不要乱搞】

  • obj.proto.toString = 'xxx'
  • window.Object.prototype.toString = 'xxx'

修改隐藏属性:【不推荐使用proto

  • let obj = {name:'frank'}
  • let obj2 = {name: 'jack'}
  • let common = {kind: 'human'}
  • obj.proto = common
  • obj2.proto = common

【推荐使用Object.create】

  • let obj = Object.create(common)  【按照common原型创建一个对象】
  • obj.name = 'frank'   【再写属性】

举例:

原型

- 每个对象都有原型

  • 原型里存着对象的共有属性
  • 比如obj的原型就是一个对象
  • obj.proto存着这个对象的地址
  • 这个对象里还有toString/constructer/valueOf等属性

- 对象的原型也是对象

  • 所以对象的原型也有原型
  • obj = {}的原型即为所有对象的原型
  • 这个原型包含所有对象的共有属性,是对象的根
  • 这个原型也有原型,是null

对象

唯一一种复杂类型

- 定义

  • 无序的数据组合
  • 键值对的集合

- 结构

  • let obj = { '属性名': '属性值'}
  • let obj = { 'key': 'value'}

举例:

  • let obj = { 'name': 'paula', 'age': 18 }
  • let obj = new Object({'name': 'paula'})  【正规写法】
  • console.log({ 'name': 'paula, 'age': 18 })

- 重要细节

  • 键名是字符串,不是标识符,可以包含任意字符
  • 引号可以省略,省略后只能写标识符
  • 就算引号省略了,键名还是字符串  【重要】

- 特殊例子

  • 如果键名是数值,会被自动转为字符串。
var obj = {
  1: 'a',
  3.2: 'b',
  1e2: true,
  1e-2: true,
  .234: true,
  0xFF: true
};

obj
// Object {
//   1: "a",
//   3.2: "b",
//   100: true,
//   0.01: true,
//   0.234: true,
//   255: true
// }

补充:Object.keys(obj)可以得到obj的所有key

  • 如何用变量作属性名

举例:
let p1 = 'name'
let obj = { p1 = 'paula'}   【这样写,属性名为'p1'】
let obj = { [p1] = 'paula'}   【这样写,属性名为'name'】

解释:

  1. 不加[]的属性名会自动变成字符串
  2. 加了[]则会当做变量求值
  3. 值如果不是字符串,则会自动变成字符串

- 隐藏属性

  • JS中每个对象都有一个隐藏属性proto
  • 这个隐藏属性储存着其共有属性组成的对象的地址
  • 这个共有属性组成的对象叫做原型
  • 也就是说,隐藏属性储存着原型的地址

- 其他

  • Symbol()也能做属性名 【在学习迭代时会用到】

举例:

  • let a = Symbol()
  • let obj = { [a]: 'Hello' }

对象的增删改查

- 删除属性

结构:

  • delete obj.xxx
  • delete obj['xxx']

检查对象是否含有'xxx'属性:

  • 'xxx' in obj  【返回true/false】

检查含有属性名,但是值为undefined:

  • 'xxx' in obj && obj.xxx === undefined

【注意:obj.xxx === undefined 不能断定'xxx'是否为obj的属性】

- 查看属性(读属性)

查看自身所有属性:

  • Object.keys(obj)

查看自身所有属性值:

  • Object.values(obj)

查看自身所有属性与属性值:

  • Object.entries(obj)
  • obj

查看自身与共有属性:

  • console.dir(obj)
  • obj.proto

判断一个属性是共有的还是自身的:

  • obj.hasOwnProperty('toString')

【补充】
obj.hasOwnProperty('name') 与 'name' in obj 的区别

  • 'name' in obj无法判断该属性是否是obj对象的共有属性,但是obj.hasOwnProperty('name')可以

查看自身某个属性:

  • obj['key']  【新人优先选用】
  • obj.key
  • obj[key] 【注意,这里的key是个变量】

考题:使person的所有属性被打印出来

  • 选项1:console.log(person.name)
  • 选项2:console.log(person[name])  【正确】
    javascript let list = ['name', 'age', 'gender'] let person = {name:'frank', age:18, gender:'man'} for(let i = 0; i < list.length; i++){ let name = list[i] console.log(person__???__) }

- 修改或增加属性(写属性)

直接赋值:

  • let obj = {name: 'frank'}  【name是字符串】
  • obj.name = 'frank'          【name是字符串】
  • obj['name'] = 'frank'
  • obj[name] = 'frank'         【错,因为name值不确定】
  • obj['na'+'me'] = 'frank'
  • let key = 'name'; obj[key] = 'frank'
  • let key = 'name'; obj.key = 'frank'    【错,因为obj.key等价于obj['key']】   

批量赋值:

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

无法通过自身修改或增加共有属性:

  • let obj1 ={}, obj2 ={}    【共有toString】
  • obj1.toString = 'xxx'    【只会修改obj1自身属性】
  • obj2.toString还是在原型上

如何强制修改或增加原型上的属性:【建议不要乱搞】

  • obj.proto.toString = 'xxx'
  • window.Object.prototype.toString = 'xxx'

修改隐藏属性:【不推荐使用proto

  • let obj = {name:'frank'}
  • let obj2 = {name: 'jack'}
  • let common = {kind: 'human'}
  • obj.proto = common
  • obj2.proto = common

【推荐使用Object.create】

  • let obj = Object.create(common)  【按照common原型创建一个对象】
  • obj.name = 'frank'   【再写属性】

举例:

原型

- 每个对象都有原型

  • 原型里存着对象的共有属性
  • 比如obj的原型就是一个对象
  • obj.proto存着这个对象的地址
  • 这个对象里还有toString/constructer/valueOf等属性

- 对象的原型也是对象

  • 所以对象的原型也有原型
  • obj = {}的原型即为所有对象的原型
  • 这个原型包含所有对象的共有属性,是对象的根
  • 这个原型也有原型,是null
66
回复 编辑