Maayurri's blog

JS在ES6标准下的改进以及容易混淆的地方

Posted on 3 mins

以下是 JavaScript ES6(ECMAScript 2015)的一些重要改进,并附带了在使用这些新特性时,可能与旧版语法混淆的情况或示例。


1. letconst 替代 var

改进:

容易混淆的场景:

示例:

// var 的怪异行为
function testVar() {
  for (var i = 0; i < 3; i++) {
    setTimeout(() => console.log(i), 0);
  }
  // 输出 3, 3, 3
}

function testLet() {
  for (let i = 0; i < 3; i++) {
    setTimeout(() => console.log(i), 0);
  }
  // 输出 0, 1, 2
}

2. 箭头函数(Arrow Functions)

改进:

容易混淆的场景:

示例:

const obj = {
  value: 42,
  regularFunction: function() {
    setTimeout(function() {
      // 这里的 this 指向 setTimeout 自身的上下文(浏览器环境中通常是 window)
      console.log("regularFunction this.value:", this.value); // undefined
    }, 0);
  },
  arrowFunction: function() {
    setTimeout(() => {
      // 箭头函数的 this 指向 obj
      console.log("arrowFunction this.value:", this.value); // 42
    }, 0);
  }
};

obj.regularFunction();
obj.arrowFunction();

3. 模板字符串(Template Literals)

改进:

容易混淆的场景:

示例:

let name = "Alice";
let oldWay = "Hello, " + name + "! How are you?";
let newWay = `Hello, ${name}! How are you?`;

4. 参数默认值(Default Parameters)

改进:

容易混淆的场景:

示例:

function greet(name = "stranger") {
  console.log(`Hello, ${name}`);
}

greet();            // Hello, stranger
greet("Bob");       // Hello, Bob
greet(undefined);   // Hello, stranger

5. 解构赋值(Destructuring)

改进:

容易混淆的场景:

示例:

// 对象解构
const user = { name: "Alice", age: 25, location: "Earth" };
const { name, age, location } = user; 
// 旧写法需要 user.name, user.age... 逐个赋值

// 数组解构
const arr = [1, 2, 3];
const [first, second, third] = arr;

6. 扩展运算符(Spread Operator ...

改进:

容易混淆的场景:

示例:

// 数组合并
const arr1 = [1, 2];
const arr2 = [3, 4];
const newArr = [...arr1, ...arr2]; // [1, 2, 3, 4]

// 旧写法可能是:arr1.concat(arr2)

7. 模块化(Modules)

改进:

容易混淆的场景:

示例:

// old.js (CommonJS 写法)
const fs = require('fs');
module.exports = {};

// new.js (ES6 模块写法)
import fs from 'fs';
export default {};

8. Class 语法糖

改进:

容易混淆的场景:

示例:

// ES5 写法
function Animal(name) {
  this.name = name;
}
Animal.prototype.speak = function() {
  console.log(this.name + " makes a noise.");
};

// ES6 Class 写法
class AnimalClass {
  constructor(name) {
    this.name = name;
  }
  speak() {
    console.log(`${this.name} makes a noise.`);
  }
}

9. Symbol 类型

改进:

容易混淆的场景:

示例:

const sym = Symbol("description");
const obj = {};
obj[sym] = "value";
console.log(obj[sym]); // "value"
console.log(obj["sym"]); // undefined

10. Generator 函数

改进:

容易混淆的场景:

示例:

function* gen() {
  yield 1;
  yield 2;
  yield 3;
}

const g = gen();
console.log(g.next()); // { value: 1, done: false }
console.log(g.next()); // { value: 2, done: false }
console.log(g.next()); // { value: 3, done: false }
console.log(g.next()); // { value: undefined, done: true }

总结