JavaScript基础-对象

88 阅读2分钟

1.创建对象

1.1直接定义

const obj = {
  name: 'foo',
  age: 36,
  sex: 'male'
}

console.log(obj.name); // foo
console.log(obj['age']); // 36

1.2使用{}写入变量和函数

const str = 'string';

const obj = { str };

console.log(obj); // { str: 'string' }

重命名属性

const str = 'string';

const obj = { objStr: str };

console.log(obj); // { objStr: 'string' }

2.对象的方法

2.1.constructor 返回创建对象原型的函数

const obj = {
  name: 'foo',
  age: 36,
  sex: 'male'
}

console.log(obj.constructor); // [Function: Object]

2.2.Object.keys() 返回带有对象键的数组迭代器对象(属性的键名) 可用于检测对象是否为空对象

const obj = {
  name: 'foo',
  age: 36,
  sex: 'male'
}

const nullObj = {};

console.log(Object.keys(obj)); // [ 'name', 'age', 'sex' ]

console.log(Object.keys(nullObj)); // []

2.3.toString 将对象作为字符串返回 不能返回字符串,则返回 [object Object] Object.toString() 总是返回对象构造函数

const obj = {
  name: 'foo',
  age: 36,
  sex: 'male'
}


console.log(obj.toString()); // [object Object]

console.log(Object.toString(obj)); // function Object() { [native code] }

2.4.Object.values() 显示对象的值(属性的键值)

const obj = {
  name: 'foo',
  age: 36,
  sex: 'male',
}


console.log(Object.values(obj)); // [ 'foo', 36, 'male' ]

2.5.Object.is() 用于比较两个值是否相等

特殊:NaN与NaN比较相等, -0与+0不相等

console.log(Object.is(NaN, NaN)); // true

console.log(NaN === NaN); // false

console.log(Object.is(-0, +0)); // false

console.log(-0 === +0); // true

2.6.Object.assign() 合并对象 可用于浅拷贝

后面的参数与前面的同名,则后面的覆盖前面的, undefined和null不能作为参数。 合并数组时,会把数组当做对象处理

const person = {
  name: 'person',
  age: 36,
  sex: 'male'
}

const obj = Object.assign({}, person, {job: 'job', name: 'bar'}); 

console.log(obj); // { name: 'bar', age: 36, sex: 'male', job: 'job' }

console.log(Object.assign([1,2,3], [4,5])); // [ 4, 5, 3 ]

2.7.Object.getOwnPropertyDescriptors() 返回指定对象所有自身属性(非继承属性)的描述对象

Object.getOwnPropertyDescriptor() 返回某个对象属性的描述对象

const person = {
  name: 'person',
  age: 36,
  sex: 'male'
}

/**
{
  name: {
    value: 'person',
    writable: true,
    enumerable: true,
    configurable: true
  },
  age: { value: 36, writable: true, enumerable: true, configurable: true },
  sex: {
    value: 'male',
    writable: true,
    enumerable: true,
    configurable: true
  }
}
 */
console.log(Object.getOwnPropertyDescriptors(person));

2.8.Object.entries() 参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组

const person = {
  name: 'person',
  age: 36,
  sex: 'male'
}

console.log(Object.entries(person)); // [ [ 'name', 'person' ], [ 'age', 36 ], [ 'sex', 'male' ] ]

2.9.Object.fromEntries() 是Object.entries()的逆操作

const person = {
  name: 'person',
  age: 36,
  sex: 'male'
}

const entriesObj = Object.entries(person)
console.log(Object.fromEntries(entriesObj));  // { name: 'person', age: 36, sex: 'male' }

2.10.Object.create(), 传入一个目标参数,返回一个新对象,新对象的__proto__来自于目标参数

const foo = Object.create({ a: 1 })

console.log(foo); // {}
console.log(foo.a); // 1
console.log(foo.__proto__); // { a: 1 }

2.11.Object.hasOwn()判断属性是否为自身的属性

const foo = Object.create({ a: 123 });
foo.b = 456;

console.log(Object.hasOwn(foo, 'a')); // false
console.log(Object.hasOwn(foo, 'b')); // true

3.属性的可枚举性和遍历

3.1.枚举

Object.getOwnPropertyDescriptor可以获取对象的描述对象,其中有enumerable,当enumerable为true即是可枚举,当属性为不可枚举时,则会有一些操作会忽略该属性,如:

  • for...in
  • Object.keys()
  • JSON.stringfiy()
  • Object.assign()

3.2.遍历

const person = {
  name: 'person',
  age: 36,
  sex: 'male'
}

for(item in person) {
  console.log(item); // name age sex
}

// 转为数组进行遍历
Object.keys(person) // [ 'name', 'age', 'sex' ]

// 转为数组进行遍历
Object.getOwnPropertyNames(person); // [ 'name', 'age', 'sex' ]

// 转为数组进行遍历
Reflect.ownKeys(person); // [ 'name', 'age', 'sex' ]