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

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

vulnyx Blogger writeup

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

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...