当前位置: 首页 > news >正文

js对象的方法速览---数组的静态方法,实例方法和属性合集,各包含一个示例

tip:

本文仅作为查找和基本使用的展示,需要深入了解这些方法的使用请参考:Object - JavaScript | MDN (mozilla.org)

可以通过目录快速锁定需要查找的方法和查看它的使用

目录

tip:

新建一个对象

 实例属性

实例方法

hasOwnProperty(key)

isPrototypeOf(obj)

propertyIsEnumerable(prop)

toLocaleString()

toString()

 valueOf()

静态方法

 Object.assign(target, ...sources)

 Object.create(proto)  

Object.defineProperties(obj, props)

Object.defineProperty(obj, prop, descriptor)

Object.entries(obj)

Object.fromEntries(iterable)

Object.getOwnPropertyDescriptor(obj, prop)

Object.getOwnPropertyDescriptors(obj)

 Object.getOwnPropertyNames(obj)

Object.getOwnPropertySymbols(obj)

Object.getPrototypeOf(obj)

Object.groupBy(item, callback)---2024新增

Object.hasOwn(obj, prop)

Object.is(value1, value2)

Object.preventExtensions(obj),Object.isExtensible(obj)

Object.freeze(obj)

Object.isFrozen(obj)

 Object.seal(obj),Object.isSealed(obj)

 Object.keys(obj)

 Object.values(obj)

 Object.setPrototypeOf(obj, prototype)

方法总览


新建一个对象

// 新建一个对象const obj = {//通过{}name:'Tom',age:18
}
const obj1 = new Object({//通过构造函数name:'Tom',age:18
})
const obj2 = Object.create({ //通过静态方法name:'Tom',age:18
})//注意这里的参数不是生成对象的结果,参数会作为obj2的原型,obj2本身是一个新的空对象console.log(obj,obj1,obj2);console.log("\n----------分割线----------\n");

 实例属性

// 实例属性// constructor 对象的实例属性
// 除了 null 原型对象之外,任何对象都会在其 [[Prototype]] 上有一个 constructor 属性。
// Object 实例的 constructor 数据属性返回一个引用,指向创建该实例对象的构造函数(函数本身而不是字符串)
// 可以用来判断对象类型
const arr = [];
const number = 1;
console.log(obj.constructor === Object);//true
console.log(arr.constructor === Array);//true
console.log(number.constructor === Number);//trueconsole.log("\n----------分割线----------\n");

实例方法

hasOwnProperty(key)

方法会返回一个布尔值,如果自身有这个key属性(不包括原型中继承的属性),则返回 true,否则返回 false。

// hasOwnProperty(key) 方法会返回一个布尔值,如果自身有这个key属性(不包括原型中继承的属性),则返回 true,否则返回 false。
console.log({name:'Tom'}.hasOwnProperty('name'));//true
console.log({name:undefined}.hasOwnProperty('name'));//true,这里的name值虽然是undefined,但是属性存在
console.log(['Tom'].hasOwnProperty('0'));//true,数组也是对象,可以将索引看成key
console.log([].hasOwnProperty('length'));//true,数组固有的属性lengthconsole.log("\n----------分割线----------\n");

isPrototypeOf(obj)

返回布尔值 判断当前对象是否在obj的原型链中,(对象---原型链)和object instanceof AFunction不同,这是比较两个对象的原型链 ,(原型链---原型链)

// isPrototypeOf(obj) 返回布尔值 判断当前对象是否在obj的原型链中,(对象---原型链)
// 和object instanceof AFunction不同,这是比较两个对象的原型链 ,(原型链---原型链)
console.log(Object.prototype.isPrototypeOf({}));//true,Object出现在{}的原型链中
console.log(Array.prototype.isPrototypeOf([]));//true,Array出现在[]的原型链中console.log("\n----------分割线----------\n");

propertyIsEnumerable(prop)

方法返回一个布尔值,表示prop是否是对象的可枚举自有属性(遍历时是否会被访问,能否出现在for in循环中)

大多数内置属性默认情况下是不可枚举的,而用户创建的对象属性通常是可枚举的,除非明确指定为不可枚举。

// propertyIsEnumerable(prop) 方法返回一个布尔值,表示prop是否是对象的可枚举自有属性(遍历时是否会被访问,能否出现在for in循环中)
// 大多数内置属性默认情况下是不可枚举的,而用户创建的对象属性通常是可枚举的,除非明确指定为不可枚举。
console.log({name:'Tom'}.propertyIsEnumerable('name'));//true,name属性可以遍历
console.log(['0'].propertyIsEnumerable('0'));//true,索引属性可以遍历
console.log(['0'].propertyIsEnumerable('length'));//false,length属性不可遍历console.log("\n----------分割线----------\n");

toLocaleString()

 返回一个字符串,返回调用toString()的结果(return this.toString())

