对象包装类
# 对象包装类
# 对象的创建方法
- 1、 对象字面量 var obj = {};
- 2、 构造函数
- 系统自带的构造函数 Object
- 自定义(构造函数)
# 检查属性是否存在对象中
# in
可以使用in
操作符来检测属性是否存在于对象中。
格式为:prop in object
注意:如果属性是目标对象原型链中得属性,则也判定为存在于目标对象中。
var obj = {abc:1}
Object.setPrototypeOf(obj,{name:'zhang san'})
console.log('name' in obj) // true
# hasOwnProperty
hasOwnProperty
方法用来判断属性是否是目标对象的自身属性。
自身属性即为不包含对象原型链上的属性。
var obj = {name:'lucas'}
Object.setPrototypeOf(obj,{age:11})
obj.hasOwnProperty('name') // true
obj.hasOwnPerperty('age') // false
# propertyIsEnumerable
propertyIsEnumerable
方法同 hasOwnProperty
相同,但是更高级。propertyIsEnumerable
是判断是否为目标对象的可枚举属性
var obj = { name: 'zhang san' }
Object.defineProperty(obj, 'age', {
value: 11,
enumerable: false,
writable: true,
configurable: true
})
Object.propertyIsEnumerable('name') // true
Object.propertyIsEnumerable('age') // false
# 对象序列化
对象序列化是指将对象的状态转换为字符串,也可以反序列化,即将字符串转回成对象。
JSON.stringify
只能将对象中可枚举的自有属性序列化
var obj = { name: 'zhang san' }
Object.defineProperty(obj, 'age', {
value: 11,
enumerable: false,
writable: true,
configurable: true
})
Object.setPrototypeOf(obj, { hobbies: 'football' })
let obj_str = JSON.stringify(obj) // object -> string 序列化
let new_obj = JSON.parse(obj_str); // string -> object 反序列化
console.log(obj_str); // { name: 'zhang san' }
如果使用JSON.stringify 函数来将对象序列化为字符串,对象中如果包含函数,将会被舍弃
JSON.stringify 与 JSON.parse 的规则
- JSON 不支持 undefined。
- 不支持函数
- 除了 RegExp、Error对象 ,JSON 支持除这两个外其他的对象。
- JSON.stringify 只能序列化可枚举的属性。
- NaN、Infinity、-Infinity 序列化后的结果为 null。
- 日期对象序列化的结果是ISO格式的字符串,但JSON.parse()依然保留它们字符串形态,并不会为其还原为日期对象
# 包装类
如 String、 Number、 Boolean。
let s = new String(‘abc’);
let n = new Number(12);
let b = new Boolean(true);
typeof s|n|b // 结果都是 object
包装类能够通过一些运算操作变回普通数据:
let s = new String(‘abc’);
s += 1;
// s -> abc1 变回字符串了 ,同理也发生在其他包装类上
假设有字符串 s ,然后我们为 s 添加属性 test 不会报错,但是也并没有什么作用。
let s = ‘abc’;
s.test = ‘bcd’; // undefined
原理是:当我们为字符串添加属性的时候内部会将字符串转为包装类,然后再删除这个属性
let s = ‘abc’
s.test = ‘bcd’;
// 相当于 new String(s).test = ‘bcd’; delete xxx;
charCodeAt(str) 返回 str 对应的 unicode 码值 小于等于 255 为 英文字母 大于255 为汉字