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的正切值
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容