ECMAScript 5 - JavaScript 5

ECMAScript 5 是什么?

ECMAScript 5 也称为 ES5 和 ECMAScript 2009。

本章介绍 ES5 的一些最重要的特性。


ECMAScript 5 特性

这些是 2009 年发布的新特性:

  • "use strict" 指令
  • String.trim()
  • Array.isArray()
  • Array.forEach()
  • Array.map()
  • Array.filter()
  • Array.reduce()
  • Array.reduceRight()
  • Array.every()
  • Array.some()
  • Array.indexOf()
  • Array.lastIndexOf()
  • JSON.parse()
  • JSON.stringify()
  • Date.now()
  • 属性 Getter 和 Setter
  • 新的对象属性和方法

ECMAScript 5 语法更改

  • 对字符串的属性访问 [ ]
  • 数组和对象字面量中的尾随逗号
  • 多行字符串字面量
  • 作为属性名称的保留字

严格模式

use strict” 定义 JavaScript 代码应该以“严格模式”执行。

例如,使用严格模式,不能使用未声明的变量。

您可以在所有程序中使用严格模式。它可以帮助您编写更清晰的代码,例如阻止您使用未声明的变量。

use strict” 只是一个字符串表达式。旧浏览器如果不理解它们就不会抛出错误。

请阅读 JS 严格模式 中的更多内容。


String.trim()

String.trim() 删除字符串两端的空白字符。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript String.trim()</h1>
  5. <p>点击这个按钮来输出已删除空白字符的字符串。</p>
  6. <button onclick="myFunction()">试一试</button>
  7. <p><strong>注释:</strong>Internet Explorer 8 或更低版本不支持 trim() 方法。</p>
  8. <script>
  9. function myFunction() {
  10. var str = " Hello World! ";
  11. alert(str.trim());
  12. }
  13. </script>
  14. </body>
  15. </html>

请在 JS 字符串方法 中阅读更多内容。


数组的 isArray() 方法

isArray() 方法检查对象是否为数组。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数组的 isArray() 方法</h1>
  5. <p>单击按钮以检查“fruits”是否为数组。</p>
  6. <button onclick="myFunction()">试一试</button>
  7. <p id="demo">
  8. <script>
  9. function myFunction() {
  10. var fruits = ["香蕉", "橘子", "苹果", "芒果"];
  11. var x = document.getElementById("demo");
  12. x.innerHTML = Array.isArray(fruits);
  13. }
  14. </script>
  15. </body>
  16. </html>

请在 JS 数组 中阅读更多内容。


数组的 forEach() 方法

forEach() 方法为每个数组元素调用一次函数。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数组的 forEach() 方法</h1>
  5. <p>为每个数组元素调用一次函数。</p>
  6. <p id="demo">
  7. <script>
  8. var txt = "";
  9. var numbers = [45, 4, 9, 16, 25];
  10. numbers.forEach(myFunction);
  11. document.getElementById("demo").innerHTML = txt;
  12. function myFunction(value) {
  13. txt = txt + value + "<br>";
  14. }
  15. </script>
  16. </body>
  17. </html>

请在 JS 数组迭代方法 中学习更多内容。


数组的 map() 方法

这个例子给每个数组值乘以 2:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数组的 map() 方法</h1>
  5. <p>通过对每个数组元素执行函数来创建新数组。</p>
  6. <p id="demo">
  7. <script>
  8. var numbers1 = [45, 4, 9, 16, 25];
  9. var numbers2 = numbers1.map(myFunction);
  10. document.getElementById("demo").innerHTML = numbers2;
  11. function myFunction(value, index, array) {
  12. return value * 2;
  13. }
  14. </script>
  15. </body>
  16. </html>

数组的 filter() 方法

