添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Javascript 对象的基本用法(五)

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'