Javascript 对象的基本用法(五)
本文将介绍的Javascriptde唯一的复杂数据类型:对象。
什么是对象?
对象是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
var obj = {
name:'ak',
age:18
声明了一个名为obj的对象,对象中包含name,age两组键值对,键值对之间使用逗号隔开。
对象的两种创建方式
1.使用new关键字
var obj = new Object({name:'ak'})
2.简洁语法
var obj = {name:'ak'}
键名
var obj ={name:'ak'}
name就是对象中键值对的键名。
对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),JS会自动把键名转为字符串,所以加不加引号都可以。
如果键名为纯数字,纯英文,纯汉字不需要加引号也可以,如果是混合写法或者键名中包含空格及运算符那就必须加上引号。
如果键名是由科学计数法或者含有进制标识符的数值,那么JS会自动进行转换计算,通通转为十进制数值再显示。
如果键名中包含以(.)开头的数值,如(.304)那么JS会自动在数值前补0,转为(0.304)。
对象的每一个键名又称为属性名,键值又称为属性值,属性值可以是任何数据类型,如果一个属性的值为函数,通常把这个属性称为“方法”,并且可以调用。
链式引用:把对象x赋值到对象y的属性上,这样就可以通过y的属性指向对象x了。
动态创建:对象可以创建时不给任何属性,之后通过赋值的方法再为对象添加属性。
var obj ={}
obj.name = 'ak';
对象的引用
把对象X赋值到变量Y,此时 它们都指向同一个内存地址 。修改其中一个时,另一个的值也会变。
var o1 = {};
var o2 = o1;
o1.a = 1;
o2.a // 1
o2.b = 2;
o1.b // 2
上面代码中,
o1
和
o2
指向同一个对象,因此为其中任何一个变量添加属性,另一个变量都可以读写该属性。
此时,如果取消某一个变量对于原对象的引用,不会影响到另一个变量。
var o1 = {};
var o2 = o1;
o1 = 1;
o2 // {}
上面代码中,
o1
和
o2
指向同一个对象,然后
o1
的值变为1,这时不会对
o2
产生影响,
o2
还是指向原来的那个对象。
但是,这种引用只局限于对象,如果两个变量指向同一个原始类型的值。那么,变量这时都是值的拷贝。
var x = 1;
var y = x;
x = 2;
y // 1
上面的代码中,当
x
的值发生变化后,
y
的值并不变,这就表示
y
和
x
并不是指向同一个内存地址
。
查看对象属性
在浏览器控制台打印对象的所有键值对
console.log(obj);
只打印对象的键名
console.log(Object.keys(obj));
只打印对象的键值
console.log(Object.values(obj));
以目录的形式打印对象
console.dir(obj)
查询对象是否含有某属性
查询范围包括自身与原型链。
'属性名' in 对象名
console.log('age' in obj);
如果属性存在返回true。
查询对象的属性是否为自身属性
对象名.hasOwnProperty('属性名')
console.log(obj.hasOwnProperty('age'));
满足条件返回true。
读取属性值(键值)
对象名.属性名
console.log(obj.age);
对象名['属性名']
console.log(obj['age']);
推荐使用方括号法。因为如果一个属性的名字为(.233),那么使用第一种方法就会出现BUG,因为JS无法判断.是语法还是小数点。
注意:方括号内的属性名必须使用单引号括起来,不然JS会以为这个值是变量名。
删除属性(键值对)
delete 对象名.属性名
console.log(delete obj.age);
delete 对象名['属性名']
console.log(delete obj['age']);
注意:删除语句只要其本身可以执行成功就会返回true,不管对象内有没有要删除的属性。
添加或修改对象属性(键值对)
此语句有双重语义,对象内没有对应属性时为对象创建属性,有对应属性时则覆盖该属性。
obj.Gender='man'
obj['Gender'] = 'man'
obj['Gen' + 'der'] = 'man'
推荐使用方括号法。也可以添加一个值为null的空属性。
使用变量的值作为对象的键名
var key = hobby;
obj[key] = 'love you'
1.声明一个名为key的变量,值为hobby。
2.为obj对象引入变量key,并且使用它的值作为键名。
3.赋值字符串'love you'
批量修改或添加多个属性
同时给一个对象添加或修改多个属性。
Object.assing( obj , { age : 18 , gender: 'name' } )
遍历对象属性: for...in 循环
for (var i in obj) {
console.log('键名:', i);
console.log('键值:', obj[i]);
for...in
循环有两个使用注意点。
- 它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性。
- 它不仅遍历对象自身的属性,还遍历继承的属性。
比如对象中的原型属性toString,就不会遍历出来。
如果遍历的对象有继承关系,可以使用配合使用 hasownproperty()函数,如果是唯一属性打印不是则不打印。
var person = { name: 'ak' };
for (var key in person) {
if (person.hasOwnProperty(key)) {
console.log(key);
对象的原型(Prototype)
也就是对象的原始类型,每个我们手动创建的对象都有一个原型,这个原型的本质也是一个对象,里边含有默认属性。
[[Prototype]]
这些默认属性为对象提供一些最基本的功能。
修改当前对象的原型属性
obj.toString = 'aaa'
obj2 = {}
obj的toString为'aaa',obj2 = {}的toString 不变。 此方法只能修改当前对象的原型属性。
修改所有对象的原型属性
修改共有原型下的属性,但是不推荐这一方式。
obj.__proto__.toString = 'aaa'
不经过某一个对象,直接修改原型的属性。
window.Object.prototype.toString = 'aaa'