`
hhr_michael
  • 浏览: 72710 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

JavaScript高级程序设计 (读书笔记5)

阅读更多
内置对象

ECMA-262把内置对象(built-in object)
定义为“由ECMAScript实现提供的、独立于宿主环境的所有对象,在ECMAScript程序开始执行时出现”。

这意味着开发者不必明确实例化内置对象,它已被实例化了。

ECMA-262只定义了两个内置对象,即Global和Math(它们也是本地对象,根据定义,每个内置对象都是本地对象)。


1. Global对象

Global对象是ECMAScript中最特别的对象,因为实际上它根本不存在。
如果尝试编写下面的代码,将得到错误:
var g = Global;

错误消息显示Global不是对象,但刚才不是说Global是对象吗?
没错。这里需要理解的主要概念是,
在ECMAScript中,不存在独立的函数,所有函数都必须是某个对象的方法。

本书前面介绍的函数,如isNaN()、isFinite()、parseInt()和parseFloat()等,看起来都像独立的函数。实际上,它们都是Global对象的方法。而且Global对象的方法不止这些。

encodeURI()和encodeURIComponent()方法
用于编码传递给浏览器的URI(统一资源标识符)。有效的URI不能包含某些字符,如空格。
这两个方法用于编码URI,这样用专门的UTF-8编码替换所有的非有效字符,就可以使浏览器仍能够接受并理解它们。

encodeURI()方法用于处理完整的URI(例如,http://www.wrox.com/illegal value.htm),
而encodeURIComponent()用于处理URI的一个片断(如前面的URI中的illegal value.htm)。

encodeURI()方法不对URI中的特殊字符进行编码,如冒号、前斜杠、问号和英镑符号,
encodeURIComponent()则对它发现的所有非标准字符进行编码。

可以看到,除空格外,第一个URI无任何改变,空格被替换为%20。
第二个URI中的所有非字母数字字符都被替换成它们对应的编码,基本上使这个URI变得无用。
这就是encodeURI()可以处理完整URI,
而encodeURIComponent()只能处理附加在已有URI末尾的字符串的原因。

自然,还有两个方法用于解码编码过的URI,即decodeURI()和decodeURIComponent()。如你所料,这两个方法所做的恰与其对应的方法相反。decodeURI()方法只对用encodeURI()方法替换的字符解码。例如,%20将被替换为空格,而%23不会被替换,因为它表示的是英镑符号(#),encodeURI()并不替换这个符号。同样的,decodeURIComponent()会解码所有encodeURIComponent()编码过的字符,意味着它将对所有的特殊值解码。例如:



在这个例子中,变量uri存放的是用encodeURIComponent()编码的字符串。生成的值说明了应用两个解码方法时会发生的事情。第一个值由decodeURI()输出,把%20替换成空格。第二个值由decodeURIComponent()输出,替换所有的特殊。

这些URI方法encodeURI()、encodeURIComponent()、decodeURI()和decodeURICom- ponent()
代替了BOM的escape()和unescape()方法。
URI方法更可取,因为它们会对所有Unicode符号编码,而BOM方法只能对ASCII符号正确编码。
尽量避免使用escape()和unescape()方法。

最后一个方法可能是整个ECMAScript语言中最强大的方法,即eval()方法。
该方法就像整个ECMAScript的解释程序,接受一个参数,即要执行的ECMAScript(或JavaScript)字符串。




当解释程序发现eval()调用时,它将把参数解释为真正的ECMAScript语句,然后把它插入该函数所在的位置。
这意味着eval()调用内部引用的变量可在参数以外定义:



这里,变量msg是在eval()调用的环境外定义的,而警告仍然显示的是文本"hello world",因为第二行代码将被替换为一行真正的代码。
同样,可以在eval()调用内部定义函数或变量,然后在函数外的代码中引用:

这里,函数sayHi()是在eval()调用内部定义的。因为该调用将被替换为真正的函数,所以仍可在接下来的一行中调用sayHi()。

这种功能非常强大,不过也非常危险。使用eval()时要极度小心,尤其在给它传递用户输入的数据时。
恶意的用户可能会插入对站点或应用程序的安全性有危害的值(叫做代码注入)。

Global对象不只有方法,它还有属性。还记得那些特殊值undefined、NaN和Infinity吗?它们都是Global对象的属性。
此外,所有本地对象的构造函数也都是Global对象的属性。


undefined    Undefined类型的字面量

NaN    非数的专用数值

Infinity    无穷大值的专用数值

Object    Object的构造函数

Array    Array的构造函数

Function    Function的构造函数

Boolean    Boolean的构造函数

String    String的构造函数

Number    Number的构造函数

Date    Date的构造函数

RegExp    RegExp的构造函数

Error    Error的构造函数

EvalError    EvalError的构造函数

RangeError    RangeError的构造函数

ReferenceError    ReferenceError的构造函数

SyntaxError    SyntaxError的构造函数

TypeError    TypeError的构造函数

URIError    URIError的构造函数



2. Math对象

它知道解决最复杂的数学问题的所有公式,如果给它要处理的数字,即能计算出结果。

Math对象有几个属性,主要是数学界的专用值。

虽然这些值的意义与用法不在本书讨论范围内,但如果清楚它们是什么,在需要时,即可使用它们。


方法min()和max()用于判断一组数中的最大值和最小值。这两个方法都可接受任意多个参数:

对于数字3、54、32和16,max()返回54,min()返回3。
用这些方法,可免去用循环或if语句来判断一组数中的最大值。

abs()返回数字的绝对值。绝对值是负数的正值版本(正数的绝对值就是它自身)。

这个例子中,abs(-1)返回1,abs(1)也返回1。

下一组方法用于把小数舍入成整数。处理舍入操作的方法有三个,即ceil()、floor()和round(),它们的处理方法不同:

方法ceil()表示向上舍入函数,总是把数字向上舍入到最接近的值。

方法floor()表示向下舍入函数,总是把数字向下舍入到最接近的值。

方法round()表示标准的舍入函数,如果数字与下一个整数的差不超过0.5,则向上舍入,否则向下舍入。这是在初中学过的舍入规则。

为说明每种方法的处理方式,考虑使用值25.5:

对于ceil()和round(),传递25.5,返回的是26,而floor()返回的是25。
注意不要交替使用这些方法,因为最后可能得到与预期不符的结果。

另一组方法与指数的用法有关。
这些方法包括exp(),用于把Math.E升到指定的幂;
log()用于返回特定数字的自然对数;
pow()用于把指定的数字升到指定的幂;
sqrt()用于返回指定数字的平方根。

方法exp()和log()本质上功能相反,exp()把Math.E升到特定的幂,log()则判断Math.E的多少次指数才等于指定的值。


方法pow()用于把数字升到指定的幂,如把2升到10次幂(在数学中表示为210):

pow()的第一个参数是基数,此例子中是2。第二个参数是要升到的幂,此例子中是10。

不建议把Math.E作为pow()方法的基数。最好使用exp()对Math.E进行升幂运算,因为它是专用运算,计算出的值更精确。

这组方法中的最后一个方法是sqrt(),用于返回指定数字的平方根。它只有一个参数,即要求平方根的数字。要求4的平方根,只需要用一行代码:

当然,4的平方根是2,就是这行代码的输出。

你也许会问“为什么平方根必须利用指数”?实际上,数字平方根就是它的1/2次幂。例如,21/2就是2的平方根。

Math对象还有一整套三角函数方法。

acos(x)返回x的反余弦值

asin(x)返回x的反正弦值

atan(x)返回x的反正切值

atan2(y,x)返回y/x的反余弦值

cos(x)返回x的余弦值

sin(x)返回x的正弦值

tan(x)返回x的正切值

即使这些方法是ECMA-262定义的,结果也是由实现决定的,因为每个值的计算方法都有很多,从而使得不同的实现生成的结果的精度也不同。

Math对象的最后一个方法是random(),该方法返回一个0到1之间的随机数,不包括0和1。
这是在主页上显示随机引述或新闻的站点常用的工具。

这里使用方法floor(),因为random()返回的都是小数值,也就是说,用它乘以一个数,然后再加上一个数,得到的仍然是小数值。
通常你想选择一个随机整数值。因此,必须使用floor()方法。如果想选择一个1到10之间的数,代码如下:
var iNum = Math.floor(Math.random()*10 + 1);


可能出现的值有10个(1到10),这些值中的第一个是1。如果想选择2到10之间的值,代码如下:
var iNum = Math.floor(Math.random()*9 + 2);
分享到:
评论

相关推荐

    javascript 高级程序设计 读书笔记(3)

    NULL 博文链接:https://shaw-n-lu.iteye.com/blog/1881210

    JavaScript高级程序设计 读书笔记之八 Function类及闭包

    Function类 定义 Function类可以表示开发者定义的任何函数,用Function类直接创建函数的语法如下: var function_name=new Function(agrument1,agrument2,…,argumentN,function_body); 每个argument都是一个参数,...

    对javascript的一点点认识总结《javascript高级程序设计》读书笔记

    l ECMAScript,有ECMA-262定义,明确javascript这门语言的规则和约定,好比为开始一场游戏指定的游戏规则、规范、约定。 l DOM:提供访问和操作网页内容的方法和接口 l BOM,提供与浏览器交互的方法和接口 ECMA-262规定...

    JavaScript高级程序设计 读书笔记之十一 内置对象Global

    内置对象 定义:由ECMAScript实现提供的、独立于宿主环境的所有对象,在ECMAScript程序开始执行时出现。 由定义可知开发者不必明确实例化内置对象,它已被实例化了。在ECMAScript-262只定义了两个内置对象,即Global...

    JavaScript高级程序设计 读书笔记之十 本地对象Date日期

    要注意的是在JavaScript中月份的值是从0到11(0表示1月)。 设置日期和时间值 设置日期和时间值有两种方法: 1、只声明距离1970年1月1日凌晨12点的毫秒数 a、直接用距离1970年1月1日凌晨12点的毫秒数 var d=new Date...

    JavaScript高级程序设计 读书笔记之九 本地对象Array

    创建Array对象 代码如下: //one var aValues=new Array(); //two var aValues=new Array(20); //three var aColors=new Array(); aColors[0]=”red”; aColors[1]=”green”; aColors[2]=”blue”;...

    Reading-Notes:读书笔记们

    JavaScript高级程序设计(第三版) You don't know JS 系列 ES6 标准入门 Node.JS深入浅出 图解HTTP HTTP权威指南 Head First Java CSS3揭秘 Linux Command Line 大型网站技术架构核心原理与案例分析 锋利的jQuery ...

    JavaScript 函数惰性载入的实现及其优点介绍

    最近看JavaScript高级程序设计,大有收获,接下来几天写一下读书笔记。之前写了一篇Ajax初步理解的随笔,里面有个函数用来创建XmlHttpRequest对象,浏览器兼容性原因,写出的代码通过大量if判断或者try,catch语句将...

    Javascript 面向对象 (声明篇)

    由于才疏学浅,我不得不将《Javascript 高级程序设计》中的部分内容摘抄过来,这些同时也算是我的读书笔记吧。由于 Javascript 面向对象机制及其的重要,而且内容非常的繁多,在这里就分篇章逐个介绍。 使用对象首先...

    my-blog:自己的博客

    JavaScript深入理解系列读书笔记系列这部分只会记载一些笔记,不会深入解读电子书链接:提取码:wube《你不知道JavaScript》中册《JavaScript高级程序设计》数据结构栈队列链表哈希表树图浏览器部分浏览器的主要进程...

    疯狂的java讲义源码-ReadingBooks:读书笔记整理

    《JavaScript高级程序设计(第3版)》 学习JS和前端必读的书籍,比较厚但是很有干货涉及面比较广,里面的重要章节我自己是读了不止一遍。 2、 《ES6标准入门》 阮一峰编着,作者讲事情的思路一向比较清晰,也是学ES6...

    asp.net知识库

    Essential .NET 读书笔记 [第一部分] NET FrameWork的Collections支持 .NET的反射在软件设计上的应用 关于跨程序集的反射 实现C#和VB.net之间的相互转换 深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述...

Global site tag (gtag.js) - Google Analytics