ECMA-262中定义的最特殊的类型是Number型。这种类型既可以表示32

位的整数,还可以表示64位的浮点数。直接输入的(而不是从另一个变量访问 的)任何数字都被看作Number型的字面量。例如,下面的代码声明了存放整数 值的变量,它的值由字面量55定义:

var 1NUE1 = 55;

整数也可以被表示为八进制(以8为底)或十六进制(以16为底)的字面量。 八进制字面量的首数字必须是0,其后的数字可以是任何八进制数字(0到7), 如下面代码所示:

var iNum = 070; //G70 is equal to 56 in decimal

要创建十六进制的字面量,首位数字必须为0,其后接字母X,然后是任意的十 六进制数字(0到9和A到F)。这些字母可以是大写的,也可以是小写的。例 如:

var //Oxlf is equal to 31 in decimal

uar = OxAB; //OxAB is to 171 in d-eciinaL

尽管所有整数都可表示为八进制或十六进制的字面量,但所有数学运算返回的都是 十进制结果。

要定义浮点值,必须包括小数点和小数点后的一位数字(例如,用1.0而不是1) 这被看作浮点数字面量。例如:

var f况皿=5 a 0;

浮点字面量的有趣之处在于,用它进行计算前,真正存储的是字符串。

对于非常大或非常小的数,可以用科学记数法表示浮点值。采用科学记数法, 可以把一个数表示为数字(包括十进制数字)加e(或E),后面加乘以10的 倍数。不明白?下面是一个示例:

var fNum 二 3

该符号表示的是数31250000。把科学记数法转化成计算式就可以得到该值:3.125X10',即等于3.125X 10X10X10X10X10X10X10。

也可用科学记数法表示非常小的数,例如0.00000000000000003可以表示为

3-e17(这里,10被升到-17次幕,意味着需要被10除17次)。ECMAScript默认把具有6个或6个以上前导0的浮点数转换成科学记数法。

也可用64位IEEE 754形式存储浮点值,这意味着十进制值最多可以有17

个十进制位。17位之后的值将被截去,从而造成一些小的数学误差。

几个特殊值也被定义为Number类型的。前两个是Number. MAX_VALUE和Number. MIN_ VALUE,它们定义了Number值集合的外边界。所有ECMAScript数都必须在这两 个值之间。不过计算生成的数值结果可以不落在这两个数之间。

当计算生成的数大于Number. MAX_VALUE时,它将被赋予值Number. POSITIVE_INFINITY,意味着不再有数字值。同样,生成的数值小于Number.MIN_VALUE的计算也会被赋予 值Number. NEGATIVE_INFINITY,也意味着不再有数字值。如果计算返回的是无穷大值, 那么生成的结果不能再用于其他计算。

事实上,有专门的值表示无穷大,(如你所猜测的)即Infinity„Number. POSITIVE_INFINITY 的值为 Infinity, Number. NEGATIVE_INFINITY 的值为-Infinity。

由于无穷大数可以是正数也可以是负数,所以可用一个方法判断一个数是否 是有穷的(而不是单独测试每个无穷数)。可以对任何数调用isFinit()方法, 以确保该数不是无穷大。例如:

var i Re suit = s ocw_r es 1 Ly-larg e_nxnnber i

