对象概述
- 对象是一组无序的相关属性和方法的集合,所有的事物都是对象。
-
- 利用
对象字面量(对象直接量)方式创建对象:
- 利用
var obj = {
name: '张三', // 键值对
age: 18,
sayHi: function(arg){ // 匿名函数
console.log('Hello!' + arg);
}
}
var obj = {
1: 1, // '1': 1
1.3: 2, // '1.3': 2
true: 3 // 'true': 3
}
对象的所有键名都是
字符串(除了Symbol)。即使键名是数值也会被自动转为字符串。
对象的引用
var obj = {};
var obj2 = obj;
obj.a = 1;
obj2.a; // 1
obj2.b = 2;
obj1.b; // 2
obj = [];
obj2; // {a: 1, b: 2}
obj和obj2指向同一个内存地址,修改其中任何一个
对象的属性都会影响另一个,但如果给obj重新赋值,则不会影响obj2,因为obj2仍然指向之前的内存地址。
属性的操作
读取
var obj = { a: 1}
obj.a // 1
obj['a'] // 1
var obj2 = { 0.7: 1}
obj2[0.7] // 1 数值键名只能使用[]读取,使用 . 读取会报错
如果使用
[]读取属性,则键名必须放在引号内(字符串),否则会被当做变量。但数值键名可以不加引号,因为会自动转成字符串。
赋值
var obj = {};
obj.a = 1;
obj['b'] = 2;
obj // {a: 1, b: 2}
.和[]符号跟着赋值运算符=就是给属性赋值。
删除
var obj = { a: 1 }
delete obj.a // true
obj.a // undefined
delete obj.b // true
// 只有这一种情况delete会返回 false
var obj = Object.defineProperty({}, 'a', {
value: 1,
configurable: false // 可配置性为false时不可删除
})
obj // {a: 1}
delete obj.a // false
删除一个不存在的属性也返回
true,delete只能删除对象本身的属性,无法删除继承(原型链)的属性。
运算符 in
in运算符用于检查对象是否包含某个属性,返回boolean。
var obj = {a: 1}
'a' in obj // true
'toString' in obj // true in 运算符无法识别哪些属性是自身的,那些是原型链上继承的
obj.hasOwnProperty('toString') // false 使用 hasOwnProperty判断是否为对象自身的属性
for…in 循环
- 用来遍历一个对象自身及原型链上的所有的
可遍历属性,会跳过不可遍历的属性。
Object.prototype.grade = '一年级'; // obj的原型
var obj = {
name: 'peter',
age: 18,
sex: '男'
}
for (var prop in obj) { // 变量定义可以写在外面
console.log(prop); // 键: 'name' 'age' 'sex' 'grade'
console.log(obj[prop]); // 值: 'peter' 18 '男' '一年级'
if (obj.hasOwnProperty(prop)) { // 判断 prop 属性是否是自己身上的属性,返回 boolean
console.log(obj[prop]); // 'peter' 18 '男'
}
}
一般配合
obj.hasOwnProperty()使用,只遍历对象自身属性。