JavaScript 单体内置对象

Global对象

Global(全局)对象可以说是 ECMAScript 中最特别的一个对象了,因为不管你从什么角度上看,这个对象都是不存在的。

ECMAScript 中的 Global 对象在某种意义上是作为一个终极的"兜底儿对象"来定义的。

换句话说,不属于任何其他对象的属性和方法,最终都是它的属性和方法。

事实上没有全局变量或全局函数;所有在全局作用域中定义的属性和函数,都是 Global 对象的属性。

例如:isNan()、isFinite()、parseInt()...等,除此之外,Global 对象还包含其他一些方法。

URI编码方法

encodeURI() 和 encodeURIComponent() 方法可以对 URI(Uniform Resource Identifiers,通用资源表示符)进行编码,以便发送给浏览器。有效的 URI 中不能包含某些字符,例如空格。而这两个 URI 编码方法就可以对 URI 进行编码,它们用特殊的 UTF-8 编码替换所有无效的字符,从而让浏览器能够接受和理解。

encodeURI() 主要用于整个 URI(例如,http://www.xxx.com/iii.html), 而 encodeURIComponent() 主要用于对 URI 中的某一段(例如前面 URL 中的 xxx.html)进行编码。

它们的主要区别在于, encodeURI() 不会对本身属于 URI 的特殊字符进行编码,例如冒号、正斜杠、问好和井字号;

而 encodeURIComponent() 则会对它发现的任何非标准字符进行编码。

var uri = "http://www.xxx.com/iii.html";

alert(encodeURI(uri)); // http://www.xxx.com/iii.html
alert(encodeURIComponent(uri)); // http%3A%2F%2Fwww.xxx.com%2Fiii.html

使用 encodeURI() 编码后的结果是除了空格之外的其他字符都原封不动,只有空格被替换成了 %20。而encodeURIComponent() 方法则会使用对应的编码替换所有非字符字母字符串。

一般来说,我们使用 encodeURIComponent() 方法的时候要比使用 encodeURI() 更多,因为在实践中更常见的是对查询字符串参数而不是对基础 URI 编码

与 encodeURI() 和 encodeURIComponent() 方法对应的两个方法分别是 decodeURI() 和 decodeURIComponent()。其中, decodeURI() 只能堆使用 encodeURI() 替换的字符进行解码。 decodeURIComponent() 能够解码使用 encodeURIComponent() 编码的所有字符,即它可以解码任何特殊字符的编码。

var uri = "http%3A%2F%2Fwww.xxx.com%2Fiii.html";

alert(decodeURI(uri)); // http%3A%2F%2Fwww.xxx.com%2Fiii.html
alert(decodeURIComponent(uri)); // http://www.xxx.com/iii.html

URI 方法 encodeURI()、encodeURIComponent()、decodeURI()和decodeURIComponent() 用于代替已经被 ECMA-262第三版飞起的 escape() 和 unescape() 方法。

URI 方法能够编码所有 Unicode 字符,而原来的方法只能正切地编码 ASCLL 字符。因此在开发实践中,特别是在产品级的代码中,一定要使用 URI 方法,不要使用 escape() 和 unescape() 方法。

eval() 方法

eval() 方法就像是一个完整的 ECMAScript 解析器,它只接受一个参数,即要执行的 ECMAScript (或 JavaScript) 字符串。

eval("alert('hi')");

这段代码的作用等价于下面这行代码:

alert("hi");

当解析器发现代码中调用 eval() 方法时,他会将传入的参数当做实际的 ECMAScript 语句来解析, 然后把执行结果插入到原位置。

通过 eval() 执行的代码被认为是包含该次调用的执行环境的一部分,因此被执行的代码具有与该执行环境相同的作用域链。

这意味着通过 eval() 执行的代码可以引用在包含环境中定义的变量。

var msg = "hello world";
eval("alert(msg)");  // hello world

eval("function sayHi() { alert('hi'); }");
sayHi()

严格模式下,在外部访问不到 eval() 中创建的任何变量或函数,因此上面例子都会导致错误。同样,在严格模式下,为 eval() 赋值也会导致错误:

"use strict"
eval = "hi"  // Uncaught SyntaxError: Unexpected eval or arguments in strict mode

能够解释代码字符串的能力非常强大,但也非常危险。

因此在使用 eval() 时必须谨慎,特别是用在执行用户输入的数据的情况下。

否则,可能会有恶意用户输入威胁你的站点或应用程序安全的代码(即所谓的代码注入)

Global对象的属性

Global 对象还包含一些属性,例如,特殊的值 undefined、 NaN 以及 Infinity 都是 Global 对象的属性。 此外,所有原生引用类型的构造函数,像 Object 和 Function,也都是 Global 对象的属性。

属性 说明 属性 说明
undefined 特殊值 undefined Date 构造函数 Date
Nan 特殊值 Nan RegExp 构造函数 RegExp
Infinity 特殊值 Infinity Error 构造函数 Error
Object 构造函数 Object EvalError 构造函数 EvalError
Array 构造函数 Array RangeError 构造函数 RangeError
Function 构造函数 Function ReferenceError 构造函数 ReferenceError
Boolean 构造函数 Boolean SyntaxError 构造函数 SyntaxError
String 构造函数 String TypeError 构造函数 TypeError
Number 构造函数 Number URIError 构造函数 URIError

ECMAScript 5 明确禁止给 undefined、NaN 和 Infinity 赋值,这样做即使在非严格模式下也会导致错误。

window 对象

ECMAScript 虽然没有指出如何直接访问Global 对象,但 Web浏览器都是讲这个全局对象作为 window 对象的一部分加以实现的。因此,在全局作用域中声明的所有变量和函数,就都成为了 window 对象的属性。

var color = "red";

function sayColor() {
    alert(window.color);
}

window.sayColor(); // red

在 sayColor() 内部,通过 window.color 来访问 color 变量,说明变量是 window 对象的属性。

使用 window.sayColor() 来直接通过 window 对象调用这个函数,说明 sayColor() 也是绑定在 window 对象下的。

var global = function() {
    return this;
}

通过简单地返回 this 来取得 Global 对象,在任何环境下都是可行的。

Math对象

ECMAScript 还为保存数学公式和信息提供了一个公共位置,即 Math 对象。Math 对象提供了复制完成计算的属性和方法。

Math 对象的属性

属性 说明
Math.E 自然对数的底数,即常亮e的值
Math.LN10 10的自然对数
Math.LN2 2的自然对数
Math.LOG2E 以2为底e的对数
Math.LOG10E 以10为底e的对数
Math.PI π的值
Math.SQRT1_2 1/2的平方根(即2的平方根的倒数
Math.SQRT2 2的平方根

min() 和 max() 方法

确定一组数值中的最小值和最大值

var max = Math.max(3, 54, 32, 16);
alert(max); // 54

var min = Math.min(3, 54, 32, 16);
Alert(min); // 3

要找到数组中的最大或最小值可以使用下面方法:

var values = [1, 2, 3, 4, 5, 6, 7, 8];
var max = Math.max.apply(Math, values);
alert(max) // 8

舍入方法

将小数舍入为整数的方法:

  • Math.ceil() 执行向上舍入,即它总是将数值向上舍入为最接近的整数;
  • Math.floor() 执行向下舍入,即它总是将数值向下舍入为最接近的整数;
  • Math.round() 执行标准舍入,即它总是将数值四舍五入为最接近的整数;
alert(Math.ceil(25.9)); //26
alert(Math.ceil(25.5)); //26
alert(Math.ceil(25.1)); //26

alert(Math.round(25.9)); // 26
alert(Math.round(25.5)); // 26
alert(Math.round(25.1)); // 25

alert(Math.floor(25.9)); // 25
alert(Math.floor(25.5)); // 25
alert(Math.floor(25.1)); // 25

random() 方法

Math.random() 方法返回介于 0 和 1 之间一个随机数,不包括 0 和 1.

Math.random() 可以用于随机显示一些名人名言或新闻事件。

值 = Math.floor(Math.random()) * 可能值的总数 + 第一个可能的值)

公式中用到了 Math.floor() 方法,这是因为 Math.random() 总返回一个小数值。而用这个小数值乘以一个整数,然后在加上一个整数,最终结果仍然还是一个小数。

如果想选择一个 1 到 10 之间的数值,可以像下面例子这样实现:

var num = Math.floor(Math.random() * 10 + 1);

如果想要选择一个介于 2 到 10 之间的值:

var num = Math.floor(Math.random() * 9 + 2);

从 2 数到 10 要数9个数,因此可能值的总数就是 9,而第一个可能的值就是 2.多数情况下,其实都可以通过一个函数来计算可能值的总数和第一个可能值:

function selectFrom(lowerValue, upperValue) {
    var choices = upperValue - lowerValue + 1;
    return Math.floor(Math.random() * choices + lowerValue);
}

var num = selectFrom(2, 10);
alert(num); // 介于 2 和 10 之间(包括 2 和 10)的一个数值

// 利用这个函数,可以方便地从数组中随机取出一项
var colors = ["red", "green", "blue", "yellow", "black", "purple", "brown"];
var color = colors[selectFrom(0, colors.length - 1)];
alert(color);

其他方法

Math 对象中还包含其他一些与完成各种简单或复杂计算有关的方法:

方法 说明 方法 说明
Math.abs(num) 返回num的绝对值 Math.asin(x) 返回x的反正炫值
Math.exp(num) 返回Math.E的num次幂 Math.atan(x) 返回x的反正切值
Math.log(num) 返回num的自然对数 Math.atan2(y, x) 返回y/x的反正切值
Math.pow(num) 返回num的power次幂 Math.cos(x) 返回x的余弦值
Math.sqrt(num) 返回num的平方根 Math.sin(x) 返回x的正炫值
Math.acos(x) 返回num的反余弦值 Math.tan(x) 返回x的正切值
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容