目录
propertyIsEnumerable(propertyName)
Object.defineProperty(属性所在的对象,属性的名字,一个描述符对象)
一、对象认识
对象是一个无序的集合
对象包括属性和方法
二、对象的增、删、改、查
增(改)
对象名.属性名 = 增加的值(修改的值)
删
delete 对象名.属性名 = 值
查(两种方式)
对象名.属性
对象名['属性']
三、对象遍历(推荐使用for...in)
const obj = {
name:'华',
age:18,
gender:'女'
}
for(let key in obj){
console.log(key,typeof(key));//name string, age string, gender string
}
for(let key in obj){
console.log(obj[key]);//华 18 女
}
四、对象类型的强制转换
1、转为Boolean
使用包装器函数Boolean()
2.将对象转为String类型
1.String(obj);
2.{}+""
3.{}.toString()
默认都调动toString() [object,Object]
如果重写了toString() 则调用重写toString()
3.将对象转为number类型
1.Number({})
2.+{}
3.parseInt()
4.parseFloat()
1.如果重写了toString() 则都会调用toString()
2.如果重写了valueOf() Number和+ 会调用valueOf
3.如果两者都重写 Number和+会调用valueOf parseInt parseFloat调用toString()
使用包装器函数oolean()、String()、Number()
let obj = {
name:'小华',
age:18,
toString(){
return this.name+this.age
}
}
console.log(Boolean(obj));//true
console.log(String(obj),typeof (String(obj)));//小华18 string
console.log(Number(obj),typeof (Number(obj)));//NaN number
五、检测对象属性是否自有或继承
in 检测属性是否自有属性或者继承属性
hasOwnProperty() 检测给定的属性是否是对象的自有属性,对于继承属性将返回false
propertyIsEnumerable() 除了是自身属性外,还要求是可枚举属性,即我们创建的属性
const obj = {
name:'小华',
age:18
}
console.log('name' in obj);//true
console.log('age' in obj);//true
console.log('toString' in obj);//true toString是继承属性,继承自Object
console.log(obj.hasOwnProperty('name'));//true
console.log(obj.hasOwnProperty('toString'));//false
console.log(obj.propertyIsEnumerable('name'));//true
console.log(obj.propertyIsEnumerable('age'));//true
console.log(obj.propertyIsEnumerable('toString'));//false
六、Object原型中常用方法
hasOwnProperty(propertyName)
检查给定的属性名是否是对象的自有属性
propertyIsEnumerable(propertyName)
检查给定的属性在当前对象实例中是否存在
valueOf()
返回对象的字符串,数值,布尔值的表示
toLocaleString()
用来返回格式化对象后字符串
eg:
let date = new Date()
console.log(date.toLocaleDateString('zh'));//2023/6/30
console.log(date.toLocaleDateString('en'));//6/30/2023
toString()
返回对象的字符串表示
isPrototypeOf(object)
检查传入的对象的原型
七、对象属性
ECMAScript中有两种属性:数据属性、访问器属性。这两种属性用于设置属性的高级属性,例如该属性是否可以配置,是否可以读写,是否可以遍历,并且可以通过setter,getter来监听数据的改变。
数据属性特性
[[Configurable]] 是否可配置
表示是否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性(属性直接定义在对象中,默认为true)。 当为false时,不能重新定义不能使用delete删除
[[Enumerable]] 是否可枚举
表示能否通过for-in循环返回属性。(属性直接定义在对象中,默认为true)
[[Writable]] 是否可写
表示能否修改属性的值。(属性直接定义在对象中,默认为true)
包含这个属性的数据值 name:jacky
[[Value]] 是否包含这个属性的数据值
Object.defineProperty(属性所在的对象,属性的名字,一个描述符对象)
修改属性默认特性
let dog = {
name:'幺幺',
age:3,
}
Object.defineProperty(dog,'name',{
configurable:true,
writable:true,
value:'汪汪'
});
console.log(dog)//{ name: '汪汪', age: 3 }
console.log(Object.getOwnPropertyDescriptors(dog));
//{
// name: { value: '汪汪', writable: true, enumerable: true, configurable: true },
//},
// age: { value: 3, writable: true, enumerable: true, configurable: true }
//}