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连接
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝Ὁ…...
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…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
k8s从入门到放弃之Pod的容器探针检测
k8s从入门到放弃之Pod的容器探针检测 在Kubernetes(简称K8s)中,容器探测是指kubelet对容器执行定期诊断的过程,以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...
20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题
20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题 2025/6/9 20:54 缘起,为了跨网段推流,千辛万苦配置好了网络参数。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在调试串口/DEBUG口正确执行。…...
Shell 解释器 bash 和 dash 区别
bash 和 dash 都是 Unix/Linux 系统中的 Shell 解释器,但它们在功能、语法和性能上有显著区别。以下是它们的详细对比: 1. 基本区别 特性bash (Bourne-Again SHell)dash (Debian Almquist SHell)来源G…...
Ubuntu 安装 Mysql 数据库
首先更新apt-get工具,执行命令如下: apt-get upgrade安装Mysql,执行如下命令: apt-get install mysql-server 开启Mysql 服务,执行命令如下: service mysql start并确认是否成功开启mysql,执行命令如下&am…...
