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" 指令

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

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

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

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

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

String.trim()

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

实例

  1. var str = " Hello World! ";
  2. alert(str.trim());

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

Array.isArray()

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

实例

  1. function myFunction() {
  2. var fruits = ["Banana", "Orange", "Apple", "Mango"];
  3. var x = document.getElementById("demo");
  4. x.innerHTML = Array.isArray(fruits);
  5. }

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

Array.forEach()

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

实例

  1. var txt = "";
  2. var numbers = [45, 4, 9, 16, 25];
  3. numbers.forEach(myFunction);
  4.  
  5. function myFunction(value) {
  6. txt = txt + value + "<br>";
  7. }

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

Array.map()

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

实例

  1. var numbers1 = [45, 4, 9, 16, 25];
  2. var numbers2 = numbers1.map(myFunction);
  3.  
  4. function myFunction(value) {
  5. return value * 2;
  6. }

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

Array.filter()

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

实例

  1. var numbers = [45, 4, 9, 16, 25];
  2. var over18 = numbers.filter(myFunction);
  3.  
  4. function myFunction(value) {
  5. return value > 18;
  6. }

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

Array.reduce()

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

实例

  1. var numbers1 = [45, 4, 9, 16, 25];
  2. var sum = numbers1.reduce(myFunction);
  3.  
  4. function myFunction(total, value) {
  5. return total + value;
  6. }

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

Array.reduceRight()

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

实例

  1. var numbers1 = [45, 4, 9, 16, 25];
  2. var sum = numbers1.reduceRight(myFunction);
  3.  
  4. function myFunction(total, value) {
  5. return total + value;
  6. }

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

Array.every()

这个例子检查是否所有值都超过 18:

实例

  1. var numbers = [45, 4, 9, 16, 25];
  2. var allOver18 = numbers.every(myFunction);
  3.  
  4. function myFunction(value) {
  5. return value > 18;
  6. }

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

Array.some()

这个例子检查某些值是否超过 18:

实例

  1. var numbers = [45, 4, 9, 16, 25];
  2. var allOver18 = numbers.some(myFunction);
  3.  
  4. function myFunction(value) {
  5. return value > 18;
  6. }

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

Array.indexOf()

检索数组中的某个元素值并返回其位置:

实例

  1. var fruits = ["Banana", "Orange", "Apple", "Mango"];
  2. var a = fruits.indexOf("Apple");

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

Array.lastIndexOf()

Array.lastIndexOf() 与 Array.indexOf() 类似,但是从数组结尾处开始检索。

实例

  1. var fruits = ["Banana", "Orange", "Apple", "Mango"];
  2. var a = fruits.lastIndexOf("Apple");

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

JSON.parse()

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

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

  1. '{"name":"Bill", "age":62, "city":"Seatle"}'

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

  1. var obj = JSON.parse('{"name":"Bill", "age":62, "city":"Seatle"}');

请在我们的 JSON 教程 中学习更多内容。

JSON.stringify()

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

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

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

  1. var obj = {"name":"Bill", "age":62, "city":"Seatle"};

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

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

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

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

实例

  1. var obj = {"name":"Bill", "age":62, "city":"Seatle"};
  2. var myJSON = JSON.stringify(obj);
  3. document.getElementById("demo").innerHTML = myJSON;

请在我们的 JSON 教程 中学习更多内容。

Date.now()

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

实例

  1. var timInMSs = Date.now();

Date.now() 的返回与在 Date 对象上执行 getTime() 的结果相同。

请在 JS 日期 中学习更多。

属性 Getter 和 Setter

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

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

实例

  1. // 创建对象:
  2. var person = {
  3. firstName: "Bill",
  4. lastName : "Gates",
  5. get fullName() {
  6. return this.firstName + " " + this.lastName;
  7. }
  8. };
  9.  
  10. // 使用 getter 显示来自对象的数据:
  11. document.getElementById("demo").innerHTML = person.fullName;

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

实例

  1. var person = {
  2. firstName: "Bill",
  3. lastName : "Gates",
  4. language : "NO",
  5. get lang() {
  6. return this.language;
  7. },
  8. set lang(value) {
  9. this.language = value;
  10. }
  11. };
  12.  
  13. // 使用 setter 设置对象属性:
  14. person.lang = "en";
  15.  
  16. // 使用 getter 显示来自对象的数据:
  17. document.getElementById("demo").innerHTML = person.lang;

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

