声明对象的两种语法

  1. let obj = {'name': 'frank', 'age': 18}
  2. let obj = new Object({'name': 'frank'})
  • 键名是字符串,不是标识符,可以包含任意字符
  • 引号可省略,省略之后就只能写标识符
  • 就算引号省略了,键名也还是字符串

    一些特殊的属性名

    1. let obj = {
    2. 1:'a',
    3. 2.6:'b',
    4. 1e2:'c',
    5. .234:true,
    6. 0XFF:true
    7. }
    8. //属性名都会自动变成字符串
    9. Object.keys(obj)
    10. //得到所有属性名, ["1", "2.6","100", "0.234", "255"]

    查看属性两种方法

  • 中括号语法: obj[‘key’]

  • 点语法: obj.key, key认为是字符串
  • 优先使用中括号语法

    使用变量做属性名

    1. let p1 = 'name'
    2. let obj = {p1:'mark'}; 属性名是字符串, 'p1';
    3. let obj1 = {[p1]:'frank'}; 属性名是变量,变量值是 'name';
  • 不加 [] 的属性名会自动变成字符串

  • 加了 [] 则会当成变量求值

删除对象的属性

  1. let obj = {'name': 'frank', 'age': 18}
  2. delete obj.name
  3. delete obj['age']
  • obj.name 中的name是字符串,新手推荐第二种写法:delete obj[‘name’]

查看对象的属性

  1. let obj = {'name': 'frank', 'age': 18}
  2. Object.keys(obj) //查看自身属性名
  3. Object.values(obj) //查看自身属性值
  4. Object.entries(obj) //查看自身键值对
  5. console.dir(obj) //查看自身+原型属性
  6. obj.__proto__ //查看原型属性,不推荐
  7. obj.hasOwnProperty('xxx') //判断一个属性是自己的还是原型的
  8. 'xxx' in obj === false //判断对象是否包含属性名
  9. 'xxx' in obj && obj.xxx === undefined //判断对象的一个属性是否存在并且属性值为undefined
  10. obj.xxx === undefined //不能断定'xxx'是否为obj的属性值

修改或增加对象的属性

  • 直接赋值

    1. let obj = {name: 'frank'} //name是字符串
    2. obj.name = 'frank' //name是字符串
    3. obj['name'] = 'frank' //name是字符串
    4. obj[name] = 'frank' //错,因name值不确定
    5. obj['na' + 'me'] = 'frank'
    6. let key = 'name'; obj[key] = 'frank';
    7. let key = 'name'; obj.key = 'frank'; //错,这里的key是指字符串'key'
  • 批量赋值

    1. Object.assign(obj, {p1:1, p2:2, p3:3}

修改或增加共有属性

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

    1. let obj = {}, obj2 = {}
    2. obj.toString = "xxx" //只会在改obj自身属性
    3. obj2.toString //还是在原型上
  • 修改或增加原型的属性

    1. obj.__proto__.toString = 'xxx' //不推荐用__proto__
    2. Object.prototype.toString = 'xxx'
    3. // 一般来说,不要修改原型,会引起很多问题
  • 推荐使用Object.create()

    1. let obj = Object.create(common)
    2. obj.name = 'frank'
    3. let obj2 = Object.create(common)
    4. obj2.name = 'jack'
    5. //要改就一开改,别后来再改
    6. //增加的common原型会添加到原来的原型链中

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

  • in检测对象里的全部属性, 也就是包括了原型属性, 而hasOwnProperty只包含检测对象里的属性, 不包含原型属性。
    1. let obj = {};
    2. 'toString' in obj //true
    3. obj.hasOwnProperty('toString') //false