// toLocaleString() 返回一个字符串,返回调用toString()的结果(return this.toString())
console.log({name:'Tom'}.toLocaleString());//"[object Object]"console.log("\n----------分割线----------\n");

toString()

返回一个表示该对象的字符串。打印实例时默认调用该方法

// toString() 返回一个表示该对象的字符串。打印实例时默认调用该方法
console.log({name:'Tom'}.toString());//"[object Object]"console.log("\n----------分割线----------\n");

 valueOf()

返回指定对象的原始值。值传递时可以使用valueOf将值提取出来

// valueOf() 返回指定对象的原始值。值传递时可以使用valueOf将值提取出来
const obj3 = {name:'Tom'}
let newObj = obj3.valueOf();// 值传递,此时newObj和obj3并不是指向同一个内存
console.log(obj3.valueOf());// {name:'Tom'},返回对象本身的值
console.log(obj3.valueOf() === obj3);//trueconsole.log("\n----------分割线----------\n");

静态方法

 Object.assign(target, ...sources)

将source中所有可以遍历的键值对,放入target中,返回target;target和source中相同的key,source中的值会覆盖target中的值,target 待修改的对象 ,source 多个对象

// Object.assign(target, ...sources) 将source中所有可以遍历的键值对,放入target中,返回target
// target和source中相同的key,source中的值会覆盖target中的值
// target 待修改的对象 ,source 多个对象
console.log(Object.assign({},{name:'tom'},{age:'10'}));// {name:'tom',age:'10'}
console.log(Object.assign({},[1,2,3,4]));// {0:1,1:2,2:3,3:4}
console.log(Object.assign({},[1,2,3,4],'sss'));// { '0': 's', '1': 's', '2': 's', '3': 4 },字符串会被拆分成单个字符作为对象,后面的属性值会覆盖前面的console.log("\n----------分割线----------\n");

 Object.create(proto)  

静态方法以proto作为原型,创建一个新对象。

// Object.create(proto)  静态方法以proto作为原型,创建一个新对象。
const obj4 = Object.create([]);//以[]作为原型,创建一个新对象,数组对象
console.log(obj4);//Array {}console.log("\n----------分割线----------\n");

Object.defineProperties(obj, props)

静态方法直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。

obj:在其上定义或修改属性的对象; props: 一个对象,其中每个键表示要定义或修改的属性的名称,每个值是描述该属性的对象(是否只读,是否可枚举遍历,)

// Object.defineProperties(obj, props) 静态方法直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。
// obj:在其上定义或修改属性的对象; props: 一个对象,其中每个键表示要定义或修改的属性的名称,每个值是描述该属性的对象(是否只读,是否可枚举遍历,)
console.log(Object.defineProperties({name:'Tom'
},
{//属性描述对象name:{value:'Jerry',writable:true //可读写}
}));//{name:'Jerry'}console.log("\n----------分割线----------\n");

Object.defineProperty(obj, prop, descriptor)

静态方法会直接在obj上定义一个新属性prop,或修改其现有属性prop,并返回此对象。

obj:待修改的对象 prop:obj对象待修改的属性名 descriptor:属性描述对象

// Object.defineProperty(obj, prop, descriptor) 静态方法会直接在obj上定义一个新属性prop,或修改其现有属性prop,并返回此对象。
// obj:待修改的对象 prop:obj对象待修改的属性名 descriptor:属性描述对象
console.log(Object.defineProperty({name:'Tom'},'name',{value:'Jerry'}));//{name:'Jerry'}console.log("\n----------分割线----------\n");

Object.entries(obj)

返回一个obj自身可枚举(可遍历)属性的键值对数组(元组),

其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for...in 循环还会枚举其原型链中的属性)。

// Object.entries(obj) 返回一个obj自身可枚举(可遍历)属性的键值对数组(元组),
// 其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for...in 循环还会枚举其原型链中的属性)。
console.log(Object.entries({name:'Tom',age:18}));//[["name","Tom"],["age",18]]console.log("\n----------分割线----------\n");

Object.fromEntries(iterable)

将键值对列表(iterable)转换为一个对象。

iterable:一个包含对象列表的可迭代对象,例如 Array 或者 Map。

每个对象都要有两个属性,0:表示属性键的字符串或者 Symbol。1:属性值。通常,该对象被实现为二元数组,第一个元素是属性键,第二个元素是属性值。

// Object.fromEntries(iterable) 将键值对列表(iterable)转换为一个对象。
// iterable:一个包含对象列表的可迭代对象,例如 Array 或者 Map。
// 每个对象都要有两个属性,0:表示属性键的字符串或者 Symbol。1:属性值。通常,该对象被实现为二元数组,第一个元素是属性键,第二个元素是属性值。console.log(Object.fromEntries([['name','Tom'],['age',18]]));//{name:'Tom',age:18}console.log("\n----------分割线----------\n");

Object.getOwnPropertyDescriptor(obj, prop)