此例用值大于 18 的元素创建一个新数组:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数组的 filter() 方法</h1>
  5. <p>使用通过测试的所有数组元素创建一个新数组。</p>
  6. <p id="demo">
  7. <script>
  8. var numbers = [45, 4, 9, 16, 25];
  9. var over18 = numbers.filter(myFunction);
  10. document.getElementById("demo").innerHTML = over18;
  11. function myFunction(value, index, array) {
  12. return value > 18;
  13. }
  14. </script>
  15. </body>
  16. </html>

数组的 reduce() 方法

这个例子确定数组中所有数的总和:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数组的 reduce() 方法</h1>
  5. <p>此例确定数组中所有数字的总和:</p>
  6. <p id="demo">
  7. <script>
  8. var numbers = [45, 4, 9, 16, 25];
  9. var sum = numbers.reduce(myFunction);
  10. document.getElementById("demo").innerHTML = "The sum is " + sum;
  11. function myFunction(total, value, index, array) {
  12. return total + value;
  13. }
  14. </script>
  15. </body>
  16. </html>

JSON.parse()

JSON 的一个常见用途是从 Web 服务器接收数据。

想象一下,您从Web服务器收到这条文本字符串:

  1. '{"name":"埃隆马斯克", "age":50, "city":"新泽西"}'

JavaScript 函数 JSON.parse() 用于将文本转换为 JavaScript 对象:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>用 JSON 字符串创建对象</h1>
  5. <p id="demo">
  6. <script>
  7. var txt = '{"name":"埃隆马斯克", "age":50, "city":"新泽西"}'
  8. var obj = JSON.parse(txt);
  9. document.getElementById("demo").innerHTML = obj.name + ", " + obj.age;
  10. </script>
  11. </body>
  12. </html>

JSON.stringify()

JSON 的一个常见用途是将数据发送到Web服务器。

将数据发送到 Web 服务器时,数据必须是字符串。

想象一下,我们在 JavaScript 中有这个对象:

  1. var obj = {"name":"埃隆马斯克", "age":50, "city":"新泽西"}

请使用 JavaScript 函数 JSON.stringify() 将其转换为字符串。

  1. var myJSON = JSON.stringify(obj);

结果将是遵循 JSON 表示法的字符串。

myJSON 现在是一个字符串,准备好发送到服务器:


Date.now()

Date.now() 返回自零日期(1970 年 1 月 1 日 00:00:00:00)以来的毫秒数。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript Date.now()</h1>
  5. <p>Date.now() 是ECMAScript 5(2009)中的新功能:</p>
  6. <p id="demo1">
  7. <p id="demo2">
  8. <script>
  9. document.getElementById("demo1").innerHTML = Date.now();
  10. var d = new Date();
  11. document.getElementById("demo2").innerHTML = d.getTime();
  12. </script>
  13. </body>
  14. </html>

属性 Getter 和 Setter

ES5 允许您使用类似于获取或设置属性的语法来定义对象方法。

这个例子为名为 fullName 的属性创建一个 getter

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript Getter 和 Setter</h1>
  5. <p>Getter 和 Setter 允许您通过方法获取和设置属性。</p>
  6. <p>此例为名为 fullName 的属性创建一个 getter。</p>
  7. <p id="demo">
  8. <script>
  9. // 创建对象:
  10. var person = {
  11. firstName: "埃隆",
  12. lastName : "马斯克",
  13. get fullName() {
  14. return this.firstName + " " + this.lastName;
  15. }
  16. };
  17. // 使用 getter 来显示来自对象的数据:
  18. document.getElementById("demo").innerHTML = person.fullName;
  19. </script>
  20. </body>
  21. </html>

这个例子为语言属性创建一个 setter 和一个 getter

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript Getter 和 Setter</h1>
  5. <p>Getter 和 Setter 允许您通过方法获取和设置属性。</p>
  6. <p>此例为 language 属性创建 setter 和 getter。</p>
  7. <p id="demo">
  8. <script>
  9. // 创建对象:
  10. var person = {
  11. firstName: "埃隆",
  12. lastName : "马斯克",
  13. language : "NO",
  14. get lang() {
  15. return this.language;
  16. },
  17. set lang(value) {
  18. this.language = value;
  19. }
  20. };
  21. // 使用 setter 设置对象属性:
  22. person.lang = "en";
  23. // 使用 getter 显示来自对象的数据:
  24. document.getElementById("demo").innerHTML = person.lang;
  25. </script>
  26. </body>
  27. </html>

