与JS相关的七种数据类型以及五个falsy值
- 七种数据类型 : number、string、bool、symbol、null、undefined、object
- 五个falsy值 : null、undefined、0、NaN、''(空字符串)
原型
- 每个对象都有原型
原型里存着对象的共有属性,比如obj的原型就是一个对象,obj.proto存着这个对象的地址,这个对象里有toString/constructor/valueOf等属性 - 对象的原型也是对象
obj={}的原型即为所有对象的原型,这个原型包含所有对象的共有属性,是对象的根,这个原型也有原型,是null
1、声明对象的两种语法
对象 : Object
定义 : 两种定义方式
- 无序的数据集合
- 键值对的集合
作用 : 构造函数创建一个对象包装器。
- 如果该值为null或undefined,它将创建并返回一个空对象.
- 否则,它将返回一个类型与给定值相对应的对象.
- 如果该值已经是一个对象,它将返回该值.
写法如下
let obj = {'name' : 'frank','age' : 18}
let obj = new Object({'name': 'frank'})
console.log({'name' : 'frank','age':18})
细节
- 键名是字符串,不是标识符,可以包含任意字符
- 引号可以省略,省略之后就只能写标识符
- 就算引号省略了,键名也还是字符串
变量作属性名
属性值 : 每个value都是对象的属性值
数姓名 : 每个key都是对象的数姓名(property)
扩展 : Object.keys(obj)可以得到obj的所有key
let p1 = 'name'
let obj = {p1 : 'frank'} //这样写的话,属性名为p1
let obj = {[p1] : 'frank'} //这样写的话,属性名为'name'
对比来看
- 不加[]的属性名会自动变成字符串
- 加了[]则会被当做变量求值
- 值如果不是字符串,则会自动变成字符串
对象的隐藏属性
- JS中每一个对象都有一个隐藏属性
- 这个隐藏属性储存着其共有属性组成的对象的地址
- 这个共有属性组成的对象叫做原型
- 隐藏属性储存着原型的地址
var obj = {}
obj.toString()
没有出现报错的原因是因为obj的隐藏属性对应的对象上有toString()
2、如何删除对象的属性
语法
delete obj.xxx
或
delete obj['xxx']
- 即可删除obj的xxx属性
注 : 请区分[属性值为undefined]和[不含属性名]
不含属性名
'xxx' in obj === false
含有属性名,但是值为undefined
'xxx' in obj && obj.xxx === undefined
注意
obj.xxx === undefined
不能断定'xxx'是否为obj的属性
3、如何查看对象的属性
- 查看自身所有属性
Object.keys(obj)
- 查看自身+共有属性
console.dir(obj)
- 判断一个属性是自身的还是共有的
obj.hasOwnProperty('toString')
注意
obj.name 等价于 obj['name']
obj.name 不等价于 obj[name]
因为这里的name是字符串,而不是变量
let name = 'frank'
obj[name] 等价于 obj['frank']
而不是 obj['name']和obj.name
4、如何修改或增加对象的属性
1、修改或增加属性(写属性)
- 直接赋值
let obj = {name : 'frank'} //name是字符串
obj.name = 'frank' //name是字符串
obj['name'] = 'frank'
obj['na'+'me'] = 'frank'
//
let key = 'name';obj[key] = 'frank'
- 批量赋值
Object.assign(obj,{age: 18, gender : 'man'})
2、修改或增加共有属性
- 无法通过自身修改或增加共有属性
let obj = {}, obj2 = {} //共有toString
obj.toString = 'xxx' //只会在改obj自身属性
obj2.toString //还是在原型上
3、修改隐藏属性
let obj = Object.create(common)
obj.name = 'frank'
let obj2 = Object.create(common)
obj2.name = 'jack'
5、'name' in obj和obj.hasOwnProperty('name')的区别
- 'name' in obj : 查看name的属性,但是并不能判断出来是自身的还是共有的
- obj.hasOwnProperty('name') : 可以判断出来是自身的还是共有的