返回obj上一个自有属性prop对应的属性描述对象,如果obj上没有prop属性返回undefined。

obj:待查询的对象 prop:string或者symbol 待查询的属性名

// Object.getOwnPropertyDescriptor(obj, prop) 返回obj上一个自有属性prop对应的属性描述对象,如果obj上没有prop属性返回undefined。
// obj:待查询的对象 prop:string或者symbol 待查询的属性名console.log(Object.getOwnPropertyDescriptor({name:'Tom'},'name'));
//{value:'Tom',writable:true,enumerable:true,configurable:true}console.log("\n----------分割线----------\n");

Object.getOwnPropertyDescriptors(obj)

返回obj的所有自有属性属性描述对象。obj:待查询的对象,类似于Object.getOwnPropertyDescriptor

// Object.getOwnPropertyDescriptors(obj) 返回obj的所有自有属性属性描述对象。obj:待查询的对象,类似于Object.getOwnPropertyDescriptorconsole.log(Object.getOwnPropertyDescriptors({name:'Tom',age:18}));//{name:{...},age:{...}}console.log("\n----------分割线----------\n");

 Object.getOwnPropertyNames(obj)

返回obj对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol属性)组成的数组。

// Object.getOwnPropertyNames(obj) 返回obj对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol属性)组成的数组。console.log(Object.getOwnPropertyNames({name:'Tom',age:18}));//['name','age']console.log("\n----------分割线----------\n");

Object.getOwnPropertySymbols(obj)

返回obj对象自身的所有 Symbol 属性的数组。

// Object.getOwnPropertySymbols(obj) 返回obj对象自身的所有 Symbol 属性的数组。console.log(Object.getOwnPropertySymbols({[Symbol('name')]:1,[Symbol('age')]:2, name:'Tom',age:18}));//[Symbol(name),Symbol(age)]console.log("\n----------分割线----------\n");

Object.getPrototypeOf(obj)

返回obj对象的原型对象。即内部 [[Prototype]] 属性的值

// Object.getPrototypeOf(obj) 返回obj对象的原型对象。即内部 [[Prototype]] 属性的值console.log(Object.getPrototypeOf({}));//Object
console.log(Object.getPrototypeOf([]));//Arrayconsole.log("\n----------分割线----------\n");

Object.groupBy(item, callback)---2024新增

返回一个对象,对象内根据callback的返回值,将item进行分类。 item:待分类的可迭代对象  callback:回调函数,返回值作为分类的依据

const items = [{ name: "芦笋", type: "蔬菜", quantity: 5 },{ name: "香蕉", type: "水果", quantity: 0 },{ name: "山羊", type: "肉", quantity: 23 },{ name: "樱桃", type: "水果", quantity: 5 },{ name: "鱼", type: "肉", quantity: 22 },
];
const result = Object.groupBy(items, ({type}) => type);//此方法目前只在浏览器支持
console.log(result);//{蔬菜:{...},水果:{...},肉:{...}}

Object.hasOwn(obj, prop)

返回布尔值,检查obj对象自身是否具有指定的属性prop。Object.hasOwn() 旨在取代 Object.prototype.hasOwnProperty()。


// Object.hasOwn(obj, prop) 返回布尔值,检查obj对象自身是否具有指定的属性prop。Object.hasOwn() 旨在取代 Object.prototype.hasOwnProperty()。console.log(Object.hasOwn({name:'Tom'},'name'));//trueconsole.log("\n----------分割线----------\n");

Object.is(value1, value2)

返回布尔值,判断两个值是否为同一个值。

Object.is() 与 == 运算符并不等价, 也不等价于 === 运算符,相比于 == Object.is()转换类型比较,相比于 === Object.is()不会忽略 +0 和 -0,也不会把 NaN 等于 NaN。

// Object.is(value1, value2) 返回布尔值,判断两个值是否为同一个值。
// Object.is() 与 == 运算符并不等价, 也不等价于 === 运算符,相比于 == Object.is()转换类型比较,相比于 === Object.is()不会忽略 +0 和 -0,也不会把 NaN 等于 NaN。
console.log(Object.is(1,1));//true
console.log(Object.is(NaN,NaN));//true , == 和 === 返回false
console.log(Object.is(0,-0));//false , == 和 === 返回trueconsole.log("\n----------分割线----------\n");

Object.preventExtensions(obj),Object.isExtensible(obj)

Object.preventExtensions(obj)可以防止新属性被添加到obj中(即防止该对象被扩展)。它还可以防止对象的原型被重新指定。

Object.isExtensible(obj)返回布尔值,判断对象是否可扩展(是否可以添加新的属性)。

在ES5中传入的值不是对象会直接报错,在ES6中传入的值不是对象会返回false

