回顾
7种数据类型:
前言
一.对象的语法
1.定义:
- 无序的数据组合
- 键值对的集合
2.写法:
let obj = {'name':'liulei','age':18}
let obj = new Object({'name': liulei})<br />console.log({'name':'liulei','age':18})
3.细节:
- 键名是字符串,不是标识符,可以包含任意字符
- 引号可以省略,省略之后就只能写标识符
就算引号省略了,键名也还是字符串
(标识符:只能是字母,数字,下划线,且开头不可为数字的命名规则定义的字符串)<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()
二.删属性 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[‘key’] //新手优先用这个方法
- 点语法:obj.key
- 坑人语法:obj[key] //变量’key’值一般不为’key’
- 请优先使用中括号语法:
点语法会误导你,让你以为key不是字符串
等不会弄混两种语法,再改用点语法
有单引号的是字符串,没有单引号的是变量
而当name是个变量的时候,不用加单引号
let name = ‘frank’
obj[name] 等价于 obj[‘frank’]
而不是
obj[‘name’]和obj.name
四.原型
原型的本质是:对象
原型包含所有公用属性,而共有属性依附于原型(一个对象)
每个对象都有原型:
- 原型里存着对象的共有属性
- 比如obj的原型就是一个对象
- obj.proto存着这个对象的地址
-
对象的原型也是对象
所以对象的原型也有原型
- 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’//错 -
2.批量赋值
Object.assign(obj,{age:18,gender:’man’})
3.修改或者增加共有属性
无法通过自身修改或者增加共有属性
偏要修改的话:
- obj.proto.toString = ‘xxx’ //不推荐用proto
- Obj.prototype.toString = ‘xxx’
- 一般来说不要修改原型,会引起很多问题
原型链
**
console.dir(person)
修改对象的原型推荐使用如下方法:
let obj =Object.create(common)
obj.name = ‘liulei’
let obj2=Object.create(common)
obj2.name =’jack’
一创建就修改,要改就一开始就改,别后来再改
原型就是一个对象!!!!