ES6有哪些新特性

本文介绍了ES6(ECMAScript 6)的一些关键特性,包括箭头函数、解构赋值及函数参数默认值等。此外,还详细探讨了Spread Operator(展开运算符)的应用场景,如数组和对象的组装、获取除某些项外的其他项,以及如何使用ES6进行数组排序。

1.背景介绍

ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。 它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

2.知识剖析

下面是介绍几个ES6的新特性

箭头函数

ES6很有意思的一部分就是函数的快捷写法。也就是箭头函数。箭头函数最直观的三个特点。 不需要 function 关键字来创建函数, 有时可以省略 return 关键字, 继承当前上下文的 this 关键字。

                    var f = v => v;
                    f();
                    console.log('f()', f());
                    
                    var g = function (v) {
                        return v;
                        console.log('v', v);
                    }
                    g();
                    console.log('g()', g());

当你的函数有且仅有一个参数的时候,是可以省略掉括号的。 当你函数返回有且仅有一个表达式的时候可以省略{} 和 RETURN;例如:

                    var h = () => 5;
                    h();
                    console.log('h()', h());
                    
                    var i = function () {
                        return 5;
                    }
                    i();
                    console.log('i()', i());
解构赋值

ES5我们提取对象中的信息形式如下:

                       let [a,b,c]=[1,[2,3],[4]];
                        console.log(a,b,c);
                        const people = {
                            name: 'lux',
                            age: 20
                        }
                        const name = people.name
                        const age = people.age
使用ES6

现在,解构能让我们从对象或者数组里取出数据存为变量,例如

                        var l = [1, 2, 3].map(function (x) {
                            return x * x;
                        })
                        console.log('l', l);
                        let n = [1, 2, 3].map(x => x * x);
                        console.log('n', n);
函数参数默认值

不使用ES6 为函数的参数设置默认值

function foo(height, color)
{
    var height = height || 50;
    var color = color || 'red';
    //...
}
但是,当参数的布尔值为false时,是会出事情的!比如,我们这样调用foo函数: foo(0, "")

因为0的布尔值为false,这样height的取值将是50。同理color的取值为‘red’。

3.常见问题

Spread Operator展开运算符有什么用途?

4.解决方案

5.编码实战

ES6中另外一个好玩的特性就是SPREAD OPERATOR 也是三个点儿...接下来就展示一下它的用途。
组装对象或者数组:
    //数组
    const color = ['red', 'yellow']
    const colorful = [...color, 'green', 'pink']
    console.log(colorful) //[red, yellow, green, pink]

    //对象
    const alp = { fist: 'a', second: 'b'}
    const alphabets = { ...alp, third: 'c' }
    console.log(alphabets) //{ "fist": "a", "second": "b", "third": "c"

有时候我们想获取数组或者对象除了前几项或者除了某几项的其他项

    //数组
    const number = [1,2,3,4,5]
    const [first, ...rest] = number
    console.log(rest) //2,3,4,5
    //对象
    const user = {
        username: 'lux',
        gender: 'female',
        age: 19,
        address: 'peking'
    }
    const { username, ...rest } = user
    console.log(rest) //{"address": "peking", "age": 19, "gender": "female"
es6的升序降序
                    // 排序
                    // 常规升序排序
                    arr = [1, 4, 5, 3, 2, 6];
                    var o = arr.sort(function (a, b) {
                        return a - b;
                    });
                    console.log('o', o, "//常规升序排序");
                    //es6降序
                    var p = arr.sort((a, b) => b - a);
                    console.log('p', p, "//es6降序");
对于 Object 而言,还可以用于组合成新的 Object 。 (ES2017 stage-2 proposal) 当然如果有重复的属性名,右边覆盖左边
        const first = {
        a: 1,
        b: 2,
        c: 6,
        }
    const second = {
        c: 3,
        d: 4
    }
    const total = { ...first, ...second }
    console.log(total) // { a: 1, b: 2, c: 3, d: 4 }

6.扩展思考

1、Spread Operator展开运算符有什么用途?
组装对象或者数组

2、es6的升序降序?

 var p = arr.sort((a, b) => b - a);

3、ES5和ES6的区别?

ES5对字符的处理有限,无法很好地处理码点大于0xFFFF的字符。
ES6在string原生方法中支持码点大于0xFFFF的字符,取得码点或是遍历,都可以直接操作;并且对字符不同的表示方法做了统一化。
在正则表达式里新增\u \s修饰符,使得正则对特殊字符的匹配不需要开发者额外处理。

7.参考文献

10个最佳ES6特性

ES6这些就够了

ECMAScript 6 入门

