JavaScript学习(2):对象、集合以及错误处理
在这篇文章里,我们讨论一下JavaScript中的对象、数组以及错误处理。
1. 对象
对象是JavaScript中的一种基本类型,它内部包含一些属性,我们可以对这些属性进行增删操作。
1.1 属性
JavaScript中的值,有时会包括一些与其相关联的值,这些相关联的值,我们称之为属性。
访问属性
下面是一个非常简单的示例:
var a = "this is test";
print("type of a:" + typeof a);
print(a["length"]);
print(a.length); //输出结果
type of a:string
12
12
上述代码中,第3行和第4行的作用是一样的,都是输出a的长度。我们可以看到a是string类型的变量,它包含了一个名为length的属性,这个属性可以返回字符串的长度。当需要调用属性时,我们可以使用"变量名[属性名称]"的方式,也可以使用“变量名.属性名称”的方式。后者是前者的一个简写形式。
但是当属性命名以数字等开头时,我们只能以“[]”的形式来引用,例如:
var temp={"1":"a", "2":"b", "3":"c"};
print(temp["1"]);
//print(temp.1);
上述代码最后一行如果不注释掉,就会发生错误,因为“1”不符合JavaScript变量的命名规则。
在JavaScript中,对象由一个属性集合构成,每个属性的值还可以是一个属性集合,以此类推。
删除属性
当我们试图访问一个不存在的属性时,会返回undefined,我们可以通过delete操作来删除。另外我们可以使用in操作来判断属性是否存在。
来看下面的示例:
var temp={"1":"a", "2":"b", "3":"c"};
print(temp["1"]);
print("\'1\' in temp:" + ("1" in temp));
delete temp["1"];
print(temp["1"]);
print("\'1\' in temp:" + ("1" in temp)); //输出结果
a
'1' in temp:true
undefined
'1' in temp:false
可以看到,在使用了delete操作后,属性已经被删除了。
遍历属性
对于我们在程序中添加的属性,是可以通过循环的方式进行遍历的:
var temp={"1":"a", "2":"b", "3":"c"};
for(var name in temp){
print("temp["+name+"]="+temp[name])
}
print(temp); //输出结果
temp[1]=a
temp[2]=b
temp[3]=c
[object Object]
非常有意思的是直接print对象时,输出的是[object,object]。
1.2 修改对象
JavaScript中也有值类型和引用类型之分,我们可以通过修改对象中属性的值来改变对象。
来看下面的示例:
var a={"start":10};
var b=a;
var c={"start":10};
print("a==b:" + (a==b));
print("a==c:" + (a==c));
print("a.start:" + a.start);
print("b.start:" + b.start);
print("c.start:" + c.start);
a.start=20;
print("a.start:" + a.start);
print("b.start:" + b.start);
print("c.start:" + c.start); //输出结果
a==b:true
a==c:false
a.start:10
b.start:10
c.start:10
a.start:20
b.start:20
c.start:10
2. 数组
我们可以把对象看做是一个实体模型,它内部包含的信息作为属性存在。如果需要表示多个实体模型时,我们可以考虑使用集合。
我们使用"[]"来定义数组,来看下面的示例:
function arrayTest(){
var temp=["a","b","c"];
temp.push("d");
temp.push("e");
for(var i = 0; i < temp.length; i++){
print(temp[i]);
}
} //输出结果
a
b
c
d
e
我们有两种方式向数组中添加元素:1)初始化数组时;2)使用push方法。
我们可以使用join方法将数组转换成一个字符串,也可以使用split方法将一个字符串转换成字符串数组,如下:
var temp=["a","b","c"];
temp.push("d");
temp.push("e");
print(temp.join(" "));
print(temp);
var a="a b c d e";
print(a.split(" ")); //输出结果
a b c d e
a,b,c,d,e
a,b,c,d,e
可以看到当我们直接print数组时,它输出了数组中的每一个元素,但我们print对象时,它并没有输出对象中的属性。
3. 错误处理
在编写程序时发生的错误可以分为两类:程序员错误和运行时错误。
对于程序员错误的处理策略,我们通常是期望程序尽快出错,这样可以弄清楚哪里出了问题。同时我们也可以采取防御性编程,例如添加输入检查。
对于运行时错误,我们应该尽量对错误进行处理,例如回滚,尽量避免程序崩溃。
3.1 处理错误的方式
在JavaScript中,我们有几种方式可以用来处理错误。
返回特殊值
对于不符合业务逻辑的输入,我们可以返回一个特殊值,例如undefined,这样可以提示用户方法的返回值是不正常的。
例如我们在JavaScript学习(1):基础中提到的学习成绩分类的示例,对于输入的分数大于100或者小于0的情况,明显不符合正常的业务,我们可以返回undefined。
这种错误处理方式的坏处:1)如何确定特殊的返回值,如果undefined在某种情况下也是正常业务的返回值,那么我们如何处理?2)需要函数的调用方知道特殊的返回值,并且在每次调用的时候,对特殊返回值进行处理。
异常
我们可以通过throw、try...catch的方式来实现异常处理,下面是一个简单示例:
function divide(a,b){
if (b == 0) throw "can not divide 0";
return a/b;
} function errorTest(){
try{
divide(1,0);
}
catch(error){
print("error occurs:" + error);
}
} //输出结果
error occurs:can not divide 0
我们可以自定义Error对象,这样在catch时,可以更加细化的处理指定的异常。如下示例:
var zeroError = new Error("can not divide 0"); function errorTest(){
try{
throw new Error("test");
divide(1,1);
}
catch(error){
if (error==zeroError){
print("error occurs:" + error.message);
}
else{
print(error.message);
}
}
} //输出结果
test
我们可以在catch后面添加finally语句,和Java一样,可以在finally语句中释放资源,恢复业务状态等操作。
JavaScript学习(2):对象、集合以及错误处理的更多相关文章
- Javascript学习4 - 对象和数组
原文:Javascript学习4 - 对象和数组 在Javascript中,对象和数组是两种基本的数据类型,而且它们也是最重要的两种数据类型. 对象是已命名的值的一个集合,而数组是一种特殊对象,它就像 ...
- JavaScript学习04 对象
JavaScript学习04 对象 默认对象 日期对象Date, 格式:日期对象名称=new Date([日期参数]) 日期参数: 1.省略(最常用): 2.英文-数值格式:月 日,公元年 [时:分: ...
- JavaScript学习笔记——对象知识点
javascript对象的遍历.内存分布和封装特性 一.javascript对象遍历 1.javascript属性访问 对象.属性 对象[属性] //字符串格式 //javascript属性的访问方法 ...
- javascript jquery封装对象时的错误,求解!我想知道为什么
jquery 封装对象时的错误 --------------------------------------------<input id="name" name=&qu ...
- JavaScript学习笔记-对象
枚举对象的属性:通常用for(...in...)来循环遍历,由于 for in 总是要遍历整个原型链,因此如果一个对象的继承层次太深的话会影响性能 for(var i in foo){ if(foo. ...
- JavaScript学习笔记——对象基础
javascript对象基础 一.名词解释: 1.基于对象 一切皆对象,以对象的概念来编程. 2.面向对象编程(oop Object oriented programming) A.对象 就是人们要研 ...
- JavaScript学习笔记——对象分类
对象的分类 一.对象的分类 1.内置对象 Global Math 2.本地对象 Array Number String Boolean Function RegExp 3.宿主对象 DOM BOM 二 ...
- JavaScript学习之对象
JavaScript对象 一.对象简介 JavaScript 是面向对象的编程语言 (OOP).OOP 语言使我们有能力定义自己的对象和变量类型.注意:对象只是一种特殊的数据.对象拥有属性和方法. 1 ...
- JavaScript学习笔记——对象的创建
对象是JavaScript基本数据类型,在JavaScript中除了Undefined.Null.布尔型(ture.false).字符串和数字之外,其他的都属于对象. 在JavaScript中,一个对 ...
- JavaScript学习——JS对象和全局函数
1. Array对象 数组的特点:长度可变!数组的长度=最大角标+1 2.Boolean对象 如果value 不写,那么默认创建的结果为false 3.Date对象 getTime()返回1970年1 ...
随机推荐
- 快速入门系列--GIT版本控制工具
由于GIT刚刚开始使用不久,经常会在Merge时出现没有change-id的情况,在结合gerrit使用时,经常出现不能提交的情形,使得自己很困扰.最近有次熬夜加班,在代码完成后,由于多人在很短时间内 ...
- 本地MVC项目发布到IIS服务器
0瞎扯 朋友们有时候我们写个一个web程序只能使用卡西尼服务器调试,下面我教大家发布到IIS服务器上(包括本地ISS7.5和远程服务器 IIS) 1.VS发布 a.点击web项目->发布
- java集合框架之Set
Set集合 元素不可以重复,是无序. 方法与list相同 HashSet:不保证set的迭代顺序,不同步,内部数据结构是哈希表 如果存自定义对象则需要覆盖equals和hashCode方法 先比较ha ...
- JavaScript的学习--JavaScript设计模式的总结
这篇博客只是自己对设计模式的理解的备忘~ 看完了<JavaScript设计模式>这本书,一直没有写博客记录一下,最近抽出时间来重读了一下,就顺便记录一下~ 如果你只是想粗略了解一下Java ...
- Hadoop阅读笔记(四)——一幅图看透MapReduce机制
时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样“有口无心”的学习方式是不奏效的,或者是收效甚微的.如果有幸能有大牛路过, ...
- C# Socket系列三 socket通信的封包和拆包
通过系列二 我们已经实现了socket的简单通信 接下来我们测试一下,在时间应用的场景下,我们会快速且大量的传输数据的情况! class Program { static void Main(stri ...
- 语义化HTML:i、b、em和strong标签
一.前言 在HTML4.1中i和b作为表象标签分别表示斜体和粗体样式,而强调样式与内容分离的XHTML中则出现样式效果相同的em和strong表义标签,此时我们会建议避免使用i和b标签,应该改用em和 ...
- 《ASP.NET SignalR系列》第四课 SignalR自托管(不用IIS)
从现在开始相关文章请到: http://lko2o.com/moon 接着上一篇:<ASP.NET SignalR系列>第三课 SignalR的支持平台 一.概述 SignalR常常依托于 ...
- html5的canvas绘制迷宫地图
canvas标签一直是html5的亮点,用它可以实现很多东西.我想用它来绘画像迷宫那样的地图.借助到的工具有瓦片地图编辑器tiled(点击跳转到下载链接). 如图:如果你想要画像这样的迷宫地图,如果不 ...
- 用2263份证件照图片样本测试how-old.net的人脸识别
上一年也就是这个时候微软根据自己的人脸识别API推出了一个识别照片中人脸年龄和性别的网站--http://how-old.net,小伙伴们各种玩耍,一年后的今天突发"奇想"地想测试 ...