// Object.preventExtensions(obj) 静态方法可以防止新属性被添加到obj中(即防止该对象被扩展)。它还可以防止对象的原型被重新指定。
// 在ES5中传入的值不是对象会直接报错,在ES6中传入的值不是对象会返回false
// Object.isExtensible(obj) 返回布尔值,判断对象是否可扩展(是否可以添加新的属性)。
// 在ES5中传入的值不是对象会直接报错,在ES6中传入的值不是对象会返回false
const extensibleObj = Object.preventExtensions({name:'Tom'});console.log(Object.isExtensible(extensibleObj));//false,不可扩展
console.log(Object.isExtensible({name:'Tom'}));//true
console.log(Object.isExtensible(1));//falseconsole.log("\n----------分割线----------\n");

 

Object.freeze(obj)

冻结obj对象并将其返回,

冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性,

即这个对象本身以及属性都不能在修改(新增、删除、添加、修改),但是,当属性是引用类型时可以修改引用类型内的属性和值(浅冻结,只影响一层)

// Object.freeze(obj) 冻结obj对象并将其返回,
// 冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性,
// 即这个对象本身以及属性都不能在修改(新增、删除、添加、修改),但是,当属性是引用类型时可以修改引用类型内的属性和值(浅冻结,只影响一层)const obj5 = {//注意区分常量和冻结,常量表示的是obj5不能被复制,内部任然可以修改,(浅)冻结是内部的(一层)属性不能被修改name:'Tom',age:18,info:{//此处内部不受浅冻结影响,若要深冻结则需要遍历引用类型属性冻结address:'beijing'}
}console.log(Object.freeze(obj5) === obj5);//{name:'Tom',age:18},返回冻结后的对象,和原对象一致

Object.isFrozen(obj)

返回布尔值,判断对象是否被冻结。

在ES5中传入的值不是对象会直接报错,在ES6中传入的值不是对象会返回false

// Object.isFrozen(obj) 返回布尔值,判断对象是否被冻结。
// 在ES5中传入的值不是对象会直接报错,在ES6中传入的值不是对象会返回false
const freezeObj = Object.freeze({name:'Tom'});
console.log(Object.isFrozen(freezeObj));//true
console.log(Object.isFrozen({name:'Tom'}));//false
console.log(Object.isFrozen(1));//falseconsole.log("\n----------分割线----------\n");

 

 Object.seal(obj),Object.isSealed(obj)

Object.seal(obj) 返回传递的对象,使obj密封。

Object.isSealed(obj) 返回布尔值,判断对象是否被密封(不能添加,删除,修改)。

在ES5中传入的值不是对象会直接报错,在ES6中传入的值不是对象会返回false

// Object.seal(obj) 返回传递的对象,使obj密封。
// Object.isSealed(obj) 返回布尔值,判断对象是否被密封(不能添加,删除,修改)。
// 在ES5中传入的值不是对象会直接报错,在ES6中传入的值不是对象会返回false
const sealObj = Object.seal({name:'Tom'});
console.log(Object.isSealed(sealObj));//true
console.log(Object.isSealed({name:'Tom'}));//falseconsole.log("\n----------分割线----------\n");

 Object.keys(obj)

返回一个包含所有自有可枚举(可遍历)属性名称的数组。obj:待查询的对象,传入基本类型返回空数组[]

// Object.keys(obj) 返回一个包含所有自有可枚举(可遍历)属性名称的数组。obj:待查询的对象,传入基本类型返回空数组[]console.log(Object.keys({name:'Tom',age:18}));//['name','age']console.log("\n----------分割线----------\n");

 Object.values(obj)

返回一个包含所有自有可枚举(可遍历)属性值的数组。obj:待查询的对象,传入基本类型返回空数组[]

// Object.values(obj) 返回一个包含所有自有可枚举(可遍历)属性值的数组。obj:待查询的对象,传入基本类型返回空数组[]console.log(Object.values({name:'Tom',age:18}));//['Tom',18]console.log("\n----------分割线----------\n");

 Object.setPrototypeOf(obj, prototype)

设置对象obj的原型为prototype,并返回该对象。

通常,作为正确的方式,应该使用 Object.setPrototypeOf() 方法来设置对象的原型。因为 Object.prototype.__proto__ 访问器已被弃用。

如果传入基本类型,则直接返回该基本类型,不进行任何其他操作

更改对象的 [[Prototype]] 在各个浏览器和 JavaScript 引擎上都是一个很慢的操作,要顾及性能应避免修改原型属性

// Object.setPrototypeOf(obj, prototype),设置对象obj的原型为prototype,并返回该对象。
// 通常,作为正确的方式,应该使用 Object.setPrototypeOf() 方法来设置对象的原型。因为 Object.prototype.__proto__ 访问器已被弃用。
// 如果传入基本类型,则直接返回该基本类型,不进行任何其他操作
// 更改对象的 [[Prototype]] 在各个浏览器和 JavaScript 引擎上都是一个很慢的操作,要顾及性能应避免修改原型属性const ob = {"0":0,"1":1}
Object.setPrototypeOf(ob,Array.prototype);
console.log(ob);//Array { '0': 0, '1': 1 }

