当前位置: 首页 > 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…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

蓝桥杯 冶炼金属

原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...

LangFlow技术架构分析

🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...

门静脉高压——表现

一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...

嵌入式面试常问问题

以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...