实例

  1. var person = {
  2. firstName: "Bill",
  3. lastName : "Gates",
  4. language : "NO",
  5. set lang(value) {
  6. this.language = value.toUpperCase();
  7. }
  8. };
  9.  
  10. // 使用 setter 设置对象属性:
  11. person.lang = "en";
  12.  
  13. // 显示来自对象的数据:
  14. document.getElementById("demo").innerHTML = person.language;

请在 JS 对象访问器 中学习更多有关 Getter 和 Setter 的知识。

新的对象属性和方法

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

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

实例

  1. // 创建对象:
  2. var person = {
  3. firstName: "Bill",
  4. lastName : "Gates",
  5. language : "NO",
  6. };
  7.  
  8. // 更改属性:
  9. Object.defineProperty(person, "language", {
  10. value: "EN",
  11. writable : true,
  12. enumerable : true,
  13. configurable : true
  14. });
  15.  
  16. // 枚举属性
  17. var txt = "";
  18. for (var x in person) {
  19. txt += person[x] + "<br>";
  20. }
  21. document.getElementById("demo").innerHTML = txt;

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

实例

  1. // 创建对象:
  2. var person = {
  3. firstName: "Bill",
  4. lastName : "Gates",
  5. language : "NO",
  6. };
  7.  
  8. // 更改属性:
  9. Object.defineProperty(person, "language", {
  10. value: "EN",
  11. writable : true,
  12. enumerable : false,
  13. configurable : true
  14. });
  15.  
  16. // 枚举属性
  17. var txt = "";
  18. for (var x in person) {
  19. txt += person[x] + "<br>";
  20. }
  21. document.getElementById("demo").innerHTML = txt;

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

实例

  1. // 创建对象:
  2. var person = {
  3. firstName: "Bill",
  4. lastName : "Gates",
  5. language : "NO"
  6. };
  7.  
  8. // 更改属性:
  9. Object.defineProperty(person, "language", {
  10. get : function() { return language },
  11. set : function(value) { language = value.toUpperCase()}
  12. });
  13.  
  14. // 更改语言
  15. person.language = "en";
  16.  
  17. // 显示语言
  18. document.getElementById("demo").innerHTML = person.language;

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

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

请在 对象 ECMAScript5 中学习更多内容。

对字符串的属性访问

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

实例

  1. var str = "HELLO WORLD";
  2. str.charAt(0); // 返回 H

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

实例

  1. var str = "HELLO WORLD";
  2. str[0]; // 返回 H

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

请在 JS 字符串方法 中学习更多内容。

尾随逗号(Trailing Commas)

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

Object 实例

  1. person = {
  2. firstName: "Bill",
  3. lastName: " Gates",
  4. age: 62,
  5. }

Array 实例

  1. points = [
  2. 1,
  3. 5,
  4. 10,
  5. 25,
  6. 40,
  7. 100,
  8. ];

警告!!!

Internet Explorer 8 将崩溃。

JSON 不允许使用尾随逗号。

JSON 对象:

  1. // 允许:
  2. var person = '{"firstName":"Bill", "lastName":"Gates", "age":62}'
  3. JSON.parse(person)
  4.  
  5. // 不允许:
  6. var person = '{"firstName":"Bill", "lastName":"Gates", "age":62,}'
  7. JSON.parse(person)

JSON 数组:

  1. // 允许:
  2. points = [40, 100, 1, 5, 25, 10]
  3.  
  4. // 不允许:
  5. points = [40, 100, 1, 5, 25, 10,]

多行字符串

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

实例

  1. "Hello \
  2. Kitty!";

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

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

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

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

实例

  1. "Hello " +
  2. "Kitty!";

保留字作为属性名称

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

对象实例

  1. var obj = {name: "Bill", new: "yes"}

ES5(ECMAScript 5)浏览器支持

Chrome 23、IE 10 和 Safari 6 是第一批完全支持 ECMAScript 5 的浏览器:

Chrome 23 IE10 / Edge Firefox 21 Safari 6 Opera 15
2012 年 9 月 2012 年 9 月 2013 年 4 月 2012 年 7 月 2013 年 7 月