Open Twlig opened 2 years ago
for-in 循环
遍历对象的所有可枚举属性。包括原型上的。
for (value in object1) {
console.log(value);
}
//a
//b
//c
Object.keys()
返回给定对象的所有可枚举属性的字符串。不包括原型上的。
const object1 = {
a: 1,
b: 2,
c: 3
};
Object.defineProperty(object1, "name", {
value: "lili",
Enumerable: false
})
Object.keys(object1);// Array ['a', 'b', 'c']
⚠️注意:values(),entries()方法和它差不多,只是一个是返回value,一个是返回[key,value],而keys()是返回key。
Object.getOwnPropertyNames()
返回直接在给定对象中找到的所有属性(包括不可枚举的属性,使用 Symbol 的属性除外)的数组。不包括原型上的。
Object.getOwnPropertyNames(object1);// Array ['a', 'b', 'c', 'name']
Object.getOwnPropertySymbols()
方法返回直接在给定对象上找到的所有符号属性的数组。不包括原型上的。
const object1 = {};
const a = Symbol('a');
const b = Symbol.for('b');
object1[a] = 'localSymbol';
object1[b] = 'globalSymbol';
const objectSymbols = Object.getOwnPropertySymbols(object1);//[Symbol(a), Symbol(b)]
hasOwnProperty():
用于判断当前对象实例上是否存在给定的属性。不包括原型上的。
let o = {name : "zzy"};
o.hasOwnProperty("name"); //true
propertyIsEnumerable():
用于判断给定的属性是否可以使用for-in 语句枚举。不包括原型上的。
let o = {name : "zzy"};
let o1 = {};
Object.defineProperty(o1, "name", {
value: "lili",
Enumerable: false
})
o.propertyIsEnumerable("name"); //true
o1.propertyIsEnumerable("name"); //false
对象
对象就是一组属性的无序集合。创建自定义对象的通常方式是创建 Object 的一个新实例,然后再给它添加属性和方法。
定义对象方法
new方法
对象字面量
对象属性类型
属性分两种:数据属性和访问器属性。
数据属性
数据属性包含一个保存数据值的位置。值会从这个位置读取,也会写入到这个位置。数据属性有 4个特性描述它们的行为。为了将某个特性标识为内部特性,规范会用两个中括号把特性的名称括起来,比如[[Enumerable]]。
要修改属性的默认特性,就必须使用
Object.defineProperty()
方法。这个方法接收 3 个参数:要给其添加属性的对象、属性的名称和一个描述符对象。把 configurable 设置为 false,意味着这个属性不能从对象上删除。一个属性被定义为不可配置之后,就 不能再变回可配置的。再次调用
Object.defineProperty()
并修改任何非 writable 属性会导致错误:🍁注意:
Object.defineProperty()
创建属性时,configurable、enumerable 和 writable 的值都默认为 false访问器属性
访问器属性不包含数据值。相反,它们包含一个获取(getter)函数和一个设置(setter)函数,不过这两个函数不是必需的。访问器属性有 4 个特性描述它们的行为。
访问器属性是不能直接定义的,必须使用
Object.defineProperty()
定义属性
定义单个属性
如前面 使用
Object.defineProperty()
。定义多个属性
在一个对象上同时定义多个属性的可能性是非常大的
Object.defineProperties()
方法定义多个属性。读取属性
Object.getOwnPropertyDescriptor()
方法可以取得指定属性的属性描述符。这个方法接收两个参数:属性所在的对象和要取得其描述符的属性名。
Object.getOwnPropertyDescriptors()
静态方法可以取得指定对象的所有属性描述符。这个方法接收两个参数:属性所在的对象。
合并对象
把源对象所有的本地属性一起复制到目标对象上。合并对象
Object.assign()
方法。这个方法接收一个目标对象和一个或多个源对象作为参数,然后将每个源对象中可枚举(
Object.propertyIsEnumerable()
返回 true)和自有(Object.hasOwnProperty()
返回 true)属性复制到目标对象。以字符串和符号为键的属性会被复制。对每个符合条件的属性,这个方法会使用源对象上的[[Get]]取得属性的值,然后使用目标对象上的[[Set]]设置属性的值。Object.assign()
实际上对每个源对象执行的是浅复制。如果多个源对象都有相同的属性,则使用最后一个复制的值。此外,从源对象访问器属性取得的值,比如获取函数,会作为一个静态值赋给目标对象。换句话说,不能在两个对象间转移获取函数和设置函数。