JS:ES6(ES2015)新特性之常量、箭头函数、解构赋值

简介: JS:ES6(ES2015)新特性之常量、箭头函数、解构赋值

几个概念

1、JavaScript VS ECMAScript


ECMAScript 一种标准

JavaScript 一种标准的实现


2、ES6 == ES2015


ES6 版本号

ES2015 发布年份


3、新特性

常量 Const

箭头函数 Arrow Function

解构赋值 Desctructuring


4、准备工具

开发工具 VSCode

插件 Live Server

浏览器 Chrome


const常量

// ES3声明常量,可以被修改
var BASE_NAME = "Tom";
BASE_NAME = "jack";
console.log(BASE_NAME);
// jack
// ES5声明常量,不可以被修改
Object.defineProperty(window, "es", {
    value: "Tom",
    writable: false
});
es = "Jack";
console.log(es);
// Tom
// ES6声明常量,不可以被修改
const es = "Tom";
es = "Jack"; 
// Uncaught TypeError: Assignment to constant variable.

const声明常量的特性:


如果声明的时候没有赋值,会抛出异常

不允许重复声明

不属于顶层对象window

不存在变量提升

必须先定义再使用,暂时性死区

存在块级作用域

如果const声明的是引用类型,内部元素可以被改变,

需要使用冻结,防止内部元素被改变


浅层冻结


const obj = {
    name: "Tom"
};
// 浅层冻结
Object.freeze(obj);
const arr = ['Tom'];
// 浅层冻结
Object.freeze(arr);
obj.name = "Jack";
arr[0] = "Jack";
console.log(obj);
console.log(arr);

深层递归冻结


/**
* 深层递归冻结
*/
function deepFreeze(obj){
    Object.freeze(obj);
    Object.keys(obj).forEach(key=>{
        if(typeof obj[key] === 'object'){
            deepFreeze(obj[key]);
        }                
    })
}
const obj = {
    name: "Tom",
    pets: ["dog", "cat"]
};
// Object.freeze(obj);
deepFreeze(obj);
obj.pets[0] = "pig";
console.log(obj);

声明变量关键字:

优先使用const,如果需要被改变再使用let


箭头函数

定义函数


function sum1(x, y){
    return x + y;
}
const sum2 = function(x, y){
    return x + y;
}
// 使用箭头函数
const sum3 = (x, y) => {
    return x + y;
}
const sum4 = (x, y) => x + y;
const sum5 = x => {/*方法体*/};

以下情况不适用箭头函数


场景1: 事件回调函数


<button id="btn">按钮</button>
<script>
  const btn = document.querySelector("#btn");
  btn.addEventListener("click", function () {
    this.style.backgroundColor = "red";
  });
</script>

场景2:对象内方法


const person = {
  name: "Tom",
  showName: function(){
    console.log(this.name);
  }
}
person.showName();

场景3:函数内使用arguments


function sum(x, y){
  console.log(arguments);
  return x + y;
}
sum(1, 2);

场景4:构造函数、原型方法


function Person(name, age){
  this.name = name;
  this.age = age;
}
Person.prototype.showName = function(){
  console.log(this.name);
}
const person = new Person("Tom", 23);
person.showName();
console.log(person);

解构赋值

等号左右两边结构要完全一致


// 对象解构赋值
const obj = {
    name: "Tom",
    age: 23,
};
// const name = obj.name;
// const age = obj.age;
const { name, age } = obj;
console.log(name, age);
// 数组解构赋值
const arr = [0, 1, 2];
// const a = arr[0];
// const b = arr[1];
// const c = arr[2];
const [a, b, c] = arr;
console.log(a, b, c);

2、结构赋值取别名


const obj = {
    name: "Tom",
    age: 23,
    pet: {
      name: "bigo",
    },
  };
  // pet.name 别名 petName
  const {
    name,
    age,
    pet: { name: petName },
  } = obj;
  console.log(name, age, petName);

3、解构赋值应用


(1)作为数组参数


function sum(arr){
  let result = 0;
  for (let i = 0; i < arr.length; i++) {
      result += arr[i];
  }
  console.log(result);
}
const arr = [1, 2, 3];
sum(arr);
// 改写如下
function sum([a, b, c]) {
  console.log(a + b + c);
}
const arr = [1, 2, 3];
sum(arr);

(2)作为对象参数


