js对象的方法

Object.assign()

对象的复制和合并
var obj1 ={a:1};
var obj2 = Object.assign({},obj1);//这是深拷贝
//相当于先创建一个空对象,然后将obj1里的内容给空对象,然后将空对象的地址给obj2(这个给地址不一定是这个顺序顺序,但是没影响,地址一直都是这个地址)
var obj3 = {b:2};
var obj4 = Object.assign(obj3,{})//这是浅拷贝
//相当于给obj3添加了一个空的值,然后再将obj3的地址给obj4
//这种情况会造成如果后面不是空对象,会使得obj3也会跟着改变
var obj5 = Object.assign(obj3,{c:3})
//此时obj5会变成{b:2,c:3},而obj3也一样{b:2,c:3}

//所以如果我们不想在合并对象时改变其中一个对象,我们可以用一个空对象来合并其他的对象。
var obj6 = Object.assign({},obj1,obj3,{c;3});
console.log(obj6);
//{a:1,b:2,c:3},且不会改变其他对象的值。

注意:继承属性和不可枚举属性是不能拷贝的

注意:原始类型会被包装为object

var v1 = "abc";
var v2 = true;
var v3 = 666;
var v4 = Symbol("foo")

var obj = Object.assign({}, v1, null, v2, undefined, v3, v4); 
// 原始类型会被包装,null 和 undefined 会被忽略。
// 注意,只有字符串的包装对象才可能有自身可枚举属性。
console.log(obj); // { "0": "a", "1": "b", "2": "c" }
//可以看出基本上基本数据类型只有字符串可以拷贝

Object.create()

创建一个新对象

语法:Object.create(proto,[propertiesObject])

参数:proto:新创建对象的原型对象。

propertiesObject:可选,是一个对象。如果该参数被指定且不为 undefined,该传入对象的自有可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)将为新创建的对象添加指定的属性值和对应的属性描述符。

返回值:一个新对象,带着指定的原型对象和属性。

注意:如果propertiesObject参数是 null 或非原始包装对象,则抛出一个 TypeError异常。

var o;
// 相当于创建一个原型为null的空对象
o = Object.create(null);

o = {};
// 以字面量方式创建的空对象就相当于:
o = Object.create(Object.prototype);


// 创建一个以另一个空对象为原型,且拥有一个属性p的对象
o = Object.create({}, { p: { value: 42 } })

function Constructor(){}
o = new Constructor();
// 上面的一句就相当于:
o = Object.create(Constructor.prototype);
// 当然,如果在Constructor函数中有一些初始化代码,Object.create不能执行那些代码


Object.defineProperty()

给对象添加一个属性并指定该属性的配置,键一样是是修改

语法:Object.defineProperty(obj, prop, descriptor)

参数:obj:要定义属性的对象

prop:要定义或修改的属性的名称或Symbol(一个基本数据类型,具体的自己去查一下)

descriptor:要定义或修改的属性描述符。(就是要进行修改的或添加的操作)

const object1 = {};

Object.defineProperty(object1, 'property1', {
  value: 42,
  writable: false
});

object1.property1 = 77;
// throws an error in strict mode

console.log(object1.property1);
// expected output: 42

属性描述符有两种主要形式:数据描述符存取描述符数据描述符是一个具有值的属性,该值可以是可写的,也可以是不可写的。存取描述符是由 getter 函数和 setter 函数所描述的属性。一个描述符只能是这两者其中之一;不能同时是两者。

这两种描述符都是对象。它们共享以下可选键值(默认值是指在使用 Object.defineProperty() 定义属性时的默认值):

  • configurable

    当且仅当该属性的 configurable 键值为 true 时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除。 默认为 false

  • enumerable

    当且仅当该属性的 enumerable 键值为 true 时,该属性才会出现在对象的枚举属性中。 默认为 false

数据描述符独有以下可选键值:

value

该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。 默认为 undefined

writable

