对象
⽆序属性的集合,其属性可以包含基本值,对象,或者函数。可以将对象想象成散列表:键值对,其中值可是数据或者函数。ECMAScript中的对象其实就是⼀组数据(属性)和功能(⽅法)的集合
对象的创建
对象的初始化有两种⽅式,构造函数模式和字⾯量模式、
字面量模式
var obj = {
name:"terry",
age:12,
sayName:function(){
console.log("my name is ",this.name);
}
}
构造函数模式
var obj = new Object();
obj.name = "terry";
obj.age = 12;
obj.sayName = function(){
console.log("my name is",this.name);
}
//等价于 <==>
var obj={};
obj.name="terry";
obj.age=12;
对象的访问:
属性:obj.name或obj[‘name’]
方法:obj.sayName();
遍历数组和对象
for …in循环
在数组中:for(k in arr) k为数组的键,值的为arr[k]
在对象中:for(k in obj) k为对象的属性名,属性值为obj[k]
for(⾃定义变量名 in 数组/对象){
执⾏代码
}
for(var key in obj){
var value=obj[key];
}
新增删除对象中的属性
只能删除对象的⾃有属性(原有属性可以重写)
delete.obj.getName
新增属性:obj.newpropname=“value”
Object显示类型转换(强制类型转换)
ECMAScript中可⽤的3种强制类型转换
1.Boolean(value)
把给定的值转换成Boolean型;
2.String(value)
把给定的值转换成字符串。
3.Number(value)
把给定的值转换成数字(可以是整数或浮点数)
valueOf和toString
valueOf设置对象的原始值,通常由 JavaScript 在后台自动调用,并不显式出现在代码中。
如果重写了valueOf和toString方法,在涉及到运算时,会优先调用valueOf方法,涉及到显示时,会优先调用toString方法
如果只重写了valueOf()或者toString()方法,则调用该方法,并将返回值用Number()转换。
对象检测属性
in 检测某属性是否是某对象的自有属性或者是继承属性
Object.prototype.hasOwnProperty()检测给定的属性是否是对象的自有属性,对于继承属性将返回false
Object.prototype.propertyIsEnumerable() 检测给定的属性是否是该对象的自有属性,并且该属性是可枚举的返回true,其他返回false。通常由JS代码创建的属性都是可枚举的,但是可以使用特殊的方法改变可枚举性
Object原型属性及⽅法
方法:
constructor:保存⽤户创建当前对象的函数,与原型对象对应的构造函数
hasOwnProperty(propertyName):检查给定的属性名是否是对象的⾃有属性
propertyIsEnumerable(propertyName):检查给定的属性在当前对象实例中是否存在
valueOf():返回对象的字符串,数值,布尔值的表示
toLocaleString():返回对象的字符串表示,该字符串与执⾏环境的地区对应
toString():返回对象的字符串表示
isPrototypeOf(object):检查传⼊的对象的原型
如何为对象的属性进行描述
Object.defineProperty(obj,'sex',{
configurable:false,//是否可以被删除
enumerable:false,//是否可以枚举
writable:false,//是否可以被修改
value:'男'//值
})
//查看对象的某个属性的特性
var res = Object.getOwnPropertyDescriptor(obj,'num');
//一次设置多个
var book = {};
Object.defineProperties(book,{
_year :{//数据属性
value:1001},
edition :{//数据属性
value:1},
}
)
构造器属性
可以自定义属性的set和get方法
对象序列化
JSON.stringify(obj):将对象序列化为Json字符串,只能序列化对象可枚举的自有属性
JSON.parse(jsonStr) :反序列化