if (isFinite(iResult J)(

alert (*Numher is f initea ** I j

} else (

alertis infinite. ■ J ;

最后一个特殊值是NaN,表示非数(Not a Number)。NaN是个奇怪的特殊值。 一般说来,这种情况发生在类型(String、Boolean等)转换失败时。例如,要 把单词blue转换成数值就会失败,因为没有与之等价的数值。与无穷大值一样,

NaN也不能用于算术计算。NaN的另一个奇特之处在于,它与自身不相等,这意味 着下面的代码将返回false:

alert== N舔); outputs

出于这种原因,不推荐使用NaN值本身。函数isNaN ()会做得相当好:

alert(isNaM('blus"}); //outputs "true*

alert *123; //outputs * false"

2.6.6 String 类型

String类型的独特之处在于,它是唯一没有固定大小的原始类型。可以用字符 串存储0或更多的Unicode字符,由16位整数表示(Unicode是一种国际字符 集,本书后面将讨论它)。

字符串中每个字符都有特定的位置,首字符从位置0开始,第二个字符在

位置1,依此类推。这意味着字符串中的最后一个字符的位置一定是字符串的长 度减1 (如图2-2所示)。

寇个字符串的住度足占

恒J " I U I;丨门

0 12 3 4 5

圈癩

字符串字面量是由双引号(“)或单引号(~)声明的。与Java不同的是,双引 号用于声明字符串,单引号用于声明字符。但是,由于ECMAScript没有字符类 型,所以可使用这两种表示法中的任何一种。例如,下面的两行代码都有效:

var sColorl = ■blueh;

VAr flCdl*r,2 = 'bluft1;

String类型还包括几种字符字面量,Java、C和Perl的开发者应该对此非常熟 悉。下表列出了ECMAScript的字符字面量:

字面量 含义

\n

\t

\b

\u

\I

\\

\a

?"

\0nnn \xnn \unnnn

换行

制表符

空格

回车

换页符

反斜杠

单引号

双引号

八进制代码nnn (q是0到7中的一个八进制数字)表示的字符

十六进制代码nn (n是0到F中的一个十六进制数字)表示的字符

十六进制代码nnnn (n是0到F中的一个十六进制数字)表示的Unicode字符

第2章ECMAScript基础

2.7转换

所有程序设计语言最重要的特征之一是具有进行类型转换的能力,ECMAScript给开 发者提供了大量简单的转换方法。大多数类型具有进行简单转换的方法,还有几个 全局方法可以用于更复杂的转换。无论哪种情况,在ECMAScript中,类型转换都是 简短的一步操作。

2.7.1转换成字符串

ECMAScript的Boolean值、数字和字符串的原始值的有趣之处在于它们是伪对 象,这意味着它们实际上具有属性和方法。例如,要获得字符串的长度,可以采 用下面的代码:

v^r sColor ■■ "blue1*:

alert I:sColor, length) ; //outputs

尽管"blue”是原始类型的字符串,它仍然具有属性length,用于存放该字符串的大 小。总而言之,3种主要的原始值Boolean值、数字和字符串都有toStringO方法, 可以把它们的值转换成字符串o

也许你会问,“字符串还有toString ()方法,这不是多余的吗? ”是的,的确如 此,不过ECMAScript定义所有对象都有toString()方法,无论它是伪对象,还是 真的对象。因为String类型属于伪对象,所以它一定有toString()方法。

Boolean型的toString()方法只是输出"true”或"false”,结果由变量的值决定:

var IpFccdud ■ falser

alert IbFoun,^. toStringt j I ;

Number类型的toString()方法比较特殊,它有两种模式,即默认模式和基模式。

采用默认模式,toString()方法只是用相应的字符串输出数字值(无论是整数、浮

var iNunl = 10;

var £Nliki2 = 1-0u0;

aL&rt Li^uml.toString[)I;

alert[toString[)1;

在默认模式中,无论最初采用什么表示法声明数字,Number类型的toString()方 法返回的都是数字的十进制表示。因此,以八进制或十六进制字面量形式声明的 数字输出时都是十进制形式的。

采用Number类型的toString()方法的基模式,可以用不同的基输出数字,例如二 进制的基是2,八进制的基是8,十六进制的基是16。基只是要转换成的基数的 另一种叫法而已,它是toString()方法的参数:

var iNuun = 10;

file-rt liNuiftl. toStrlngi2)) ? //outputs "1010*

aL&rtliNuml.toString^B)); //outputs

alert ; //outputs W

在前面的示例中,以3种不同的形式输出了数字10,即二进制形式、八进

制形式和十六进制形式。HTML采用十六进制数表示每种颜色,在HTML中处理数 字时这种功能非常有用。

对数字调用toString(lO)与调用toString()相同,它们返回的都是该数字的十进制 形式。

2.7.2转换成数字

ECMAScript提供了两种把非数字的原始值转换成数字的方法,即parselnt()和parseFloat()o正如你可能想到的,前者把值转换成整数,后者把值转换成浮点数。

只有对String类型调用这些方法,它们才能正确运行;对其他类型返回的都是

NaNo

在判断字符串是否是数字值前,parselnt()和parseFloat()都会仔细分析该字符串。parselnt ()方法首先查看位置0处的字符,判断它是否是个有效数字;如果不是, 该方法将返回NaN,不再继续执行其他操作。但如果该字符是有效数字,该方法 将查看位置1处的字符,进行同样的测试。这一过程将持续到发现非有效数字的 字符为止,此时parselnt()将把该字符之前的字符串转换成数字。例如,如果要 把字符串"1234blue”转换成整数,那么parselnt()将返回1234,因为当它检测到字符b时,就会停止检测过程。字符串中包含的数字字面量会被正确转换为数字,因 此字符串"OxA〃会被正确转换为数字10o不过,字符串〃22.5〃将被转换成22,因为 对于整数来说,小数点是无效字符。一些示例如下:

var iNutnl = parselnt{"1234blue") ; //returns 1234

var = parselnt (; //returns 10

var 言 parselnt I b22.5fc H / /retuiziE 22

var - parselnt("blue"); //returns NaN

parselnt()方法还有基模式,可以把二进制、八进制、十六进制或其他任何进制的 字符串转换成整数。基是由parselnt ()方法的第二个参数指定的,所以要解析十 六进制的值,需如下调用parselnt。方法:

var iNuunl = parselRti ■AF", 捉】; //returns 175

当然,对二进制、八进制,甚至十进制(默认模式),都可以这样调用parselnt。方法:

var iNunl = parselnt("10"^ 2) ? //returns 2

var iNmnS ,= parselnt |1110 **, S] ; / / re turns B

var iNucnS 挡 parseTnc I ■IO*, //returns 10

如果十进制数包含前导0,那么最好采用基数10,这样才不会意外地得到八进制的值。例如:

var iNuml = parselnt^ p010"): var iNmn2 » parselnt{"010"^ 83 ? var 兰 parselntC010". 10);

