欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

林大妈的JavaScript基础知识(三):JavaScript编程(1)对象

程序员文章站 2022-04-12 11:33:28
1. 对象的简单介绍与一些注意事项 JavaScript中具有几个简单数据类型:数字、字符串、布尔值、null值以及undefined值。除此之外其余所有值(包括数组、函数,甚至正则表达式)都是对象。数字、字符串以及布尔值表面是对象(因为他们具有方法),但它们是不可变的,只是JavaScript在引 ......

1. 对象的简单介绍与一些注意事项

  javascript中具有几个简单数据类型:数字、字符串、布尔值、null值以及undefined值。除此之外其余所有值(包括数组、函数,甚至正则表达式)都是对象。数字、字符串以及布尔值表面是对象(因为他们具有方法),但它们是不可变的,只是javascript在引用某个数字、字符串或者布尔值时,通过调用new number()、new string()和new boolean()构造器将其转换为了数字、字符串或布尔对象,它自有的方法也是从原型中继承而得到。基本数据类型不可以被改变,因此在没有指针再指向它时,它在内存中占用的资源自动被释放,对象却永远以引用的方式传递,改变对象中的值,也就改变了它在内存中的值。

  注:理论上说,null值就是null值,不应该被检测为对象,但实际上,由于javascript的设计失误,typeof null === "object"是一个事实。

因此在检验null值时,尽量要使用其他方法如:!null === true。例如,要检测一个刚获取的dom对象是否正常获取到了,我们应该使用如下的代码:

1 var element = document.getelementbyid("elementid");
2 if(element){}
3 // 或者if(!element){}

而不要使用:

1 var element = document.getelementbyid("elementid");
2 if(typeof element !== "object") {}
3 // 或者if(typeof element === "object") {}

  上面说到,因为typeof null === "object",这样下面这段代码中,即使element获取不正常(即值为null)时,if语句也会按照获取正常的结果办事。

 

2. 对象的属性

  对象存在的意义就是它可以有许多的属性和方法帮助我们表达逻辑。对象的属性可以为任意的值,可以是数字、字符串、布尔值、null值,也可以是对象或者是函数(当然函数本质上也是对象)。输出一个属性,如果它已经被定义,但是一个null值,就会对应输出null,如果它甚至还未被定义,就会对应输出undefined。

  我们先用字面量定义一个对象,方便后面的测试:

1 var game = {
2     name: "mini warior",
3     id: 201907271234,
4     qualification: {
5         type: "test"
6     }
7 }

 

  我们对对象属性的操作一般来说就是curd,最常用的就是修改更新和检索取值。

  修改更新一个对象的属性,我们可以直接使用赋值语句。而一般检索并获取对象的属性,有两种方法:第一种,因为更紧凑可读性更强而最为常用的一种: var gamename = game.name; 我们称为(这里有个点↘). 表示法;第二种,就像获取数组对应下标的值一样: var gamename = game["name"]; 。检索获取属性值时,我们也要考虑到属性不存在的情况,这时候我们可以巧用运算符填充默认值: var gamename = game.name || "mini warior"; 。这时候如果game.name获取为null值或undefined值,gamename也会被赋值为你所希望的初始值,而不会影响接下来代码的运行。如果我们尝试从undefined的属性中取值,例如 var gamequaliplayer = game.qualification.player; ,javascript将会抛出一个“typeerror”的错误,我们也可以巧用&&运算符: var gamequaliplayer = game.qualification && game.qualification.player; 避免错误,但结果仍然是取出一个undefined值。

  处理一些不需要的属性(例如原型链上的属性)时,我们除了使用typeof关键字以外,还有一种办法是使用object.prototype.hasownproperty()方法。这个方法会返回布尔值,值为填入的参数是否在当前的对象中。比较常用的用法是在使用for in语句遍历对象时,for in语句默认会遍历到原型链上的属性。假如在开发过程中原型链上的属性被其他人修改,而你不清楚,就会发生莫名的错误。因此在使用for in语句时使用这个方法会更为保险:

 1 var player = {
 2     name: 'lyn',
 3     age: 19,
 4     gender: 'male'
 5 };
 6 
 7 var playerpropertyname = [];
 8 var playerproperty = [];
 9 
10 for(var key in player) {
11     playerpropertyname.push(i);
12     playerproperty.push(player[i]);
13 }

  上面这段代码把player中的属性的键存入playerpropertyname数组,把player属性的值存入playerproperty数组中。下面在player原型链上加入新的属性,并使用object.prototype.hasownproperty()过滤:

 1 var player = {
 2     name: 'lyn',
 3     age: 19,
 4     gender: 'male'
 5 };
 6 player.prototype.playgame = 'mini warior';
 7 
 8 var playerpropertyname = [];
 9 var playerproperty = [];
10 
11 for (var key in player){
12     if(player.hasownproperty(key){
13         playerpropertyname.push(i);
14         playerproperty.push(player[i])'
15     }
16 }

  这样,在遍历过程中,就不会把playgame的键和值存到对应数组里面。

  对象的属性有的可枚举,有的不可枚举。像我们上面这样使用for in语句遍历一个对象时,所有可枚举的属性或方法都会受到影响,因此我们提到可以使用typeof关键字或hasownproperty方法进行过滤。但我们知道,javascript中array也是对象,我们建立数组,输出它,会发现数组的下标是键,值是值,还有一个不可枚举的length属性(当然还有原型)。在这种情况下,我们使用for in语句就不会影响到length属性。for in语句不仅容易遍历到方法和原型属性,还无法控制属性名的顺序,因此我们遍历的最佳实践应该是使用普通的for语句而不是for in语句(当然,当讲到闭包时,我们也会发现for语句也并不是完美的,但至少它在大多数情况下都比for in遍历要好)。

  至于对象属性的删除,我们会使用到delete运算符,需要注意的一点就是它将不会触及到原型链里的内容,但删除此对象的属性后,可能会让原型链的属性浮现:假设我们有一个player对象,它有一个属性nickname: "lyn",它的原型上也有一个属性nickname: "ben",经过 delete player.nickname; 后,输出player.nickname的值为ben。

  对象帮助我们编写可扩展、可重用、高质量的javascript库。但当然,对象还有几个重要的概念是原型链和对象的创建,它值得我们放到一篇新的博客中讲述。