一、初识对象
JavaScript是面向对象编程(Object Oriented Programming,OOP)语言。
面对象是一种复合值:它将很多值集合在一起,可通过名字访问这些值。对象也可看做一种无序的数据集合,由若干个“键值对”(key-value)构成。
对象是一个容器,封装了“属性”(property)和“方法”(method)。
属性,就是对象的状态,而方法,就是对象的行为。
比如:我们可以把一辆汽车抽象成一个对象,它的属性就是它的颜色、重量等,而方法就是它可以启动、停止等。
二、创建对象
1.json模式创建对象,使用对象字面量创建对象
//对象定义的规则:
//将左花括号与类名放在同一行。
//冒号与属性值间有个空格。
//字符串使用双引号,数字不需要引号。
//最后一个属性-值对后面不要添加逗号。
//注意:对象直接量中的最后一个属性后的逗号可有可无,但是在ie中,如果多了一个逗号,会报错
//将右花括号独立放在一行,并以分号作为结束符号
var a={name: ”小米”,age: ”22”};
在ECMAScript 5中,保留字可以用做不带引号的属性名。
2.直接实例化方式
//使用new关键字实例化对象
//使用typeof检查一个对象时,会返回object
Var a=new Object();
3.Object.create()函数创建。
Var a=object.create(null);
(其它创建对象方式:工厂模式创建对象,原型模式创建对象,组合模式创建对象)
键名:
- 键名:对象的所有键名都是字符串,所以加不加引号都可以。如果键名是数值,会被自动转为字符串。
- 属性名可以是包含空字符串在内的任意字符串,但对象中不能存在两个同名的属性。
- 对象属性名不强制要求遵守标识符的规范,(obj.var=’hello’;)什么乱七八糟的名字都能用,但还是建议按规范做
函数也可以作为对象属性,如果一个函数作为对象的属性,我们可以说这个函数是这个对象的方法,调用函数可以说调用对象的方法
键值:
- 对象的每一个“键名”又称为“属性”(property),它的“键值”可以是任何数据类型。
- 对象的属性值,可以是任意数据类型,甚至可以是一个对象
- 如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用。
如果键名不符合标识名的条件(比如第一个字符为数字,或者含有空格或运算符),也不是数字,则必须加上引号。否则会报错
三、对象属性的操作
1.访问对象属性
在JavaScript中,我们可以通过点(.)或方括号([])运算符来获取属性的值。
语法:对象.属性名
// 1、访问对象属性 . []
console.log(obj.name)
// 我们通过people2 里面的say方法调用了函数abc
console.log(people2.say());
console.log(people2["sex"]);
console.log(obj[1]);
console.log(obj);
注意:数值键名(特殊属性名)不能使用点运算符(因为会被当成小数点),只能使用方括号运算符。
JavaScript对象是动态的,可新增属性也可删除属性。但注意,我们是通过引用而非值来操作对象
2.对象添加属性
语法:对象.属性名=新增值;
3.对象属性修改
语法:对象.属性名=新值;
4.对象属性删除
语法:delete 对象.属性名;
delete people2.name;
console.log(people2); // 4、对象属性的删除 delete 对象.属性名;
delete people2.name;
console.log(people2);
注意:delete运算符只能删除自有属性,不能删除继承属性。
删除一个不存在的属性,delete不报错,而且返回true。
只有一种情况,delete命令会返回false,那就是该属性存在,且不得删除。
5.检测属性是否是该对象的属性
在JavaScript中,有多种方法检测某个属性是否存在于某个对象中。
1》In运算in运算符左侧是属性名(字符串),右侧是对象。如果对象的自有属性或继承属性中包含这个属性就返回true。
Var o={name:’张全旦’}
Console.log(‘name’in o); //true
2》hasOwnPreperty()方法
Console.log(o.hasOwnPreperty(‘name’)); //true
3》propertyIsEnumerable()方法
Console.log(o.propertyIsEnumerable(‘name’)); //true
6.查看所有属性
查看一个对象本身的所有属性,可以使用Object.keys方法,返回一个数组。
Console.log(Object.keys(o)); //[name]
四、内存问题
Js中的变量都是保存在栈内存中存储,值与值之间都是相互独立的修改某个变量不会影响到之前复制过他的变量;
Js中的对象是保存在堆内存中的,每创建一个新的对象就会在堆内存中开辟内存空间,而变量保存的是内存地址(对象的引用),当通过一个变量修改内部属性时,复制或者引用的变量也会被影响。
-
深拷贝和浅拷贝:
浅拷贝:对于引用类型而言,之两个引用类型指向同一个地址,改变一个另一个也会随之改变
深拷贝:对于引用类型而言,复制后引用类型指向一个新的内存地址,两个对象改变相互不影响
五、遍历对象
-
for...in循环用来遍历一个对象的全部属性
Var o={
name:’王二狗’,
age:20,
gender:’男’}
//for...in 遍历拿到的是对象的索引(键名)
for(var i in o){
Console.log(o[i]);
}
六、序列化对象
对象序列化是指将对象的状态转换为字符串,也可将字符串还原为对象。
在JavaScript中,提供了内置函数JSON.stringify()和JSON.parse()用来序列化和还原JavaScript对象。
NaN、Infinity和-Infinity序列化的结果是null
注意:JSON.stringify()只能序列化对象可枚举的自有属性。对于一个不能序列化的属性来说,在序列化后的输出字符串中会将这个属性省略掉。