<think>我们正在讨论ES5和ES6的特性差异。根据引用[1][2][3][4][5]的内容,ES6(ECMAScript 2015)是JavaScript的一个重大更新,引入了许多新特性以解决ES5的不足。下面我将详细列出ES5和ES6的主要特性差异,并解释它们之间的区别。 ### 一、ES5的新特性 ES5(ECMAScript 5)于2009年发布,主要特性包括: 1. **严格模式(Strict Mode)** 通过`"use strict";`启用,提供更严格的语法检查,避免一些常见错误[^1][^3]。 2. **JSON支持** 新增`JSON.parse()`和`JSON.stringify()`方法,用于解析和序列化JSON数据[^1][^3]。 3. **数组方法增强** 新增数组迭代方法: - `Array.prototype.forEach()` - `Array.prototype.map()` - `Array.prototype.filter()` - `Array.prototype.reduce()` - `Array.prototype.some()` - `Array.prototype.every()`[^1][^3][^5] 4. **对象属性控制** 引入`Object.defineProperty()`方法,用于定义或修改对象属性的特性(如可枚举性、可配置性、可写性等)[^1][^3]。 5. **函数绑定** 新增`Function.prototype.bind()`方法,用于永久绑定函数的`this`值[^1][^3]。 ### 二、ES6新特性 ES6(ECMAScript 2015)于2015年发布,是JavaScript的一次重大更新,主要特性包括: 1. **块级作用域变量声明** - `let`:声明块级作用域的变量 - `const`:声明块级作用域的常量(不可重新赋值)[^2][^4][^5] 2. **箭头函数(Arrow Functions)** 简化函数写法,自动绑定当前上下文的`this`值: ```javascript // ES5 var add = function(a, b) { return a + b; }; // ES6 const add = (a, b) => a + b; ``` 3. **模板字符串(Template Literals)** 支持多行字符串和嵌入表达式: ```javascript const name = "Alice"; console.log(`Hello, ${name}!`); // 输出: Hello, Alice! ``` 4. **解构赋值(Destructuring Assignment)** 从数组或对象中提取值并赋值给变量: ```javascript // 数组解构 const [x, y] = [1, 2]; // 对象解构 const { name, age } = { name: "Bob", age: 30 }; ``` 5. **类(Class)** 提供更接近传统面向对象语言的类语法: ```javascript class Person { constructor(name) { this.name = name; } sayHello() { console.log(`Hello, ${this.name}!`); } } ``` 6. **模块化(Modules)** 支持`import`和`export`语法: ```javascript // math.js export const add = (a, b) => a + b; // main.js import { add } from './math.js'; ``` 7. **Promise对象** 提供更优雅的异步编程解决方案: ```javascript const fetchData = () => new Promise((resolve, reject) => { // 异步操作 }); ``` 8. **Symbol类型** 新增基本数据类型,表示唯一值: ```javascript const id = Symbol("uniqueId"); ``` 9. **扩展运算符(Spread Operator)** 用于展开数组或对象: ```javascript const arr1 = [1, 2]; const arr2 = [...arr1, 3, 4]; // [1, 2, 3, 4] ``` 10. **函数参数默认值** 允许为函数参数设置默认值: ```javascript function greet(name = "Guest") { return `Hello, ${name}!`; } ``` ### 三、ES5与ES6的核心区别 | **特性** | **ES5** | **ES6** | **区别说明** | |--------------------|----------------------------------|----------------------------------|------------------------------| | **作用域** | 函数作用域(var) | 块级作用域(let/const) | 避免变量提升问题[^2][^4] | | **函数写法** | function关键字 | 箭头函数(=>) | 简化代码,自动绑定this | | **字符串处理** | 字符串拼接(+) | 模板字符串(``) | 支持多行和嵌入表达式 | | **异步处理** | 回调函数 | Promise/async/await | 解决回调地狱问题[^2] | | **面向对象** | 构造函数+原型 | class语法糖 | 更接近传统OOP | | **模块化** | 无原生支持(依赖CommonJS等) | 原生import/export | 浏览器直接支持模块加载 | | **数据结构** | 数组和普通对象 | 新增Set/Map/WeakSet/WeakMap | 提供更丰富的数据结构 | ### 四、实际应用场景对比 1. **变量声明** - ES5:`var`存在变量提升问题 ```javascript console.log(x); // undefined (不报错) var x = 5; ``` - ES6:`let`/`const`避免提升 ```javascript console.log(y); // ReferenceError let y = 10; ``` 2. **回调函数处理** - ES5:多层嵌套回调(回调地狱) ```javascript getData(function(a) { getMoreData(a, function(b) { // ... }); }); ``` - ES6:Promise链式调用 ```javascript getData() .then(a => getMoreData(a)) .then(b => { /* ... */ }); ``` ### 五、兼容性与工具链 | **方面** | **ES5** | **ES6** | |----------------|------------------------------|------------------------------| | **浏览器支持** | 所有主流浏览器完全支持 | 现代浏览器支持,旧浏览器需转译 | | **转译工具** | 不需要 | 需Babel等工具转译为ES5[^2] | | **开发效率** | 较低(代码冗余) | 更高(语法简洁) | > 总结:ES6通过引入块级作用域、箭头函数、类、模块化等现代语言特性,显著提升了JavaScript的开发效率和代码可维护性,是当前前端开发的主流选择[^2][^4]。对于旧浏览器环境,可通过Babel等工具将ES6代码转译为ES5。 §§相关问题§§ 1. 如何将ES6代码转换为ES5以兼容旧浏览器? 2. ES6的箭头函数与普通函数在`this`绑定上有何本质区别? 3. ES6的Class语法在底层是如何通过原型链实现的? 4. 为什么说Promise解决了回调地狱问题?请举例说明。</think>### ES5与ES6特性差异详解 #### 一、核心差异概览 | **特性分类** | **ES5** | **ES6** | **核心区别** | |--------------------|--------------------------------------|--------------------------------------|----------------------------------| | **作用域管理** | `var`(函数作用域) | `let`/`const`(块级作用域) | 避免变量提升和污染全局作用域[^4] | | **函数特性** | `function`声明 | 箭头函数、参数默认值、rest参数 | 简化语法 + 自动绑定`this`[^2] | | **面向对象** | 构造函数+原型链 | `class`语法糖 | 接近传统OOP写法[^5] | | **异步处理** | 回调函数 | `Promise`/`async/await` | 解决回调地狱[^2] | | **数据结构** | Array/Object | `Set`/`Map`/`Symbol`/`WeakMap` | 扩展数据操作能力[^5] | | **字符串处理** | 拼接字符串(`+`) | 模板字符串(`` ` ``) | 支持多行和嵌入表达式[^4] | | **模块化** | 无原生支持 | `import`/`export` | 浏览器原生模块支持[^3] | --- #### 二、ES5核心特性(2009年发布) 1. **严格模式** ```javascript "use strict"; // 禁止隐式变量声明,提高安全性[^1] ``` 2. **JSON处理** ```javascript JSON.parse('{"name":"Alice"}'); // 字符串→对象 JSON.stringify({name:"Bob"}); // 对象→字符串[^3] ``` 3. **数组方法增强** ```javascript [1,2,3].map(x => x*2); // [2,4,6] [1,2,3].filter(x => x>1); // [2,3][^5] ``` 4. **对象属性控制** ```javascript Object.defineProperty(obj, 'key', { writable: false // 设置不可变属性[^1] }); ``` --- #### 三、ES6革命性特性(2015年发布) 1. **块级作用域变量** ```javascript if (true) { let local = 10; // 仅在此块生效 const PI = 3.14; // 常量声明 } console.log(local); // ReferenceError[^4] ``` 2. **箭头函数** ```javascript // ES5 function add(a, b) { return a + b; } // ES6 const add = (a, b) => a + b; // 自动绑定外层this[^2] ``` 3. **解构赋值** ```javascript // 数组解构 const [x, y] = [1, 2]; // x=1, y=2 // 对象解构 const { name, age } = { name: "Alice", age: 30 };[^4] ``` 4. **类与继承** ```javascript class Person { constructor(name) { this.name = name; } greet() { console.log(`Hello, ${this.name}!`); } } class Student extends Person { constructor(name, grade) { super(name); this.grade = grade; } }[^5] ``` 5. **Promise异步处理** ```javascript fetch('/api/data') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error(error));[^2] ``` 6. **模块化系统** ```javascript // math.js export const add = (a, b) => a + b; // app.js import { add } from './math.js'; console.log(add(2, 3)); // 5[^3] ``` --- #### 四、关键区别解析 1. **作用域机制** - ES5:`var`存在变量提升 ```javascript console.log(x); // undefined (不报错) var x = 5; ``` - ES6:`let`/`const`形成暂时性死区 ```javascript console.log(y); // ReferenceError let y = 10; ``` 2. **`this`绑定差异** - ES5函数中`this`由调用者决定 ```javascript const obj = { value: 10, getValue: function() { console.log(this.value); // 动态绑定 } }; ``` - ES6箭头函数继承外层`this` ```javascript const obj = { value: 10, getValue: () => { console.log(this.value); // 始终指向定义时的this } }; ``` 3. **循环机制优化** ES5的`for-in`循环问题: ```javascript var arr = [10, 20, 30]; for (var i in arr) { console.log(i); // 输出"0","1","2" (字符串!) } ``` ES6的`for-of`解决方案: ```javascript const arr = [10, 20, 30]; for (const item of arr) { console.log(item); // 直接输出数字 10,20,30 } ``` --- #### 五、兼容性与开发建议 | **场景** | **推荐方案** | |------------------|--------------------------------------| | 旧浏览器兼容 | 使用Babel转译ES6ES5[^2] | | 常量声明 | 优先用`const`,次选用`let` | | 异步操作 | 用`Promise`+`async/await`替代回调 | | 模块组织 | 使用ES6模块化代替IIFE[^3] | | 框架开发 | Vue/React全面拥抱ES6特性 | > 总结:ES6通过**块级作用域**、**箭头函数**、**类语法**、**Promise**等特性,解决了ES5在作用域管理、异步处理、代码组织等方面的痛点,使JavaScript成为更现代化的开发语言[^2][^4]。当前主流项目应优先采用ES6+语法开发,通过构建工具保证兼容性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值