详情参考
1.对象的表示方法
js原生提供Object构造函数。js中所有的对象都是Object的实例。
定义一个对象最简单的就是var obj = {};
ES6
属性和方法允许简写。对象的super属性只能用在简写的方法中,其他的地方都会报错。
;
let obj = {
a, // 相当于a: a
b() {
return 'lyra'
}
};
知识兔2.属性名
对象要求属性名必须是字符串,如果不是字符串,js引擎会自动将其转为字符串。
var obj={
1e2: 'a',
0xff: 'b', // 会先计算出键值
.23: 'c',
x: 'd',
_a: "e"
}
// var obj = {
// 100: 'a',
// 255: 'b',
// '0.23': 'c',
// x: 'd',
// _a: 'e'
// }
知识兔⚠️如果属性名不是有效的变量标识符,字符串不能省略。
ES6
1)属性名表达式,允许属性名通过[]用表达式准备。[]内有字符串说明是属性名,[]没有字符串说明是变量。
var obj = {
['a' + 'b']: 5,
['h'+'hello']() {
// 这是一个函数
}
}
知识兔2)添加Symbol类型的属性名
3.对象方法的name属性
name属性返回函数的名称。
.bind()的函数会返回“bond 函数名”;匿名函数"anoymous";对象的方法名为Symbol("函数名")返回引号中函数名
4.属性遍历的方法
遍历规则:
1)先遍历数字属性,从小到大
2)遍历字符串属性,按照时间从早到晚(push的最早的)
3)遍历Symbol属性,按照时间从早到晚
属性遍历方法:
1)for...in 遍历原型和自身的可枚举属性(不含Symbol)
2)Object.keys() 遍历自身可枚举属性(不含Symbol)
3)Object.getOwnPropertyNames 遍历自身可枚举和不可枚举属性(不含Symbol)
ES6
4)Object.getOwnPropertySymbols()遍历自身的Symbol属性
5)Reflect.ownKeys() 遍历自身的所有属性
值遍历方法
1)Object.values(),
2)Object.Entries()
PS:Object.fromEntries()将Map转为对象;或者Object.Entries()遍历的结果(二维数组)转为对象
5.Object.assign(target, ...sources)和扩展运算符...
ES6
1)相同点: 两者相当于另一种形式的遍历,针对的都是可枚举类型
{...null} {...1} {...true} {...undefined}都是{},因为自动转换生成的对象的属性都是不可遍历的属性或者是{}
不同点:前者的target参数不能是null和undefined; ...可以是null和undefined
2)对象的拷贝
浅拷贝
⚠️:浅拷贝都是对对象的引用,即指针的指向(浅拷贝后都是不同的指针,但是指向相同的地址)。
// a != obj
let a = {...obj}; // a != obj
let a = obj; a=== obj;指针相同
知识兔对象的完整克隆规则:1.原型对象相同;2.自身属性相同
bject.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj))
知识兔6.Object.is(a,b)
功能基本和===相同。
区别: 1)Object.is(NaN, NaN) --true 2) Object.is(+0, -0) -- false
7.原型对象
1)prototype属性是构造函数的属性,实例对象没有该属性
2) __proto__实例对象的属性,表示该实例对象的原型对象
2)读取,设置原型对象
---1.__proto__浏览器实例对象的私有属性,可以读取,写入,但是不建议使用
---2.getPrototypeOf(),setPrototypeOf
---3.Object.create(原型对象,属性描述对象)⚠️如果属性缺省,默认false, value默认undefine