详情参考
1.对象的表示方法
js原生提供Object构造函数。js中所有的对象都是Object的实例。
定义一个对象最简单的就是var obj = {};
ES6
属性和方法允许简写。对象的super属性只能用在简写的方法中,其他的地方都会报错。
let a = 5; 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}都是{},因为自动转换生成的对象的属性都是不可遍历的属性或者是{}{}
{...'he'} -- {0: 'h', 1: 'e'}
不同点:前者的target参数不能是null和undefined; ...可以是null和undefined
⚠️:...(表达式) ---扩展运算符可以跟表达式
2)对象的拷贝
浅拷贝
⚠️:浅拷贝都是对对象的引用,即指针的指向(浅拷贝后都是不同的指针,但是指向相同的地址)。
let a = Object.assign({},obj); // a != obj let a = {...obj}; // a != obj
let a = obj; a=== obj;指针相同
对象的完整克隆规则:1.原型对象相同;2.自身属性相同
Object.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