这个例子使用 setter 来确保语言的大写更新:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript Getter 和 Setter</h1>
  5. <p>Getter 和 Setter 允许您通过方法获取和设置属性。</p>
  6. <p>此例具有修改的 setter 以保护语言的大写更新。</p>
  7. <p id="demo">
  8. <script>
  9. // Create an object:
  10. var person = {
  11. firstName: "埃隆",
  12. lastName : "马斯克",
  13. language : "",
  14. set lang(value) {
  15. this.language = value.toUpperCase();
  16. }
  17. };
  18. // Set an object property using a setter:
  19. person.lang = "en";
  20. // Display data from the object:
  21. document.getElementById("demo").innerHTML = person.language;
  22. </script>
  23. </body>
  24. </html>

新的对象属性和方法

Object.defineProperty() 是 ES5 中的新对象方法。

它允许您定义对象属性和/或更改属性的值和/或元数据。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta content="text/html; charset=iso-8859-2" http-equiv="Content-Type">
  5. </head>
  6. <body>
  7. <h1>JavaScript defineProperty()</h1>
  8. <p id="demo">
  9. <script>
  10. // 创建对象:
  11. var person = {
  12. firstName: "埃隆",
  13. lastName : "马斯克",
  14. language : "NO",
  15. };
  16. // 更改属性:
  17. Object.defineProperty(person, "language", {
  18. value: "EN",
  19. writable : true,
  20. enumerable : true,
  21. configurable : true
  22. });
  23. // 枚举属性
  24. txt = "";
  25. for (var x in person) {
  26. txt += person[x] + "<br>";
  27. }
  28. document.getElementById("demo").innerHTML = txt;
  29. </script>
  30. </body>
  31. </html>

下一个例子是相同的代码,但它隐藏了枚举中的语言属性:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript defineProperty()</h1>
  5. <p id="demo">
  6. <script>
  7. // 创建对象:
  8. var person = {
  9. firstName: "埃隆",
  10. lastName : "马斯克",
  11. language : "NO",
  12. };
  13. // 更改属性:
  14. Object.defineProperty(person, "language", {
  15. value: "EN",
  16. writable : true,
  17. enumerable : false,
  18. configurable : true
  19. });
  20. // 枚举属性:
  21. txt = "";
  22. for (var x in person) {
  23. txt += person[x] + "<br>";
  24. }
  25. document.getElementById("demo").innerHTML = txt;
  26. </script>
  27. </body>
  28. </html>

此例创建一个 setter 和 getter 来确保语言的大写更新:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript defineProperty()</h1>
  5. <p id="demo">
  6. <script>
  7. // 创建对象:
  8. var person = {
  9. firstName: "埃隆",
  10. lastName : "马斯克",
  11. language : "NO"
  12. };
  13. // 更改属性:
  14. Object.defineProperty(person, "language", {
  15. get : function() { return language },
  16. set : function(value) { language = value.toUpperCase()}
  17. });
  18. // 修改语言:
  19. person.language = "en";
  20. // 显示语言:
  21. document.getElementById("demo").innerHTML = person.language;
  22. </script>
  23. </body>
  24. </html>