当且仅当该属性的 writable 键值为 true 时,属性的值,也就是上面的 value,才能被赋值运算符 (en-US)改变。 默认为 false

存取描述符独有以下可选键值:

get

属性的 getter 函数,如果没有 getter,则为 undefined。当访问该属性时,会调用此函数。执行时不传入任何参数,但是会传入 this 对象(由于继承关系,这里的this并不一定是定义该属性的对象)。该函数的返回值会被用作属性的值。
默认为 undefined

set

属性的 setter 函数,如果没有 setter,则为 undefined。当属性值被修改时,会调用此函数。该方法接受一个参数(也就是被赋予的新值),会传入赋值时的 this 对象。
默认为 undefined

getter和setter,这里不具体描述,有点复杂,以后会单独来详细说明。

Object.defineProperties()

给对象添加多个属性并分别指定它们的配置。其中键一样的是进行修改操作

语法:Object.defineProperties(obj, props)

参数:obj:在其上定义或修改属性的对象.

props:要定义 其可枚举属性或修改 的 属性描述符 的对象。(不好解释,看例子)

var obj = {};
Object.defineProperties(obj, {
  'property1': {
    value: true,
    writable: true
  },
  'property2': {
    value: 'Hello',
    writable: false
  }
  // etc. etc.
});
//这个就是往对象obj中添加新的键和键值(通过属性描述符来定义和限制)
//与 Object.defineProperty()的区别就是一个是只能操作一个的,一个是可以同时操作多个的

Object.entries()

返回给定对象自身可枚举属性的[key, value]数组。

语法:Object.entries(obj)

Object.entries()返回一个数组,其元素是与直接在obj上找到的可枚举属性键值对相对应的数组。属性的顺序与通过手动循环对象的属性值所给出的顺序相同。(也就是按系统自动排好的顺序)

const obj = { foo: 'bar', baz: 42 };
console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ]

Object.freeze()

冻结对象:其他代码不能删除或更改任何属性。

Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。

Object.getOwnPropertyDescriptor()

Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)

语法:Object.getOwnPropertyDescriptor(obj, prop)

prop:目标对象内的属性名称。

const object1 = {
  property1: 42
};

const descriptor1 = Object.getOwnPropertyDescriptor(object1, 'property1');

console.log(descriptor1.configurable);
// expected output: true

console.log(descriptor1.value);
// expected output: 42

具体的属性描述符,看Object.defineProperty()中的说明

Object.getOwnPropertyNames()

**Object.getOwnPropertyNames()**方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。

语法:Object.getOwnPropertyNames(obj)

Object.getOwnPropertySymbols()

**Object.getOwnPropertySymbols()** 方法返回一个给定对象自身的所有 Symbol 属性的数组。

语法:Object.getOwnPropertySymbols(obj)

因为所有的对象在初始化的时候不会包含任何的 Symbol,除非你在对象上赋值了 Symbol 否则Object.getOwnPropertySymbols()只会返回一个空的数组。

Object.getPrototypeOf()

**Object.getPrototypeOf()** 方法返回指定对象的原型(内部[[Prototype]]属性的值)。

语法:Object.getPrototypeOf(object)

返回值:给定对象的原型。如果没有继承属性,则返回 null

Object.is()

比较两个值是否相同。所有 NaN 值都相等(这与=不同)。

语法:Object.is(value1, value2);

注意:Object.is()不会对两个参数进行强制类型转化,意味着,两个值必须是同类型的才能算相等。相等返回true,不等返回false

Object.keys()

返回一个包含所有给定对象自身可枚举属性名称的数组。

语法:Object.keys(obj)

返回值:一个表示给定对象的所有可枚举属性的字符串数组,顺序按系统排好的顺序,跟自己输入的顺序无关。

var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj)); // console: ['2', '7', '100']

Object.values()

返回给定对象自身可枚举值的数组。

语法:Object.values(obj)

一个包含对象自身的所有可枚举属性的数组。(键值)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值