一、对象
对象是一组 "键值对" 的无序集合,键名均为字符串(强制转换,es6中又引入了 symbol 值),键值可以是任何类型。当键值是一个函数时,对应的键名又称作 方法。
对象的属性可以动态创建。
// 花括号、冒号、逗号
let obj = {
foo : 'hello',
bar : 'world'
};
1. 对象的引用
如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,指向同一个内存地址。
- 修改某个变量,会影响到其他变量;
- 如果取消某个变量对原对象的引用,不会影响到另一个变量;
- 引用仅限于对象(函数、数组、对象),不适用指向原始类型值的情况。
2. 对象的读取
- 点运算符
obj.p - 方括号运算符
obj['p']- 方括号要搭配引号''使用,否则会被当作变量名。
- 当键名是数值时,只能使用方括号。
3. in 判断某属性是否存在对象中
foo in obj; // in 不能识别该属性是对象自身还是继承的
4. for..in 属性遍历
for ... in 也不能识别该属性是对象自身还是继承的,因此可以遍历原型链上的属性。
for (let i in obj){
// i 键名
// obj[i] 键值
}
5. 判断对象是否可迭代
// 判断该对象是否有Symbol.iterator属性
typeof obj[Symbol.iterator] === 'function'
6. ES6 新增
- 简写
// 属性的简写1
const foo = 'bar';
const baz = {foo};
baz // baz = {foo: "bar"}
// 属性的简写2
let foo = 'hello';
const baz = {foo}; // baz = {foo: foo}
// 方法的简写
const o = {
method() {
return "Hello!";
}
};
// 等同于
const o = {
method: function() {
return "Hello!";
}
};
- 扩展运算符
- 扩展运算符的解构赋值,不能复制继承自原型对象的属性。
let o1 = { a: 1 };
let o2 = { b: 2 };
o2.__proto__ = o1;
let { ...o3 } = o2;
o3 // { b: 2 }
o3.a // undefined
二、Object 对象
1. 静态方法(对象本身)
1.1 Object.keys()
返回 obj 自身的可枚举属性组成的数组。
1.2 Object.create()
除了构造函数可以生成实例对象外,我们还可以用现有的对象做原型,生成新的实例对象。
let p1 = [0, 1];
let p2 = Object.create(p1); // p2 继承了 p1 的属性和方法
p2.__proto__ === p1; // true
Object.create 和 对象的直接赋值 有什么区别?
let obj = Object.create({a: 1, b: 2});
obj.c = 3;
console.log(obj.a);
let {...newObj} = obj;
console.log(newObj.b);
console.log(newObj.c);
// 1 undefined 3
1.3 Object.getPrototypeOf()、Object.setPrototypeOf()
- Object.getPrototypeOf(obj):获取对象的prototype对象。
- Object.setPrototypeOf(obj, protoObject):给obj设置原型对象。
1.4 Object.defineProperty()
Object.defineProperty()允许通过属性描述对象,定义或修改一个属性,然后返回修改后的对象。
/**
* obj:属性所在的对象
* props:字符串,表示属性名
* describe:属性描述对象
*/
Object.defineProperty(obj, props, describe);
var obj = Object.defineProperty({}, 'p', {
value: 123, // 属性对应的值
writable: false, // 等于true时,value才能有效的重新赋值
enumerable: false, // 等于true时,该属性才是可枚举的
configurable: false, // 等于true时,属性描述对象才能被改变,同时该属性也能被删除
get: function () {}, // 当访问该属性时会调用此函数,执行时会传入this对象,该属性的返回值作为属性的值
set: function (value) {} // 当value被修改时会调用该函数,参数除了要赋的值,还会传入赋值时的this对象
})
2. 实例方法(Object.prototype)
2.1 Object.prototype.toString
toString() 会返回一个对象的字符串形式,默认情况下返回类型字符串。
// 前一个字符串都是 object,后一个字符串是构造函数
"[object Object]"
"[object Number]"
2.2 obj.hasOwnProperty
判断自身是否具有该属性。
三、判断空对象
1. for in
for (let i in obj) {
return true;
}
return false;
2. Object.keys
Object.keys() 返回对象的自身可枚举属性组成的数组。
Object.keys(obj).length === 0
3. JSON.stringify()
JSON.stringify() 方法用于将 javascript对象 转换为 json 字符串。
JSON.stringify(data) === '{}'