ECMAScript 5 为 JavaScript 添加了许多新的对象方法:

  1. ES5 新的对象方法
  2. // 添加或更改对象属性
  3. Object.defineProperty(object, property, descriptor)
  4. // 添加或更改多个对象属性
  5. Object.defineProperties(object, descriptors)
  6. // 访问属性
  7. Object.getOwnPropertyDescriptor(object, property)
  8. // 将所有属性作为数组返回
  9. Object.getOwnPropertyNames(object)
  10. // 将可枚举属性作为数组返回
  11. Object.keys(object)
  12. // 访问原型
  13. Object.getPrototypeOf(object)
  14. // 防止向对象添加属性
  15. Object.preventExtensions(object)
  16. // 如果可以将属性添加到对象,则返回 true
  17. Object.isExtensible(object)
  18. // 防止更改对象属性(而不是值)
  19. Object.seal(object)
  20. // 如果对象被密封,则返回 true
  21. Object.isSealed(object)
  22. // 防止对对象进行任何更改
  23. Object.freeze(object)
  24. // 如果对象被冻结,则返回 true
  25. Object.isFrozen(object)

对字符串的属性访问

charAt() 方法返回字符串中指定索引(位置)的字符:

实例
  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 字符串方法</h1>
  5. <p>charAt() 方法返回字符串中给定位置的字符:</p>
  6. <p id="demo">
  7. <script>
  8. var str = "HELLO WORLD";
  9. document.getElementById("demo").innerHTML = str.charAt(0);
  10. </script>
  11. </body>
  12. </html>

ECMAScript 5 允许对字符串进行属性访问:

实例
  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 字符串方法</h1>
  5. <p>ECMAScript 5 字符串的属性访问:</p>
  6. <p id="demo">
  7. <script>
  8. var str = "HELLO WORLD";
  9. document.getElementById("demo").innerHTML = str[0];
  10. </script>
  11. </body>
  12. </html>

对字符串的属性访问可能有点不可预测。


尾随逗号(Trailing Commas)

ECMAScript 5 允许在对象和数组定义中使用尾随逗号:

  1. person = {
  2. firstName: "埃隆",
  3. lastName: " 马斯克",
  4. age: 50,
  5. }
Array 实例
  1. points = [
  2. 1,
  3. 5,
  4. 10,
  5. 25,
  6. 40,
  7. 100,
  8. ];

JSON 不允许在末尾使用逗号。Internet Explorer 8 将崩溃。

JSON 对象:
  1. // 允许:
  2. var person = '{"firstName":"埃隆", "lastName":"马斯克", "age":50}'
  3. JSON.parse(person)
  4. // 不允许:
  5. var person = '{"firstName":"埃隆", "lastName":"马斯克", "age":50,}'
  6. JSON.parse(person)
JSON 数组:
  1. // 允许:
  2. points = [40, 100, 1, 5, 25, 10]
  3. // 不允许:
  4. points = [40, 100, 1, 5, 25, 10,]

多行字符串

如果使用反斜杠转义,ECMAScript 5 允许多行的字符串文字(字面量):

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 字符串</h1>
  5. <p>您可以使用反斜杠在文本字符串中断开代码行。</p>
  6. <p id="demo">
  7. <script>
  8. document.getElementById("demo").innerHTML = "Hello \
  9. Dolly!";
  10. </script>
  11. </body>
  12. </html>

\ 方法可能没有得到普遍的支持。

较旧的浏览器可能会以不同的方式处理反斜杠周围的空格。

一些旧的浏览器不允许 \ 字符后面的空格。

分解字符串文字的一种更安全的方法是使用字符串添加:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 字符串</h1>
  5. <p>打破字符串中代码行的最安全方法是使用字符串添加。</p>
  6. <p id="demo">
  7. <script>
  8. document.getElementById("demo").innerHTML = "Hello " +
  9. "Dolly!";
  10. </script>
  11. </body>
  12. </html>

保留词作为属性名称

ECMAScript 5允许保留词作为属性名称:

对象实例
  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>ECMAScript 5</h1>
  5. <p>ECMAScript 5 允许保留字作为属性名称:</p>
  6. <p id="demo">
  7. <script>
  8. var obj = {name: "比尔", new: "yes"};
  9. document.getElementById("demo").innerHTML = obj.new;
  10. </script>
  11. </body>
  12. </html>

分类导航