`
hhr_michael
  • 浏览: 74317 次
  • 性别: 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)

    《JavaScript高级程序设计》是JavaScript开发者的经典教材,它深入探讨了这门语言的核心概念和技术。这篇读书笔记主要聚焦在第三部分,这部分通常涵盖了更高级的主题,如对象、原型、闭包以及模块化等。结合提供的...

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

    JavaScript中的Function类是一种特殊的数据类型,它可以用来动态创建或表示任何开发者定义的函数。通过`new Function()`构造函数,我们可以传递参数列表和函数体来创建一个新的函数。例如,`var sayHi = new ...

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

    ### JavaScript高级程序设计读书笔记之九:本地对象Array #### 创建Array对象 在JavaScript中,`Array`是一种非常重要的本地对象,主要用于存储一系列有序的数据。创建`Array`对象的方法有多种,具体包括: 1. **...

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

    JavaScript,作为一种广泛应用于Web开发的脚本语言,其核心规则和规范由ECMAScript标准定义。ECMA-262是这个标准的正式名称,它详细规定了JavaScript的语法、类型、关键字、保留字、操作符以及对象。ECMAScript为...

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

    在JavaScript中,内置对象是指由ECMAScript标准实现并提供的一类特殊对象,它们独立于宿主环境(例如浏览器或Node.js环境)存在,并在程序执行时自动创建。这些对象提供了许多基本功能和常用方法,使得开发者可以...

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

    ### JavaScript中的Date对象详解 #### 一、概述 在JavaScript编程语言中,`Date`对象是一种内置对象,用于处理日期和时间数据。它提供了一系列的方法和属性,可以帮助开发者轻松地进行日期时间的操作,如获取当前...

    《微信小程序全栈开发技术与实战》读书笔记模板.pptx

    微信小程序全栈开发技术与实战读书笔记模板 微信小程序全栈开发技术与实战是目前非常热门的开发技术之一,本书共16章,主要包括快速上手、基础组件、设计交互、高级组件、数据访问与管理、分层架构、服务逻辑层实现...

    基于Springboot的学生读书笔记共享系统源码数据库.doc

    ### 基于Springboot的学生读书笔记共享系统关键知识点解析 #### 一、项目背景与目标 本系统旨在为学生提供一个便捷、高效的读书笔记共享平台。随着互联网技术的发展,尤其是移动互联网的普及,学生群体对于知识...

    HeaderFirst读书笔记代码.zip

    这里的"HeaderFirst读书笔记代码.zip"是一个包含作者阅读此书时所编写的源码和笔记的压缩文件,可以帮助读者更直观地理解和学习书中内容。 根据提供的压缩包文件名,我们可以推测这是一系列按照章节顺序排列的HTML...

    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高级程序设计》数据结构栈队列链表哈希表树图浏览器部分浏览器的主要进程...

    韩顺平html css js笔记.doc

    JavaScript 是一种高级的脚本语言,主要用于网页的交互性和动态效果的实现。JavaScript 可以用来创建动态网页,实现网页的交互性和动态效果。 网页设计 网页设计是 Web 开发的重要部分,网页设计的目的是创建一个...

Global site tag (gtag.js) - Google Analytics