方法总览

// 新建一个对象const obj = {//通过{}name:'Tom',age:18
}
const obj1 = new Object({//通过构造函数name:'Tom',age:18
})
const obj2 = Object.create({ //通过静态方法name:'Tom',age:18
})//注意这里的参数不是生成对象的结果,参数会作为obj2的原型,obj2本身是一个新的空对象console.log(obj,obj1,obj2);console.log("\n----------分割线----------\n");// 实例属性// constructor 对象的实例属性
// 除了 null 原型对象之外,任何对象都会在其 [[Prototype]] 上有一个 constructor 属性。
// Object 实例的 constructor 数据属性返回一个引用,指向创建该实例对象的构造函数(函数本身而不是字符串)
// 可以用来判断对象类型
const arr = [];
const number = 1;
console.log(obj.constructor === Object);//true
console.log(arr.constructor === Array);//true
console.log(number.constructor === Number);//trueconsole.log("\n----------分割线----------\n");// 实例方法// hasOwnProperty(key) 方法会返回一个布尔值,如果自身有这个key属性(不包括原型中继承的属性),则返回 true,否则返回 false。
console.log({name:'Tom'}.hasOwnProperty('name'));//true
console.log({name:undefined}.hasOwnProperty('name'));//true,这里的name值虽然是undefined,但是属性存在
console.log(['Tom'].hasOwnProperty('0'));//true,数组也是对象,可以将索引看成key
console.log([].hasOwnProperty('length'));//true,数组固有的属性lengthconsole.log("\n----------分割线----------\n");// isPrototypeOf(obj) 返回布尔值 判断当前对象是否在obj的原型链中,(对象---原型链)
// 和object instanceof AFunction不同,这是比较两个对象的原型链 ,(原型链---原型链)
console.log(Object.prototype.isPrototypeOf({}));//true,Object出现在{}的原型链中
console.log(Array.prototype.isPrototypeOf([]));//true,Array出现在[]的原型链中console.log("\n----------分割线----------\n");// propertyIsEnumerable(prop) 方法返回一个布尔值,表示prop是否是对象的可枚举自有属性(遍历时是否会被访问,能否出现在for in循环中)
// 大多数内置属性默认情况下是不可枚举的,而用户创建的对象属性通常是可枚举的,除非明确指定为不可枚举。
console.log({name:'Tom'}.propertyIsEnumerable('name'));//true,name属性可以遍历
console.log(['0'].propertyIsEnumerable('0'));//true,索引属性可以遍历
console.log(['0'].propertyIsEnumerable('length'));//false,length属性不可遍历console.log("\n----------分割线----------\n");// toLocaleString() 返回一个字符串,返回调用toString()的结果(return this.toString())
console.log({name:'Tom'}.toLocaleString());//"[object Object]"console.log("\n----------分割线----------\n");// toString() 返回一个表示该对象的字符串。打印实例时默认调用该方法
console.log({name:'Tom'}.toString());//"[object Object]"console.log("\n----------分割线----------\n");// valueOf() 返回指定对象的原始值。值传递时可以使用valueOf将值提取出来
const obj3 = {name:'Tom'}
let newObj = obj3.valueOf();// 值传递,此时newObj和obj3并不是指向同一个内存
console.log(obj3.valueOf());// {name:'Tom'},返回对象本身的值
console.log(obj3.valueOf() === obj3);//trueconsole.log("\n----------分割线----------\n");// 静态方法// Object.assign(target, ...sources) 将source中所有可以遍历的键值对,放入target中,返回target
// target和source中相同的key,source中的值会覆盖target中的值
// target 待修改的对象 ,source 多个对象
console.log(Object.assign({},{name:'tom'},{age:'10'}));// {name:'tom',age:'10'}
console.log(Object.assign({},[1,2,3,4]));// {0:1,1:2,2:3,3:4}
console.log(Object.assign({},[1,2,3,4],'sss'));// { '0': 's', '1': 's', '2': 's', '3': 4 },字符串会被拆分成单个字符作为对象,后面的属性值会覆盖前面的console.log("\n----------分割线----------\n");// Object.create(proto)  静态方法以proto作为原型,创建一个新对象。
const obj4 = Object.create([]);//以[]作为原型,创建一个新对象,数组对象
console.log(obj4);//Array {}console.log("\n----------分割线----------\n");// Object.defineProperties(obj, props) 静态方法直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。
// obj:在其上定义或修改属性的对象; props: 一个对象,其中每个键表示要定义或修改的属性的名称,每个值是描述该属性的对象(是否只读,是否可枚举遍历,)
console.log(Object.defineProperties({name:'Tom'
},
{//属性描述对象name:{value:'Jerry',writable:true //可读写}
}));//{name:'Jerry'}console.log("\n----------分割线----------\n");// Object.defineProperty(obj, prop, descriptor) 静态方法会直接在obj上定义一个新属性prop,或修改其现有属性prop,并返回此对象。
// obj:待修改的对象 prop:obj对象待修改的属性名 descriptor:属性描述对象
console.log(Object.defineProperty({name:'Tom'},'name',{value:'Jerry'}));//{name:'Jerry'}console.log("\n----------分割线----------\n");// Object.entries(obj) 返回一个obj自身可枚举(可遍历)属性的键值对数组(元组),
// 其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for...in 循环还会枚举其原型链中的属性)。
console.log(Object.entries({name:'Tom',age:18}));//[["name","Tom"],["age",18]]console.log("\n----------分割线----------\n");// Object.fromEntries(iterable) 将键值对列表(iterable)转换为一个对象。
// iterable:一个包含对象列表的可迭代对象,例如 Array 或者 Map。
// 每个对象都要有两个属性,0:表示属性键的字符串或者 Symbol。1:属性值。通常,该对象被实现为二元数组,第一个元素是属性键,第二个元素是属性值。console.log(Object.fromEntries([['name','Tom'],['age',18]]));//{name:'Tom',age:18}console.log("\n----------分割线----------\n");// Object.getOwnPropertyDescriptor(obj, prop) 返回obj上一个自有属性prop对应的属性描述对象,如果obj上没有prop属性返回undefined。
// obj:待查询的对象 prop:string或者symbol 待查询的属性名console.log(Object.getOwnPropertyDescriptor({name:'Tom'},'name'));
//{value:'Tom',writable:true,enumerable:true,configurable:true}console.log("\n----------分割线----------\n");// Object.getOwnPropertyDescriptors(obj) 返回obj的所有自有属性属性描述对象。obj:待查询的对象,类似于Object.getOwnPropertyDescriptorconsole.log(Object.getOwnPropertyDescriptors({name:'Tom',age:18}));//{name:{...},age:{...}}console.log("\n----------分割线----------\n");// Object.getOwnPropertyNames(obj) 返回obj对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol属性)组成的数组。console.log(Object.getOwnPropertyNames({name:'Tom',age:18}));//['name','age']console.log("\n----------分割线----------\n");// Object.getOwnPropertySymbols(obj) 返回obj对象自身的所有 Symbol 属性的数组。console.log(Object.getOwnPropertySymbols({[Symbol('name')]:1,[Symbol('age')]:2, name:'Tom',age:18}));//[Symbol(name),Symbol(age)]console.log("\n----------分割线----------\n");// Object.getPrototypeOf(obj) 返回obj对象的原型对象。即内部 [[Prototype]] 属性的值console.log(Object.getPrototypeOf({}));//Object
console.log(Object.getPrototypeOf([]));//Arrayconsole.log("\n----------分割线----------\n");// Object.groupBy(item, callback) 返回一个对象,对象内根据callback的返回值,将item进行分类。2024新增
// item:待分类的可迭代对象  callback:回调函数,返回值作为分类的依据// const items = [
//   { name: "芦笋", type: "蔬菜", quantity: 5 },
//   { name: "香蕉", type: "水果", quantity: 0 },
//   { name: "山羊", type: "肉", quantity: 23 },
//   { name: "樱桃", type: "水果", quantity: 5 },
//   { name: "鱼", type: "肉", quantity: 22 },
// ];
// const result = Object.groupBy(items, ({type}) => type);//此方法目前只在浏览器支持
// console.log(result);//{蔬菜:{...},水果:{...},肉:{...}}// Object.hasOwn(obj, prop) 返回布尔值,检查obj对象自身是否具有指定的属性prop。Object.hasOwn() 旨在取代 Object.prototype.hasOwnProperty()。console.log(Object.hasOwn({name:'Tom'},'name'));//trueconsole.log("\n----------分割线----------\n");// Object.is(value1, value2) 返回布尔值,判断两个值是否为同一个值。
// Object.is() 与 == 运算符并不等价, 也不等价于 === 运算符,相比于 == Object.is()转换类型比较,相比于 === Object.is()不会忽略 +0 和 -0,也不会把 NaN 等于 NaN。
console.log(Object.is(1,1));//true
console.log(Object.is(NaN,NaN));//true , == 和 === 返回false
console.log(Object.is(0,-0));//false , == 和 === 返回trueconsole.log("\n----------分割线----------\n");// Object.preventExtensions(obj) 静态方法可以防止新属性被添加到obj中(即防止该对象被扩展)。它还可以防止对象的原型被重新指定。
// 在ES5中传入的值不是对象会直接报错,在ES6中传入的值不是对象会返回false
// Object.isExtensible(obj) 返回布尔值,判断对象是否可扩展(是否可以添加新的属性)。
// 在ES5中传入的值不是对象会直接报错,在ES6中传入的值不是对象会返回false
const extensibleObj = Object.preventExtensions({name:'Tom'});console.log(Object.isExtensible(extensibleObj));//false,不可扩展
console.log(Object.isExtensible({name:'Tom'}));//true
console.log(Object.isExtensible(1));//falseconsole.log("\n----------分割线----------\n");// Object.freeze(obj) 冻结obj对象并将其返回,
// 冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性,
// 即这个对象本身以及属性都不能在修改(新增、删除、添加、修改),但是,当属性是引用类型时可以修改引用类型内的属性和值(浅冻结,只影响一层)const obj5 = {//注意区分常量和冻结,常量表示的是obj5不能被复制,内部任然可以修改,(浅)冻结是内部的(一层)属性不能被修改name:'Tom',age:18,info:{//此处内部不受浅冻结影响,若要深冻结则需要遍历引用类型属性冻结address:'beijing'}
}console.log(Object.freeze(obj5) === obj5);//{name:'Tom',age:18},返回冻结后的对象,和原对象一致// Object.isFrozen(obj) 返回布尔值,判断对象是否被冻结。
// 在ES5中传入的值不是对象会直接报错,在ES6中传入的值不是对象会返回false
const freezeObj = Object.freeze({name:'Tom'});
console.log(Object.isFrozen(freezeObj));//true
console.log(Object.isFrozen({name:'Tom'}));//false
console.log(Object.isFrozen(1));//falseconsole.log("\n----------分割线----------\n");// Object.seal(obj) 返回传递的对象,使obj密封。
// Object.isSealed(obj) 返回布尔值,判断对象是否被密封(不能添加,删除,修改)。
// 在ES5中传入的值不是对象会直接报错,在ES6中传入的值不是对象会返回false
const sealObj = Object.seal({name:'Tom'});
console.log(Object.isSealed(sealObj));//true
console.log(Object.isSealed({name:'Tom'}));//falseconsole.log("\n----------分割线----------\n");// Object.keys(obj) 返回一个包含所有自有可枚举(可遍历)属性名称的数组。obj:待查询的对象,传入基本类型返回空数组[]console.log(Object.keys({name:'Tom',age:18}));//['name','age']console.log("\n----------分割线----------\n");// Object.values(obj) 返回一个包含所有自有可枚举(可遍历)属性值的数组。obj:待查询的对象,传入基本类型返回空数组[]console.log(Object.values({name:'Tom',age:18}));//['Tom',18]console.log("\n----------分割线----------\n");// Object.setPrototypeOf(obj, prototype),设置对象obj的原型为prototype,并返回该对象。
// 通常,作为正确的方式,应该使用 Object.setPrototypeOf() 方法来设置对象的原型。因为 Object.prototype.__proto__ 访问器已被弃用。
// 如果传入基本类型,则直接返回该基本类型,不进行任何其他操作
// 更改对象的 [[Prototype]] 在各个浏览器和 JavaScript 引擎上都是一个很慢的操作,要顾及性能应避免修改原型属性const ob = {"0":0,"1":1}
Object.setPrototypeOf(ob,Array.prototype);
console.log(ob);//Array { '0': 0, '1': 1 }

