Object.is()
静态方法,用于确定两个值是否相同。
语法:
Object.is(value1,value2)
如果以下其中一项成立,则两个值相同:
- 都是 undefined
- 都是 null
- 都是
true
或者都是false
- 都是长度相同、字符相同、顺序相同的字符串
- 都是相同的对象(意味着两个值都引用了内存中的同一对象)
- 都是 BigInt 且具有相同的数值
- 都是 symbol 且引用相同的 symbol 值
- 都是数字且
示例:
Object.is('1',1) //false
Object.is(-0,0) //false
Object.is(null,null) //true
Object.is(NaN,NaN) //true
Object.is(undefined,undefined) //true
Object.is('1',1) //false
const obj = {}
Object.is(obj,{}) //false
Object.assign()
方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
语法:
Object.assign(target,obj1,obj2,obj3,...)
第一个参数是目标对象,后面的参数都是源对象。
示例:
Object.assign(obj) //如果只有一个参数,那就会返回这个参数
Object.assign(2) //如果只有一个参数,且不是对象,那会转为对象再返回
Object.assign(null) //如果只有一个参数,为null,就会报错
Object.assign(undefined) //如果只有一个参数,为undefined,就会报错
//只要非对象形式不放在第一个参数,都不会报错,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果
const target = { a: 1, b: 1 };
const source1 = { b: 2, c: 2 };
const source2 = { c: 3 };
Object.assign(target, source1, source2);
target // {a:1, b:2, c:3}
//如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
Object.create()
以一个现有对象为原型,创建一个新的对象。
语法:
Object.create(proto)
Object.create(proto, propertiesObject)
第一个参数表示创建对象的原型,表示要继承的对象,第二个参数可选的,用于对新创建的对象进行初始化。
Object.create(null) 创建的对象是一个空对象,在该对象上没有继承 Object.prototype原型链上的属性或者方法。
示例:
//创建一个Obj对象
var Obj ={
name:'mini',
age:3,
show:function () {
console.log(this.name +" is " +this.age);
}
}
//MyObj 继承obj, prototype指向Obj
var MyObj = Object.create(Obj,{
like:{
value:"fish", // 初始化赋值
writable:true, // 是否是可改写的
configurable:true, // 是否能够删除,是否能够被修改
enumerable:true //是否可以用for in 进行枚举
},
hate:{
configurable:true,
get:function () { console.log(111); return "mouse" },
// get对象hate属性时触发的方法
set:function (value) {
// set对象hate属性时触发的方法
console.log(value,2222);
return value;
}
}
});
Object.defineProperty()
在一个对象上定义一个新的属性,或者修改一个已存在的属性,并返回该对象。
语法:
Object.defineproperty(obj, prop, desc)
//obj : 第一个参数就是要在哪个对象身上添加或者修改属性
//prop : 第二个参数就是添加或修改的属性名
//desc : 配置项,一般是一个对象
示例:
let person = {
name:"码农",
age: 18
}
Object.defineProperty(person,'sex',{
value:"男"
})
console.log(person)
同样第三个参数里面也有很多参数:
writable:是否可重写
value:当前值
get:读取时内部调用的函数
set:写入时内部调用的函数
enumerable:是否可以遍历
configurable:是否可再次修改配置项
Object.defineProperties()
在一个对象上定义多个新的属性,或者修改多个已存在的属性,并返回该对象。
语法:
Object.defineProperties(obj, props)
- obj:在其上定义或修改属性的对象。
- props:要定义其可枚举属性或修改的属性描述符的对象。对象中存在的属性描述符主要有两种:数据描述符和访问器描述符(更多详情,请参阅Object.defineProperty())。描述符具有以下键:
- configurable:true 当且仅当该属性描述符的类型可以被改变并且该属性可以从对应对象中删除。默认为 false
- enumerable:true 当且仅当在枚举相应对象上的属性时该属性显现。默认为 false
- value:与属性关联的值。可以是任何有效的JavaScript值(数字,对象,函数等)。默认为 undefined.
- writable:true当且仅当与该属性相关联的值可以用assignment operator改变时。默认为 false
- get:作为该属性的 getter 函数,如果没有 getter 则为undefined。函数返回值将被用作属性的值。默认为 undefined
- set:作为属性的 setter 函数,如果没有 setter 则为undefined。函数将仅接受参数赋值给该属性的新值。默认为 undefined
示例:
var person = {}
Object.defineProperties(person, {
name: {
value: 'Jake',
configurable: true
},
age: {
get: function() {
return this.value || 22
},
set: function(value) {
this.value = value
}
}
})
person.name // Jake
person.age // 22
Object.entries()
返回一个二维数组,数组的每一个元素是对象的自有的可枚举属性的键值对,但不包括Symbol值的属性。
语法:
Object.entries(obj)
参数obj:要返回其可枚举属性的键值对的对象。
示例:
Object.entries({ one: 1, two: 2 }) //[['one', 1], ['two', 2]]
Object.entries([1, 2]) //[['0', 1], ['1', 2]]
//传入非对象的参数可以强制转换为对象
var str = 'abcde';
Object.entries(str); // [["0", 'a'], ["1", 'b'], ["2", 'c'], ["3", 'd'], ["4", 'e']]
//如果对象的key值是数字,则返回值会对key值进行排序,返回的是排序后的结果
Object.entries({ 3: 'a', 4: 'b', 1: 'c' }) //[['1', 'c'], ['3', 'a'], ['4', 'b']]
Object.freeze()
可以冻结一个对象,让对象不能修改不能删除属性,不会对深层次的对象进行冻结。
示例:
obj1={
a:1,
obj2:{
b:2,
c:3
}
}
obj1.obj2.b = 22 //结果为22,深层次没有冻结可以修改
要深度冻结要进行递归冻结。
Object.getOwnPropertyDescriptor()
返回目标对象中所有属性的属性描述符,该属性必须是对象自己定义的,不能是从原型链继承来的。
语法:
Object.getOwnPropertyDescriptors(obj,property)
//obj:返回的目标对象
//property:返回指定的属性
示例:
let obj = {
id: 1,
name: 'test',
get gender() {
console.log('gender')
},
set grade(g) {
console.log(g)
}
}
Object.getOwnPropertyDescriptors(obj)
//输出结果为:
{
gender: {
configurable: true,
enumerable: true,
get: f gender(),
set: undefined
},
grade: {
configurable: true,
enumerable: true,
get: undefined,
set: f grade(g)
},
id: {
configurable: true,
enumerable: true,
value: 1,
writable: true
},
name: {
configurable: true,
enumerable: true,
value: 'test',
writable: true
}
}
let obj = {
id: 1,
name: 'test',
get gender() {
console.log('gender')
},
set grade(g) {
console.log(g)
}
}
Object.getOwnPropertyDescriptors(obj, 'id')
//输出结果为:
{
id: {
configurable: true,
enumerable: true,
value: 1,
writable: true
}
}
Object.getOwnPropertyNames()
返回一个数组,成员是参数对象自身的全部属性的属性名,不管该属性是否可遍历。
语法:
Object.getOwnPropertyNames(obj)
示例:
const object1 = {
a: 1,
b: 2,
c: 3,
};
console.log(Object.getOwnPropertyNames(object1));
//["a", "b", "c"]
Object.getOwnPropertySymbols()
返回一个包含给定对象所有自有 Symbol 属性的数组。(Symbol表示独一无二的值)
语法:
Object.getOwnPropertySymbols(obj)
示例:
const object1 = {};
const a = Symbol('a');
const b = Symbol.for('b');
object1[a] = 'localSymbol';
object1[b] = 'globalSymbol';
const objectSymbols = Object.getOwnPropertySymbols(object1);
console.log(objectSymbols.length) //2
Object.getPrototypeOf()
获取指定对象的原型对象(也就是__protp__的指向
语法:
Object.getPrototypeOf(obj)
示例:
function Obj() {
this.name = 'ViavaCos';
}
Obj.prototype.fullName = '尼古拉斯·赵四';
var obj = new Obj();
console.log( obj.__proto__.fullName ); // 尼古拉斯·赵四
console.log(Object.getPrototypeOf(obj) === obj.__proto__ ); // true 说明地址一致
Object.isExtensible()
判断一个对象是否是可拓展的。返回布尔值。
语法:
Object.isExtensible(obj)
在ES6中,参数如果是非对象类型,则被认为是不可拓展的。对象一般是可以拓展的,即可以添加新的属性和方法。
使用Object.preventExtensions()、Object.seal()和Object.freeze()方法都可以标记对象为不可扩展。
示例:
var obj = {};
Object.isExtensible(obj); // true
Object.preventExtensions(obj);
Object.isExtensible(obj); // false
var obj2 = Object.create(obj);
Object.isExtensible(obj2); // true 原型对象不可扩展,不会影响继承对象
var obj3 = Object.seal({});
Object.isExtensible(obj3); // false
var obj4 = Object.freeze({});
Object.isExtensible(obj4); // false
Object.isFrozen()
检查对象是否被冻结。
Object.isSealed()
检查对象是否被密封。密封对象是指那些不可扩展
的,且所有自身属性都不可配置且因此不可删除(但不一定是不可写)的对象。
示例:
var empty = {};
Object.isSealed(empty); // === false
Object.preventExtensions(empty);
Object.isSealed(empty); // === true
var hasProp = { fee: 'fie foe fum' };
Object.defineProperty(hasProp, 'fee', {
configurable: false
});
Object.isSealed(hasProp); // === true
Object.keys()
要返回其枚举自身属性的对象。返回一个指定对象可枚举属性的字符串数组。
示例:
//处理对象,返回可枚举的属性数组
let person = {name:"张三",age:25,address:"深圳",getName:function(){}}
Object.keys(person) // ["name", "age", "address","getName"]
//处理数组,返回索引值数组
let arr = [1,2,3,4,5,6]
Object.keys(arr) // ["0", "1", "2", "3", "4", "5"]
//处理字符串,返回索引值数组
let str = "12345字符串"
Object.keys(str) // ["0", "1", "2", "3", "4", "5", "6", "7"]
//常用
let person = {name:"张三",age:25,address:"深圳",getName:function(){}}
Object.keys(person).map((key)=>{
person[key] // 获取到属性对应的值,做一些处理
})
Object.values()
Object.values()和Object.keys()是相反的操作,把一个对象的值转换为数组
Object.values方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历( enumerable )属性的键值。
Object.keys方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历( enumerable )属性的键值对数组。
示例:
var obj1 = {name: '光头强', age: '18', height: '177'}
const list1 = Object.values(obj1);
console.log(list1) // 得到: ['光头强', '18', '177']
Object.preventExtensions()
让一个对象变的不可扩展,也就是永远不能再添加新的属性。返回已经不可拓展的对象。
Object.seal()
密封一个对象,即将对象设置为不可扩展。返回被密封的对象。但可以修改已有属性。
Object.setPrototypeOf()
为现有对象设置原型,返回一个新对象。
语法:
Object.setPrototypeOf(nowObj,prototypeObj)
第一个参数是现有的对象,第二个是原型对象。
就是更换对象的原型。
Object.hasOwn()、Object.hasOwnProperty()
Object.hasOwn():如果指定的对象自身有指定的属性,则静态方法 Object.hasOwn() 返回 true。如果属性是继承的或者不存在,该方法返回 false。
语法:
Object.hasOwn(obj, prop)
-
obj
要测试的JavaScript 实例对象 -
prop
要测试属性的String类型的名称或者Symbol
Object.hasOwnProperty():方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性。
建议使用Object.hasOwn()。
拓展:in运算符:如果指定的属性在指定的对象或其原型链中,则in
运算符返回true。
const car = { make: 'Honda', model: 'Accord', year: 1998 };
console.log('make' in car); //true