对象
对象(object)是 JavaScript 语言的核心概念,也是最重要的数据类型。
定义:对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
写法
let obj = { 'name': 'frank', 'age' : 18}
let obj = new Object({'name': 'frank'})
console.log({ 'name': 'frank, 'age': 18 })
注意:
键名是字符串,不是标识符,可以包含任意字符。
引号可以省略,省略之后就只能写标识符。
就算引号省略了键名也还是字符串!!
键名
对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加不加引号都可以。
属性名:每个key都是对象的属性名(property)。
属性值:每个value都是对象的属性值。
奇怪的属性名:
let obj = {
1: 'a',
3.2: 'b',
1e2: true,
1e-2: true,
.234: true,
0xFF: true
};
// Object {
// 1: "a",
// 3.2: "b",
// 100: true,
// 0.01: true,
// 0.234: true,
// 255: true
// }
对象的所有属性名都被会被自动转成了字符串。
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()
对象的删除属性
delete命令用于删除对象的属性,删除成功后返回true。
delete obj.xxx 或者 delete obj['xxx'] 都可以删除obj的xxx属性。
删除后,再读取xxx属性是返回值也不会包含该属性。
不含属性名: 'xxx' in obj === false
含有属性名,但是值为 undefined: 'xxx' in obj && obj.xxx === undefined
注意 obj.xxx === undefined : 不能断定 'xxx' 是否为 obj 的属性
属性是否存在 in 运算符
in运算符用于检查对象是否包含某个属性(注意,检查的是键名,不是键值),如果包含就返回true,否则返回false
let obj = { p: 1 };
'p' in obj // true
'toString' in obj // true
in运算符的一个问题是,它不能识别哪些属性是对象自身的,哪些属性是继承的。
查看属性
查看一个对象本身的所有属性,可以使用Object.keys方法。
用法
- 查看自身所有属性:
Object.keys(obj) - 查看自身加共有属性:
console.dir(obj) - 判断一个属性是自身的还是共有的:
obj.hasOwnProperty('toString')
两种查看方式语法
中括号语法:obj['key'] 推荐使用!!
点语法:obj.key
必懂
obj.name 等价于 obj['name']
obj.name 不等价与 obj[name]
这里的name是字符串而不是变量, obj['name'] name是字符串,obj[name] name是变量。
修改和增加对象的属性
修改直接赋值
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'})
修改隐藏属性
let obj = Object.create(common)
obj.name = 'frank'
let obj2 = Object.create(common)
obj2.name = 'jack'
自我总结
改自身 obj['name'] = 'jack'
批量改自身 Object.assign(obj, {age:18, ...})
改共有属性 Object.prototype['toString'] = 'xxx'
改原型 let obj = Object.create(common)
增属性
增属性和改属性基本相同,已有属性择改,没有属性择加。
'name' in obj和obj.hasOwnProperty('name') 的区别
in运算符的一个问题是,它不能识别哪些属性是对象自身的,哪些属性是继承的。
hasOwnProperty判断一个属性是自身还是共有的。
区别显而易见in无法判断哪些属性是自身那些是继承的,而hasOwnProperty可以判断属性是自身还是共有。
'name' in obj这里obj判断对象是否有name这个属性,如果有,自身和共有属性都会返回true。obj.hasOwnProperty('name')这里的obj择会判断name属性是自身的还是共有的,自身返回true,共有返回false。
必记 !!!
JS七种数据类型:
- 数字: number
- 字符串: string
- 布尔: bool
- 符号: symbol
- 空的: undefined
- 空的: null
- 对象: object 五个falsy假值
- undefined
- null
- 0
- NaN
- ''(空字符串)