相关文章:

js对象的方法速览---数组的静态方法,实例方法和属性合集,各包含一个示例

tip: 本文仅作为查找和基本使用的展示,需要深入了解这些方法的使用请参考:Object - JavaScript | MDN (mozilla.org) 可以通过目录快速锁定需要查找的方法和查看它的使用 目录 tip: 新建一个对象 实例属性 实例方法 hasOwn…...

Redis基础教程(十四):Redis连接

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…...

GraphRAG——一个基于图的检索增强生成的开源项目【送源码】

GraphRAG 最近几天,微软团队开源了GraphRAG,这是一种基于图(Graph)的检索增强生成方法。 先说说RAG吧,检索增强生成,相当于是从一个给定好的知识库中进行检索,接入LLM模型,让模型生…...

什么是 VueQuill(前端的富文本编辑器)?

什么是 VueQuill? 1. 简介 VueQuill 是 Vue.js 的一个富文本编辑器插件,它基于 Quill 编辑器构建,提供了简洁且功能强大的富文本编辑功能。Quill 是一个现代化的富文本编辑器,提供丰富的文本编辑能力,支持多种格式和…...

从海上长城到数字防线:视频技术在海域边防现代化中的创新应用

随着全球化和科技发展的加速,海域安全问题日益凸显其重要性。海域边防作为国家安全的第一道防线,其监控和管理面临着诸多挑战。近年来,视频技术的快速发展为海域边防场景提供了新的解决方案,其高效、实时、远程的监控特点极大地提…...

