基础:Object

282 阅读3分钟

一、对象

对象是一组 "键值对" 的无序集合,键名均为字符串(强制转换,es6中又引入了 symbol 值),键值可以是任何类型。当键值是一个函数时,对应的键名又称作 方法。

对象的属性可以动态创建。

// 花括号、冒号、逗号
let obj = {
  foo : 'hello',
  bar : 'world'
};

1. 对象的引用

如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,指向同一个内存地址

  1. 修改某个变量,会影响到其他变量;
  2. 如果取消某个变量对原对象的引用,不会影响到另一个变量;
  3. 引用仅限于对象(函数、数组、对象),不适用指向原始类型值的情况

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. 简写
// 属性的简写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!";
  }
};
  1. 扩展运算符
  • 扩展运算符的解构赋值,不能复制继承自原型对象的属性。
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) === '{}'