// pet有默认参数
function foo({ name, age, pet = "pig" }) {
    console.log(name, age, pet);
}
const obj = {
    name: "Tom",
    age: 23,
};
foo(obj);

(3)作为函数返回值


function foo() {
    return {
      name: "Tom",
      age: 23,
    };
}
const {name, age} = foo();
console.log(name, age);

(4)交换变量的值


let a = 1;
let b = 2;
[a, b] = [b, a];
console.log(a, b);

(5)解析json时使用


const res = '{"name": "Tom", "age": 23}';
const {name, age} = JSON.parse(res);
console.log(name, age);

(6)Ajax请求应用


<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.1.0/axios.min.js"></script>
<script>
 axios.get("./data.json").then(({name, age})=>{
     console.log(name, age);
 })
</script>
data.json
{
    "name": "Tom",
    "age": 23
}

Babel浏览器兼容

ES6 -> Babel -> ES5

环境配置

1、环境 Node.js

2、初始化 npm init -y


3、安装依赖


npm install --save-dev babel-preset-env babel-cli
# 或者
npm i -D babel-preset-env babel-cli

3、创建配置文件


cat .babelrc
{
    "presets": ["env"]
}

4、文件转化

文件:babel src/index.js -o dist/index.js
文件夹:babel src -d dist
实时监控:babel src -w -d dist

相关文章
|
7月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
328 19
|
自然语言处理 JavaScript 前端开发
ECMAScript 6 的出现为 JavaScript 带来了许多新的特性和改进
这些只是ES6的一些主要特性,它们极大地增强了JavaScript的功能和表现力,使得JavaScript在大型应用开发、前端框架等领域能够更加高效地编写复杂的应用程序。
428 155
|
9月前
|
JavaScript
JS实现多条件搜索函数
JS封装的多条件搜索
|
11月前
|
JavaScript 前端开发
JavaWeb JavaScript ③ JS的流程控制和函数
通过本文的详细介绍,您可以深入理解JavaScript的流程控制和函数的使用,进而编写出高效、可维护的代码。
260 32
|
12月前
|
JavaScript 前端开发 容器
盘点JavaScript中所有声明变量的方式及特性
本文详细介绍了JavaScript中变量定义的多种方式,包括传统的`var`、`let`和`const`,以及通过`this`、`window`、`top`等对象定义变量的方法。每种方式都有其独特的语法和特性,并附有代码示例说明。推荐使用`let`和`const`以避免作用域和提升问题,谨慎使用`window`和`top`定义全局变量,不建议使用隐式全局变量。掌握这些定义方式有助于编写更健壮的JS代码。
334 11
|
10月前
|
JavaScript 前端开发 网络架构
ES6解构赋值详解;全面掌握:JavaScript解构赋值的终极指南
解构赋值是一个强大且灵活的工具,它使得从数组和对象中提取数据变得更加简单和直观。通过掌握解构赋值的基本语法和实践,你可以写出更加简洁、可读性更强的代码。在实际项目中,解构赋值广泛应用于函数参数处理、变量交换、嵌套结构操作等场景,极大地提升了代码的灵活性和简洁度。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
10月前
|
JavaScript 前端开发 Java
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
JavaScript 前端开发 安全
JavaScript与TypeScript的对比,分析了两者的特性及在实际项目中的应用选择
本文深入探讨了JavaScript与TypeScript的对比,分析了两者的特性及在实际项目中的应用选择。JavaScript以其灵活性和广泛的生态支持著称,而TypeScript通过引入静态类型系统,提高了代码的可靠性和可维护性,特别适合大型项目。文章还讨论了结合使用两种语言的优势,以及如何根据项目需求和技术背景做出最佳选择。
1709 4
|
JavaScript 前端开发 安全
ECMAScript 6(以下简称 ES6)的出现为 JavaScript 带来了许多新的特性和改进,其中 let 和 const 是两个非常重要的关键字。
ES6 引入了 `let` 和 `const` 关键字,为 JavaScript 的变量管理带来了革新。`let` 提供了块级作用域和暂存死区特性,避免变量污染,增强代码可读性和安全性;`const` 用于声明不可重新赋值的常量,但允许对象和数组的内部修改。两者在循环、函数内部及复杂项目中广泛应用,有助于实现不可变数据结构,提升代码质量。
202 5