2种声明方式
let obj1 = {name: "jack", age: 18}
let obj2 = new Object({name: "jack", age: 18})
// 新建空对象
let obj1 = {}
let obj2 = new Object()
细节
- 键名是字符串,不是标识符,可以包含任意字符
- 引号可以省略,省略之后只能写成标识符或纯数字形式
- 就算省略引号,键名也还是字符串
奇怪的属性名
let obj = {
1: 'a',
3.2: 'b',
1e2:true,
1e-2:true,
.234:true,
0xFF:true
}
Object.keys(obj) // (6) ["1", "100", "255", "3.2", "0.01", "0.234"]
变量做属性名
let sss = "name"
let obj = {
[sss]:"jack"
}
// {name: "jack"}
[]会先求值再转为字符串
原型和原型链
每个对象都有一个隐藏属性proto,指向一个由共有属性组成的对象
修改原型
let obj = {}
obj.__proto__.toString = "xxx" // 不推荐
Object.prototype.toString = "xxx"
let common = {name: "hello"}
let obj = Object.create(common) // 以common为共有属性创建对象
修改原型为其他对象,则产生原型链
查
Object.keys() // 获取自身所有属性名
Object.values() // 获取自身所有属性值
Object.entries() // 获取自身所有键值对数组
console.dir() // 查看自身和共有的属性
// 判断属性名是否在对象内(包括自身和共有的)
"toString" in obj // true
// 判断一个属性是自身还是共有的:
obj.hasOwnProperty('toString') // false
/* 访问属性 */
obj["name"] // 字符串
obj.name // 标识符形式键名
obj[name] // 变量
// 数字形式的键名只能用 obj["123"]
// 也可以不加引号 obj[123]
删
delete obj["xxx"] // 完全删除
obj["xxx"] = undefined // 并未删除
增/改
let obj = {}
obj.name = "jack" // 新增
obj.name = "rose" // 修改
Object.assign(obj, {age: 18, weight: 100}) // 批量赋值