《信息技术与信息化 》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问:《信息技术与信息化 》是不是核心期刊? 答:不是,是知网收录的第一批认定学术期刊。 问:《信息技术与信息化 》级别? 答:省级。主管单位:山东省科学技术协会 主办单…...

【最新版】手把手Claude 3.5 Sonnet 详细步骤注册方法!

目录 01 Claude 3.5 Sonnet 是什么 02 Claude 3.5 Sonnet 注册方法 Step1:注册 Wildcard Step2:注册Claude3.5 Step3:接收并输入验证 03 使用Claude 3.5 Sonnet 04 升级Claude 3 Opus 05 结语 01 Claude 3.5 Sonnet 是什么 蛰伏了三…...

代理模式和Java中的动态代理【开发实践】

文章目录 一、代理模式基础1.1 代理模式1.2 静态代理1.3 动态代理 二、静态代理的实现三、JDK动态代理3.1 JDK动态代理概述3.2 invoke方法介绍3.3 JDK动态代理的使用 四、CGLIB动态代理3.1 CGLIB动态代理概述3.2 CGLIB动态代理的使用 五、对比5.1 代理实现与使用对比5.2 使用条…...

【Linux】进程间通信——匿名管道

目录 为什么要进行进程间通信? 匿名管道的具体实现 pipe创建内存级文件形成管道 pipe的简单使用 匿名管道的四种情况和五种特性 四种情况 五种特性 PIPE_BUF 命令行管道 | 功能代码:创建进程池 为什么要进行进程间通信? 1.数据传输&…...

