1.语法
声明形式(字面形式):var obj = {a:1,b:2};
构造形式:vao obj = new Object(); obj.a=1;
2.类型
①:typeof :判断变量地址的机器码,前三位为0,则返回 Object, null机器码全是0,故返回Object;
②: instanceof:检测右边变量构造函数的prototype属性是否在左边对象实例的原型链上(右边变量是否在左边变量原型链上),若是则返回true;
③: Object.prototype.tostring.call():toString() 方法返回一个表示该对象的字符串,如下图:
注:const str = ‘hello’; // 这不是一个对象,而是字面量,如要在该字面量上执行操作,语言会自动将其转为String对象。
const str = new String(‘hello’); // 这是一个String对象。
3.内容
对象的内容是由属性(值)构成的,存储在对象容器内部的是这些属性的名称,它们指向这些值存储的位置。
4.属性描述符
Object.getOwnPropertyDescriptot():获取对象指定自有属性的属性描述符。
①:enumerable:枚举。当enumerable为false,该属性不可出现在对象属性的遍历中。
Object.keys():返回可枚举属性;
Object.getOwnPropertyNames():返回所有属性;
obj.propertyIsenumerrable(‘属性名’):返回属性是否可枚举,不检查原型链。
②:writable:是否可修改属性的值。当writable为false时,不可修改属性的值。
③:configurable:属性是否可配置。若为true,可用defineProperty()来修改属性描述符;若为false,仍可把writeble改为false,但不能由false改为true,并且delete obj1.a无效;
5.不变性
var obj = {a:‘hello’}
①:禁止扩展 :Object.preventExtensions(obj)。调用该方法后,不可给对象添加新属性,原有属性的属性值可修改可删除。
②:密封:Object.seal(obj)。实际为调用preventExtensions(),会将现有属性都标记为configurable:false,故密封后不能添加新属性,也不能配置或删除原有属性。
③:冻结 Object.freeze(obj)。实际会调用Object.seal()并把所有数据访问属性标记为writable:false,这样就无法修改它们的值
6.存在性
7.遍历
for in :遍历对象可枚举属性;
for of:遍历有内置@iterator,如数组:
一般对象没有内置的@@iterator,故不可用for of 遍历对象。
当然,我们也可以给对象定义@@iterator,如下:
var obj = {
a: '嘻嘻',
b: '哈哈',
[Symbol.iterator]: function () {
const _this = this;
const _keys = Object.keys(_this);
let _index = 0;
return {
next: function () {
return {
value: obj[_keys[_index++]],
done: _index > _keys.length
}
}
}
}
}
// 或通过Object.defineProperty()添加
Object.defineProperty(obj, Symbol.iterator, {
value: function () {
const _this = this;
const _keys = Object.keys(_this);
let _index = 0;
return {
next: function () {
return {
value: obj[_keys[_index++]],
done: _index > _keys.length
}
}
}
}
})
for (const val of obj) {
console.log(val); // '嘻嘻','哈哈'
}