在这段代码中,两行代码都把字符串〃010〃解析成了一个数字。第一行代码

把这个字符串看作八进制的值,解析它的方式与第二行代码(声明基数为8)相 同。最后一行代码声明基数为10,所以iNum3最后等于10。

parseFloatO方法与parselnt()方法的处理方式相似,从位置0开始查看每个字符, 直到找到第一个非有效的字符为止,然后把该字符之前的字符串转换成数字。不 过,对于这个方法来说,第一个出现的小数点是有效字符。如果有两个小数点, 第二个小数点将被看作无效的,parseFloatO方法会把这个小数点之前的字符串转 换成数字。这意味着字符串"22. 34. 5”将被解析成22. 34。

使用parseFloat()方法的另一不同之处在于,字符串必须以十进制形式表示浮点 数,而不能用八进制形式或十六进制形式。该方法会忽略前导0,所以八进制数0908将被解析为908。对于十六进制数OxA,该方法将返回NaN,因为在浮点数中,x不是有效字符。此外,parseFloatO也没有基模式。

下面是使用parseFloat()方法的示例:

var 瑙皿 1 ■ par^eFloat ( *123*3blue* ); //returns 1234.0

vsr fldupS = psrseFldflt (;

var = parseFloatO r22.5B};

var fNuni^ = parseFloat (' 22 a 3-4 a 5**);

var 二 par$^FlQat( *0^03-;;

var fN顚$ = parseFloatpbLue■:;

2.7.3强制类型转换

还可使用强制类型转换(typecasting)处理转换值的类型。使用强制类型转换

可以访问特定的值,即使它是另一种类型的。ECMAScript中可用的3种强制类 型转换如下:

口Boolean(value) 把给定的值转换成Boolean型;

口Number(value) 把给定的值转换成数字(可以是整数或浮点数);

口String (value) 把给定的值转换成字符串。

用这三个函数之一转换值,将创建一个新值,存放由原始值直接转换成的值。这 会造成意想不到的后果。

当要转换的值是至少有一个字符的字符串、非0数字或对象(下一节将讨论这一 点)时,Boolean0函数将返回true。如果该值是空字符串、数字0、undefined或null,它将返回false。可以用下面的代码段测试Boolean型的强制类型转换。

var bl = Scclean(r")?

var b2 ,= Bcolean;

var = Boolean(100}s

uar = Boolean(null);

var b5 ■ Scol ean 0 H

var bS - Boolean(new Object(H;

Number 0的强制类型转换与parselntO和parseFloat ()方法的处理方式相似,只 是它转换的是整个值,而不是部分值。还记得吗,parselnt ()和parseFloat ()方法只 转换第一个无效字符之前的字符串,因此"4.5.6”将被转换为"4.5”。用Number()进 行强制类型转换,”4.5.6”将返回NaN,因为整个字符串值不能转换成数字。如果 字符串值能被完整地转换,Number ()将判断是调用parselnt ()方法还是调用parseFloat()方法。下表说明了对不同的值调用Number()方法会发生的情况:

用 法

结 果

Number(false)

0

Number(true)

1

Number(undefined)

NaN

Number(null)

0

Number("5.5")

5.5

Number("56")

56

Number("5.6.7")

NaN

Number(new Obj ect())

NaN

Number(100)

100

最后一种强制类型转换方法String()是最简单的,因为它可把任何值转换成字符 串。要执行这种强制类型转换,只需要调用作为参数传递进来的值的toString。方法,即把1转换成"1",把true转换成"true”,把false转换成"false”,依此 类推。强制转换成字符串和调用toString()方法的唯一不同之处在于,对null或undefined值强制类型转换可以生成字符串而不引发错误:

var si = String(null J;

var cNull ■ n^ll?

var t&String 1) ; //won't workr causes an error

在处理ECMAScript这样的弱类型语言时,强制类型转换非常有用,不过应该确 保使用值的正确。

第2章ECMAScript基础

2.8引用类型

引用类型通常叫作类(class),也就是说,遇到引用值时,所处理的就是对象。 本书将讨论大量的ECMAScript预定义引用类型。从现在起,将重点讨论与已经 讨论过的原始类型紧密相关的引用类型。

从传统意义上来说,ECMAScript并不真正具有类。事实上,除了说明不存在类 在ECMA-262中根本没有出现“类”这个词,ECMAScript定义了 “对象定义”, 逻辑上等价于其他程序设计语言中的类。本书选择使用术语“类”,因为大多数 开发者对此更熟悉一些。

对象是由new运算符加上要实例化的类的名字创建的,例如,下面代码创建了Object类的实例:

var o = new Obfect{);

这种语法与Java语言的相似,不过当有不止一个参数时,ECMAScript要求使用 括号。如果没有参数,如前面代码所示,括号可以省略:

var o = new Object;

第3章将更深入地探讨对象及其行为。这一节的重点是具有等价的原始类型的引 用类型。

尽管括号不是必需的,但为避免混乱,最好使用括号。

2.8.1 Object类

Object类自身用处不大,不过在了解其他类之前,还是应该先了解它。因为ECMAScript中的Object 类与Java中的java. lang, object 相似,ECMAScript中的所 有类都由这个类继承而来,Object类中的所有属性和方法都会出现在其他类中, 所以理解了Object类,就可以更好地理解其他类。

Object类具有下列属性:

口Constructor——对创建对象的函数的引用(指针)。对于Object类,该指针指向 原始的objectO函数。

口Prototype 对该对象的对象原型的引用。第3章将进一步讨论原型。对于所有

的类,它默认返回Object对象的一个实例。

Object类还有几个方法:

口HasOwnProperty(property) 判断对象是否有某个特定的属性。必须用字符串指定

该属性(例如,o.hasOwnProperty("name"))。

口IsPrototypeOf (object) 判断该对象是否为另一个对象的原型。

口PropertylsEnumerable (property) 判断给定的属性是否可以用for…in语句(本章

后面将讨论该语句)进行枚举。

口ToString()——返回对象的原始字符串表示。对于Object类,ECMA-262没有定义 这个值,所以不同的ECMAScript实现具有不同的值。

口ValueOf() 返回最适合该对象的原始值。对于许多类,该方法返回的值都与

toString()的返回值相同。

上面列出的每种属性和方法都会被其他类覆盖。

2. 8. 2 Boolean类

Boolean类是Boolean原始类型的引用类型。要创建Boolean对象,只需要传递

Boolean值作为参数:

var oBoolean Object 二 new Boolean(true);

Boolean对象将覆盖object类的valueOf ()方法,返回原始值,即true或false oToStringO 方法也会被覆盖,返回字符串〃t rue”或"false”。遗憾的是,在ECMAScript中很少 使用Boolean对象,即使使用,也不易理解。

问题通常出现在Boolean表达式中使用Boolean对象时。例如:

var oFaLseObject = new Boolean[false)j

var ^Result = oFalseObject && true; //outputs true

在这段代码中,用false值创建Boolean对象。然后用这个值与原始值true进行AND操作。在Boolean运算中,false和true进彳丁AND操作的结果是false。不过,在这行代码中,计算的是oFalseObject,而不是它的值false。正如前面讨论过的, 在Boolean表达式中,所有对象都会被自动转换为true,所以oFalseObejct的值是trueo然后true再与true进彳丁AND操作,结果为true。

虽然你应该了解 Boolean 对象的可用性,不过最好还是使用 Boolean 原始值,避免发 生这一节提到的问题。

2.8.3 Number类

正如你可能想到的,Number类是Number原始类型的引用类型。要创建Number对象, 采用下列代码:

var oNunbesObject = new Nystiber CS5);

你应该已认出本章前面小节中讨论特殊值(如Number. MAX_VALUE)时提到的Number 类。所有特殊值都是Number类的静态属性。

要得到数字对象的Number原始值,只需要使用valueOf()方法:

var iNucnber = oNmnJ&erObj ec t, va ly eD f {);

当然,Number类也有toString()方法,在讨论类型转换的小节中已经详细讨论过该 方法。除从Object类继承的标准方法外,Number类还有几个处理数值的专用方法。

toFixedO方法返回的是具有指定位数小数的数字的字符串表示。例如:

java 强制声明为引用_JAVASERIPT高级程序设计35~45页相关推荐

  1. java 强制转换 效率_Java 性能优化:35 个小细节,让你提升 Java 代码的运行效率...

    代码优化细节 1.尽量指定类.方法的final修饰符 2.尽量重用对象 3.尽可能使用局部变量 4.及时关闭流 5.尽量减少对变量的重复计算 6.尽量采用懒加载的策略,即在需要的时候才创建 7.慎用异 ...

  2. java关于泛型的实验代码_[改善Java代码]强制声明泛型的实际类型

    Arrays工具类有一个方法asList可以把一个变长参数或数组变成列表,但是它有一个缺点:它所生成的List长度是不可改变的,而这在我们的项目开发中很不方便. importjava.util.Arr ...

  3. 《Java高级程序设计》第一周作业

    (1)加入<Java高级程序设计>课程QQ群,群名片改为实名. (2)在博客园创建个人账号并申请开通博客,用于学习笔记和阅读报告等的发布,关注教师博客每周至少在博客园上发表一篇学习笔记,记 ...

  4. Java实践(五)——类的声明与引用

    实践目标: 1.掌握类的声明和引用 2.掌握类的数据成员的定义和引用 3.掌握类的函数成员的定义和引用 难点: private,public和protected的区别. 实践内容: 1.根据例2-1, ...

  5. (Java高级程序设计-案例)-通过JDBC连接MySQL并对表进行增、删、改、查

    Java高级程序设计第八章的练习 通过一个案例去了解使用JDBC连接到MySQL,并且对数据库中的User表进行增删改查 目录 1.创建一个案例使用的数据库和表 2.创建用于MySQL的数据库工具类D ...

  6. [Javascript 高级程序设计]学习心得记录 函数参数传递与引用

    最近开始啃js的红宝书:<Javascript 高级程序设计>,偶有心得,记录一下. 先上代码 function howManyArgs() {alert(arguments.length ...

  7. Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年

    Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 第 9 章 异常处理 9.1 异 ...

  8. 《JavaScript高级程序设计(第3版)》教程大纲

    词条 <JavaScript高级程序设计>是2006年人民邮电出版社出版的图书,作者是(美)(Nicholas C.Zakas)扎卡斯.本书适合有一定编程经验的开发人员阅读,也可作为高校相 ...

  9. 前端红宝书《JavaScript高级程序设计》核心知识总结

    此文是对<JavaScript 高级程序设计>一书难点的总结,也是笔者在看了 3 遍之后的一些梳理和感想,希望能借此巩固js的基础和对一些核心概念有更深入的了解. 摘要 JS基本的数据类型 ...

  10. Java第四次作业——面向对象高级特性(继承和多态)

    Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...

最新文章

  1. linux 内核 sscanf,linux sscanf()
  2. vue2.0路由之编程式导航
  3. ASP.NET MVC XML绑定Action参数列表
  4. jee web_您基于JEE的Web项目的结构是什么?
  5. JLBH示例4 – QuickFix vs ChronicleFix基准化
  6. java点赞功能实现_JavaWeb中点赞功能的实现及完整实例
  7. 网信办:从严整治激情打赏、高额打赏、诱导打赏
  8. 创建docker容器的命令
  9. 写入Visual Studio的输出窗口
  10. 杰奇reader.php源码,最新杰奇CMS Jieqi V2.4 静思文学源码全解密开源版完整源码分享,附带关关采集杰奇V3.5版程序...
  11. Findbugs使用指南及扫描内容解释
  12. Python脚本调用谷歌浏览器的谷歌翻译
  13. Unable to get offset lags for kafka. Reason: java.lang.NullPointerException at org.apache.storm.kafk
  14. 三维形体的数据结构(1)半边数据结构
  15. php有几个单词,PHP-如何选择一个句子的前10个单词?
  16. 以太坊V神大著:去中心化社会:寻找Web3的灵魂
  17. Elasticsearch之路由
  18. 概率论归咎于人类智力的弱点
  19. 计算机中丢失repo,我的本地git repo有“未上演”的已删除文件,远程是文件,如何删除丢失的文件?...
  20. JavaScript解决百钱买百鸡问题

热门文章

  1. exescope使用
  2. YUI Compressor Maven
  3. 从MDK4到MDK5之“盘古开天辟地”
  4. appboot-7227
  5. 用python写个类似浏览器的下载器,超简单的
  6. 网页视频流m3u8/ts视频下载
  7. 获取元素属性(offsetHeight、clientHeight...)无效
  8. sir节点matlab模型,SIR模型实现(matlab)
  9. 全国大学生数学建模竞赛2016A题系泊系统的设计MATLAB程序
  10. 如何将两段音乐合并成一段?