Javascript Global对象


Posted in Javascript onAugust 13, 2009

Global对象

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

Javascript 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()则对它发现的所有非标准字符进行编码。例如:

Javascript Global对象Javascript Global对象

这段代码输出两个值:

Javascript Global对象

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

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

Javascript Global对象

这段代码输出两个值:

Javascript Global对象

在这个例子中,变量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)字符串。例如:

Javascript Global对象

这行代码的功能等价于下面的代码:

Javascript Global对象Javascript Global对象

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

Javascript Global对象

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

Javascript Global对象

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

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

Global对象不只有方法,它还有属性。还记得那些特殊值undefined、NaN和Infinity吗?它们都是Global对象的属性。此外,所有本地对象的构造函数也都是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的构造函
Javascript 相关文章推荐
JS的encodeURI和java的URLDecoder.decode使用介绍
May 08 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
Aug 07 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
Oct 24 Javascript
JS实现焦点图轮播效果的方法详解
Dec 19 Javascript
JavaScript中重名的函数与对象示例详析
Sep 28 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
Feb 03 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
Mar 03 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
Jul 11 Javascript
webpack@v4升级踩坑(小结)
Oct 08 Javascript
说说如何利用 Node.js 代理解决跨域问题
Apr 22 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
Dec 15 Javascript
node.js 如何监视文件变化
Sep 01 Javascript
Javascript Math对象
Aug 13 #Javascript
Javascript 作用域使用说明
Aug 13 #Javascript
Javascript 继承机制实例
Aug 12 #Javascript
Javascript 继承机制的实现
Aug 12 #Javascript
Javascript 继承实现例子
Aug 12 #Javascript
JQuery jsonp 使用示例代码
Aug 12 #Javascript
JavaScript 权威指南(第四版) 读书笔记
Aug 11 #Javascript
You might like
php数组的一些常见操作汇总
2011/07/17 PHP
PHP 面向对象详解
2012/09/13 PHP
PHP伪静态Rewrite设置之APACHE篇
2014/07/30 PHP
开启PHP Static 关键字之旅模式
2015/11/13 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
PHP多进程之pcntl_fork的实例详解
2017/10/15 PHP
php web环境和命令行环境下查找php.ini的位置
2019/07/17 PHP
Javascript创建自定义对象 创建Object实例添加属性和方法
2012/06/04 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
jquery使用hide方法隐藏指定id的元素
2015/03/30 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
2017/06/09 Javascript
本地存储localStorage用法详解
2017/07/31 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
js构建二叉树进行数值数组的去重与优化详解
2018/03/26 Javascript
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
python实现一次创建多级目录的方法
2015/05/15 Python
Python实现模拟时钟代码推荐
2015/11/08 Python
Python对象类型及其运算方法(详解)
2017/07/05 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
浅谈pycharm下找不到sqlalchemy的问题
2018/12/03 Python
Python之循环结构
2019/01/15 Python
详解python读取image
2019/04/03 Python
关于python多重赋值的小问题
2019/04/17 Python
使用python制作一个为hex文件增加版本号的脚本实例
2019/06/12 Python
python 使用pdfminer3k 读取PDF文档的例子
2019/08/27 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
地球一小时活动总结
2015/02/27 职场文书
开学第一周日记(三篇范文)
2019/08/23 职场文书
Python 中的 copy()和deepcopy()
2021/11/07 Python
MySQL如何使备份得数据保持一致
2022/05/02 MySQL