回顾

7种数据类型:

  • number,string,bool,symbol
  • null,undefined
  • object

    5个falsy:

  • null,undefined

  • 0,NaN
  • ‘’(空字符串)

前言

对象object,第七种数据类型,唯一一种复杂数据类型

一.对象的语法

1.定义:

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

    2.写法:

    let obj = {'name':'liulei','age':18}
    let obj = new Object({'name': liulei})<br />console.log({'name':'liulei','age':18})

3.细节:

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

    1. (标识符:只能是字母,数字,下划线,且开头不可为数字的命名规则定义的字符串)<br />属性名:属性值

    4.奇怪的属性名

    let obj={<br /> 1:'a',<br /> 3.2:'b',
    le2:true,
    .234:true,
    0xFF:true,
    }; //key值会变成字符串
    Object.keys(obj)
    =>[“1”,”100”,255”,”3.2”,”0.01”,”0.234”]
    细节:
    Object.keys(obj)可以得到obj的所有key
    想用变量的值作为key,只能用[]把变量括起来

5.变量名作属性名

  • 如何用变量名做属性名
    • 之前都是用常量做属性名
    • let p1 = ‘name’
    • let obj = {p1:’liulei’} 这样写,属性名为’p1’
    • let obj = {[p1]:’liulei’}这样写,属性名为 ‘name’
  • 对比:
    • 不加[ ] 的属性名会自动编程字符串
    • 加了[ ]则会当作变量求值
    • 值如果不是字符串,则会自动编程字符串

6.对象的隐藏属性

  • 隐藏属性
    • JS中每一个对象都有一个隐藏属性
    • 这个隐藏属性存储着其共有属性组成的对象的地址
    • 这个公有属性组成的对象叫做原型(公有属性)
    • 也就是说,隐藏属性存储着原型的地址
  • 代码示例
    • var obj = {}
    • obj.toString() //居然不报错
    • 因为obj的隐藏属性对应的对象上有toString()

image.png

二.删属性 delete

delete只能删属性!!!!

delete obj.xxx或delete obj[‘xxx’]

  • 即可删除obj的xxx属性
  • 请区分【属性值为undefined】和【不含属性名】
  • 含有属性名,但是值为undefined
    • ‘xxx’ in obj&&obj.xxx === undefined
  • 注意obj.xxx === undefined
    • 不能断定 ‘xxx’ 是否为obj的属性
  • 类比,delete一个属性和将一个值设置为undefined的区别:
    • 你有没有苹果?
    • A:没有 //不含有属性名
    • B:有,但是没在身边//含有属性名,但是值为undefined
  • delete 属性 和undefined区别,undefined是模糊的不清楚的

    三.读属性

  • 查看自身所有属性:

    • Object.keys(obj)
  • 查看自身+共有属性:
    • console.dir(obj)
    • 或者自己依次用Object.keys打印出obj. proto //不推荐
  • 判断一个属性是自身的还是共有的:

    • obj.hasOwnProperty(‘toString’)

      查看属性

  • 两种方式查看属性:

  1. 中括号:obj[‘key’] //新手优先用这个方法
  2. 点语法:obj.key
  3. 坑人语法:obj[key] //变量’key’值一般不为’key’
  • 请优先使用中括号语法:

点语法会误导你,让你以为key不是字符串
等不会弄混两种语法,再改用点语法

image.png
有单引号的是字符串,没有单引号的是变量
而当name是个变量的时候,不用加单引号
image.png
let name = ‘frank’
obj[name] 等价于 obj[‘frank’]
而不是
obj[‘name’]和obj.name

四.原型

原型的本质是:对象
原型包含所有公用属性,而共有属性依附于原型(一个对象)

每个对象都有原型:

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

    对象的原型也是对象

  • 所以对象的原型也有原型

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

五.修改或增加属性(写属性)

1.直接赋值

  • 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’]

    2.批量赋值

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

    3.修改或者增加共有属性

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

  • 偏要修改的话

    • obj.proto.toString = ‘xxx’ //不推荐用proto
    • Obj.prototype.toString = ‘xxx’
    • 一般来说不要修改原型,会引起很多问题
  • 原型链

image.png
**
console.dir(person)

修改对象的原型推荐使用如下方法:

let obj =Object.create(common)
obj.name = ‘liulei’
let obj2=Object.create(common)
obj2.name =’jack’
一创建就修改,要改就一开始就改,别后来再改

原型就是一个对象!!!!