React Native与React Native Web:跨平台开发的新选择

React Native和React Native Web是两种基于React框架的跨平台开发技术,它们分别针对原生移动应用和Web应用的开发,但都提供了统一的开发体验和代码复用能力。 React Native 概述 React Native允许开发者使用React的组件化思想和JavaScript编写原生级别…...

【从零开始实现stm32无刷电机FOC】【理论】【3/6 位置、速度、电流控制】

目录 PID控制滤波单独位置控制单独速度控制单独电流控制位置-速度-电流串级控制 上一节,通过对SVPWM的推导,我们获得了控制电机转子任意受力的能力。本节,我们选用上节得到的转子dq轴解耦的SVPWM形式,对转子受力进行合理控制&…...

使用MySQLInstaller配置MySQL

操作步骤 1.配置High Availability 默认选项Standalone MySQL Server classic MySQL Replication 2.配置Type and Networking ◆端口默认启用TCP/P网络 ◆端口默认为3306 3.配置Account and Roles 设置root账户的密码、添加其他管理员 4.配置Windows Service ◆配置MySQL Serv…...

命令执行(RCE)面对各种过滤,骚姿势绕过总结

1、什么是RCE RCE又称远程代码执行漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。 2、RCE产生原因 服务器没有对执行命令的函数做严格的过滤,最终导致命令被执行。 3、命令执行函数 PHP代码执行函数…...

复杂的数仓项目,涵盖了从数据采集、处理、存储到可视化的整个流程

一个复杂的数仓项目,涵盖了从数据采集、处理、存储到可视化的整个流程。以下是对您提供信息的梳理和解释: 1. **项目架构**: - 包含实时流、离线流和配置流三条数据流。 - 数据源使用MySQL,开启binlog日志。 2. **数据采集…...

三相感应电机的建模仿真(3)基于ABC相坐标系Level2 S-Fun以及定子串不对称电抗起动过程仿真分析

1. 概述 2. 三相感应电动机状态方程式 3. 基于Level2 S-Function的仿真模型建立 4. 动态分析实例 5. 总结 6. 参考文献 1. 概述 三相感应电机自然坐标系下的数学模型是一组周期性变系数微分方程(其电感矩阵是转子位置角的函数,转子位置角随时间按正弦规律变化),将其用…...

了解Adam和RMSprop优化算法

优化算法是机器学习和深度学习模型训练中至关重要的部分。本文将详细介绍Adam(Adaptive Moment Estimation)和RMSprop(Root Mean Square Propagation)这两种常用的优化算法,包括它们的原理、公式和具体代码示例。 RMS…...

对于配置LLM,集显和独显的具体区别和影响

在配置大型语言模型(LLM)时,集成显卡(集显)和独立显卡(独显)之间的区别和影响主要体现在以下几个方面: 1. 性能差异 集成显卡(集显): 集显通常集…...

uniapp上架到appstore遇到的问题

1、appstore在美国审核,需要把服务器接口的国外访问权限放开 2、登陆部分 a、审核时只能有密码登陆,可以通过接口响应参数将其他登陆方式暂时隐藏,审核成功后放开即可 b、需要有账号注销功能 3、使用照相机和相册功能时需要写清楚描述文案...

每天10个vue面试题(一)

1. Vue的基本原理? 当一个Vue实例创建时,Vue会遍历data中的属性,用Object.defineProperty(vue3.0使用proxy )将它们转为 getter/setter,并且在内部追踪相关依赖,在属性被访问和修改时通知变化。…...

【博主推荐】HTML5好看的酷酷的个人简历、个人主页、个人网站源码

文章目录 1.设计来源1.1 主界面1.2 关于我界面1.3 我的项目界面1.4 我的经验界面1.5 我的技能界面1.6 我的文章界面1.7 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeig…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...