1.声明对象的语法
对象的定义:对象就是一组"键值对"(key-value)的组合,是一种无序的复合数据集合
var obj={
foo:'tom',
age:18
}
如举例所示,键值对由键名和键值组成,键名与键值之间用冒号分隔,两个键值对之间用逗号分隔。
写法
简单写法(最常用)
let obj={
'name':'tom','age':18
}
正规写法
let obj = new Object({
name: "tom",
});
匿名对象写法
console.log({ name: "frank", age: 18 });
可以通过Object.keys(obj)得到所有 obj 的所有 key
细节:
- 键名是字符串,不是标识符,可以包含任意字符
- 引号可以省略,省略之后就只能写标识符
- 就算引号省略,键名也还是字符串
- 如果键名不符合标识符的规则(比如第一个字符为数字),且也不是数字,则必须加上引号,否则会产生解析错误并报错
- 对象的每一个键名又称为“属性”(property),它的“键值”可以是任何数据类型。
举一些奇怪的例子
let obj = {
1: "a",
3.2: "b",
1e2: true, //默认会解析为科学计数法而不是字符串
1e-2: true,
0.234: true,
0xff: true, //16进制
};
变量做属性名
let p1='name',
let obj={p1:'tom'} //属性名为'p1'
let obj={[p1]:'tom'} //p1属性名的值就是‘name’
解析:
- 不加[]的属性名回自动变成字符串。
- 加了[]则回当作变量求值(先求变量的值,再转化为字符串)。
- 值如果不是字符串,会自动变成字符串。
2.删除属性
delete obj.name 或者delete obj['nanme']
注意区分属性值为undefined和不含属性值的区别
不含属性名:xxx in obj === false
含有属性但是值为undefined:xxx in obj && obj.xxx=== undefined
都有返回值,但不用深究细节,具体查询MDN即可
3.读属性
- 查看自身属性
Object.keys(obj):查看对象obj的所有键名。
Object.values(obj)查看对象obj的所有属性值。
Object.entries(obj)查看对象obj的所有键值对。
- 查看自身+共有属性
console.dir(obj)
- 查看属性是否为自身所有
obj.hasOwnProperty()
4.对象的原型
- 每个对象都有原型
- 例如obj的原型是一个对象,其地址存储于
obj.__proto__,对象中有相关的方法,例如valueOf - 对象的原型也是对象,对象的原型也是原型,
obj={}的原型即为所有对象的原型,包含所有对象的共有属性,该对象的原型为null
5.读属性
- 中括号语法:
obj['key'] - 点语法:
obj.key - 坑爹语法:
obj[key]因为key是变量而不是字符串,其值一般不是key obj.name等价于obj['name'],但是不等价于obj[name],因为此时的name是字符串而不是变量
6.写属性、修改属性
- 修改属性
let obj = {name: 'frank'} // name 是字符串
obj.name = 'frank' // name 是字符串
obj['name'] = 'frank'
let key = 'name'; obj[key] = 'frank'
//此处的字符串可以通过多个字符串进行拼接,但还需要注意分别变量和字符串的区别
- 批量赋值
Object.assign(obj, {name: 'mike', age: 25})
-
增加属性类似于修改属性,区别在于原来的对象中有没有这个属性
-
无法通过自身修改或增加共有属性
let obj={},let obj2={},这两个对象共有toString
obj.toString ='xxx'只会修改obj的自身属性
obj2.toString还是在原型上,不会修改
- 强行修改原型属性或增加原型上面的属性的方法
obj.__proto__.toString='xxx'//不推荐用__proto__
Object.prototype.toString ='xxx'
一般不建议修改原型属性,容易出问题
修改对象原型推荐使用Object.create
let common ={kind:'human'}
let obj = Object.create(common)
7.'name'in obj和obj.hasOwnProperty('name')的区别
- 前者判断obj对象是否拥有属性,无论是自身还是共有的
- 后者判断一个属性是否是自身属性