我们可以用下面的方法访问属性:
- 点符号: obj.property。
- 方括号 obj[“property”],方括号允许从变量中获取键,例如obj[varWithKey]。
* 方括号:
+ 当我们键入的属性名 key 为两个单词且带有空格组成时我们需要用方括号将这个 key 包起来;
+ 当我们在外部使用方括号将一个变量名作为 key 包起来时,实际上我们读取的是这个变量的值作为了 key ,并在对象中寻找和这个变量的值对应的属性名,然后输出该属性名对应的值;
* let user = {
* name: "John",
* age: 30
* };
* let key = prompt("What do you want to know about the user?", "name");
* // 访问变量
* alert( user[key] ); // John(如果输入 "name")
+ 当我们在创建对象时,将一个变量用方括号包起来作为一个属性的属性名时,那么该对象中这个属性名将跟随这个变量的值而改变;
* let fruit = prompt("Which fruit to buy?", "apple");
* let bag = {
* _ [fruit]: 5, // 属性名是从 fruit 变量中得到的_
* };
* alert( bag.apple ); // 5 如果 fruit="apple"
其他操作:
- 删除属性:delete obj.prop,用delete关键字删除对象中的一条属性,用法:delete(关键字) obj(对象名).prop(要删除的属性名);
这种方法删除比较花时间,并且只能删除这个属性,但是这个属性名如果是用一个变量表示的话,delete关键字也无法将这个变量删除,所以我们还有可以用Reflect 对象的 deleteProperty 静态方法来删除对象中的属性
Reflect.deletePropert(obj(对象名), ‘prop(要删除的属性名)’);
- 检查是否存在给定键的属性:”key” in obj。
- 遍历对象:for(let key in obj) 循环。
我们在这一章学习的叫做“普通对象(plain object)”,或者就叫对象。
JavaScript 中还有很多其他类型的对象:
- Array 用于存储有序数据集合,
- Date 用于存储时间日期,
- Error 用于存储错误信息。
- ……等等。
如果将一个对象 obj 赋值给一个变量 a ,那么这个变量实际上储存的是这个对象的地址,对象实际储存在内存中某个位置(堆中),我们将这个变量在赋值给另一个变量 b ,其实并不等于又复制了一个对象,而是相当于又复制了一个指向该对象的路径,当我们用相等和严格相等比较这两个变量时 a == b //true; a === b //true,会发现他们完全相等,因为他们本就引用的同一个对象。
如果我们希望将这个对象再复制一份,那我们应该创建一个空对象,然后将原对象遍历一遍并复制到新的空对象中:
let user = { name: “John”, age: 30 };
let clone = {}; // 新的空对象
// 将 user 中所有的属性拷贝到其中
for (let key in user) {
clone[key] = user[key];
}
// 现在 clone 是带有相同内容的完全独立的对象
clone.name = “Pete”; // 改变了其中的数据
alert( user.name ); // 原来的对象中的 name 属性依然是 John
我们也可以使用 Object.assign 方法来达成同样的效果。
1.如果在assign后的括号中直接写下多个参数,例如:let obj3 = Object.assign(obj1, obj2, ……);
这样得到的结果obj2中的参数被复制到obj1中并返回obj1,如果存在相同属性名的属性,后面的属性会覆盖前面的属性。
2.Object.assign(dest, [src1, src2, src3…])
第一个参数 dest 是指目标对象。
该方法将所有方括号或花括号中的对象作为单独的项合并到到目标对象 dest 中。换句话说,方括号内所有参数都变成了dest中的一个项。
调用结果返回 dest。
对象中如果以对象作为属性名,那么那么该对象中这个属性名就为[Object Object]。 属性名后面跟的属性值为函数时,称这个属性为该对象的方法。 对象中函数的三种写法 show: function() {} show() {} show: () => {}