1.Object显示类型转换(强制类型转换)
Boolean(value)
把给定的值转换成Boolean型;
String(value)
把给定的值转换成字符串。
Number(value)
把给定的值转换成数字(可以是整数或浮点数);
2.检测属性
in
检测某属性是否是某对象的自有属性或者是继承属性
var obj = {
name: 'zhangsan',
age: 18,
school: 'xx大学'
}
//in运算符的左侧为属性名称,右侧为对象
console.log('name' in obj); //true
console.log('age' in obj); //true
console.log('gender' in obj); //false
//如果用in判断一个属性存在,这个属性不一定是obj的,它可能是obj继承得到的,如:
'toString' in obj; // true
因为toString定义在object对象中,而所有对象最终都会在原型链上指向object,所以obj也拥有toString属性。
Object.prototype.hasOwnProperty()
检测给定的属性是否是对象的自有属性,对于继承属性将返回false
var obj = {
name: 'zhangsan',
age: 18,
school: 'xx大学'
}
console.log(obj.hasOwnProperty('name')); //true
console.log(obj.hasOwnProperty('age')); //true
console.log(obj.hasOwnProperty('toString')); //false,toString为继承属性
console.log(obj.hasOwnProperty('gender')); //false
Object.prototype.propertyIsEnumerable()
propertyIsEnumerable()是hasOwnProperty()的增强版,除了是自身属性外,还要求是可枚举属性,即我们创建的属性。
3.Object原型属性及方法(原型方法,实例可以调用的方法)
在Object的构造函数的原型对象中的属性和方法都可以被Object构造函数的实例所继承。
Object原型中的所具有的任何属性和方法也同样存在于其他对象中,任何对象继承自Object。
4.深入理解对象-定义属性
(1)数据属性特性
Object.defineProperty()
Object.defineProperty(obj,'name',{
configurable:true, //是否可修删除
enumerable:true, //是否可以通过for循环遍历
writable:true, //是否可修改
value:'terry' //初
})
console.log(obj.name);
Object.defineProperty(obj,"name",{enumerable:false})
obj.propertyIsEnumerable("name");//false
Object.defineProperties()
var obj = new Object();
Object.defineProperties(obj, {
name: {
value: 'zhangsan',
configurable: false,
writable: true,
enumerable: true
},
age: {
value: 18,
configurable: true
}
})
console.log(obj.name, obj.age) // zhangsan, 18
(2)读取属性的特性
Object.getOwnPropertyDescriptor()
var person = {
name: '张三',
age: 18
}var desc = Object.getOwnPropertyDescriptor(person, 'name');
console.log(desc) 结果如下
// {
// configurable: true,
// enumerable: true,
// writable: true,
// value: "张三"
// }
(3)访问器属性特性
访问器属性:这个属性不包含数据值,包含的是一对get和set方法,在读写访问器属性时,就是通过这两个方法来进行操作处理的。
访问器属性包含的四个特性:
[[Configurable]]
表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性, 默认为false
[[Enumerable]]
表示能否通过for-in循环返回属性,默认为false
[[Get]]
在读取属性时调用的函数,默认值为undefined
[[Set]]
在写入属性时调用的函数,默认值为undefined
这里要注意下,访问器属性不能直接定义,要通过Object.defineProperty()这个方法来定义。
/**
* 访问器属性:访问器属性不包含数值,它包含的是一对getter和setter函数;
* 访问器属性不能像数据属性一样直接定义,它必须使用Object.defineProperty()方法来定义
*/
var book = {
_year: 2020, //下划线表示是内部属性,只能通过对象的方法来读写
editor: 1
};
Object.defineProperty(book, 'year', {
get: function () {
return this._year;
},
// 若只指定get方法,不指定set方法,那就默认该属性是只读的
set: function (newYear) {
if (newYear !== this._year) {
this._year = newYear
this.editor ++
}
}
});
// 测试访问属性中的get,set方法
console.log('未修改的year:' + book.year); //未修改的year:2020
book.year = 2021;
console.log('修改后的year:' + book.year); //修改后的year:2021
console.log('修改year后的editor:' + book.editor); //修改year后的editor:2
console.log(Object.getOwnPropertyDescriptor(book, '_year'));//{ value: 2021, writable: true, enumerable: true, configurable: true }
5.序列化和反序列化