JavaScript之ES6新特性01

ES7、ES8、ES9、ES10、ES11、ES12新特性 ES7和ES8引入了多个重要新特性:ES7新增了Array.prototype.includes()方法用于更直观地检查数组元素,以及指数运算符**简化幂运算;ES8提供了Object.values()/entries()获取对象键值对,字符串填充方法padStart/padEnd实现格式化效果,Async/Await异步编程语法简化Promise使用,以及Object.getOwnPropertyDescriptors()获取对象属性描述符。这些特性分别增强了数组操作、对象处理、字符串格式化和异步编程能力 阅读详情

 概述

  ECMAScript 6(简称ES6)是于2015年6月正式发布的JavaScript语言的标准,正式名ECMAScript 2015(ES2015)。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言 [。

另外,一些情况下ES6也泛指ES2015及之后的新增特性,虽然之后的版本应当称为ES7、ES8等

为什么学习ES6 

  •  ES6 的版本变动内容最多,具有里程碑意义
  •  ES6 加入许多新的语法特性,编程实现更简单、高效
  •  ES6 是前端发展趋势,就业必备技能 

ES6新特性

 let 关键字 

ES6 新增了 let 命令,用来声明变量。它的用法类似于 var ,但是所声明的变量,只在 let 命令所在的代码块内有效。l使用 let 声明的变量有几个特点:

  1.  不允许重复声明
  2.  块级作用域
  3. 不存在变量提升
  4. 不影响作用域链 
        //声明变量
        let a;
        let b,c,d;
        let e = 10;
        let f = 521, g = 'asd', h = [];

      //1. 变量不能重复声明
        let star = '谭梦寻';
        // let star = '小名';//报错--Cannot redeclare block-scoped variable 

      //2. 块级作用域  全局, 函数, eval
        // if else while for 
        {
            let girl = '小红';
        }
        function f1() {
            let n = 5;
            if (true) {
                let n = 10;
                }
            console.log(n); // 5
        }
        //console.log(girl);//报错--ReferenceError: girl is not defined

      //3. 不存在变量提升
        // console.log(song);//Cannot access 'song' before initialization
        // let song = '恋爱告急';

      //4. 不影响作用域链
        {
            let school = '希望小学';
            function fn(){
                console.log(school);
            }
            fn();//希望小学
        }
暂时性死区: 

        只要块级作用域内存在 let 命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。 

var tmp = 123
if (true) {
  tmp = 'abc' // ReferenceError: Cannot access 'tmp' before initialization
  let tmp
}

上面代码中,存在全局变量 tmp ,但是块级作用域内 let 又声明了一个局部变量 tmp ,导致后者绑定这个块级作用域,所以在 let 声明变量前,对 tmp 赋值会报错。
        ES6 明确规定,如果区块中存在 let 和 const 命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,
就会报错。
        总之,在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ) 

 

 let和var对比学习

        var声明的变量全局有效,允许重复声明,存在变量提升(var 命令会发生”变量提升“现象,即变量可以在声明之前使用,值为 undefined )。而let不允许重复声明,存在块级作用域、不存在变量提升、不影响作用域链 。如下:

作用域1:

console.log(b);//输出undefined
var b = 2;//注意 这里不能省,否则报错
var b = 3;
{
  var s2 = "1asd";
}
console.log(s2);//输出 1asd

 作用域2:

var a = []
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i)
  }
}
a[6]() // 10
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i)
  }
}
a[6]() // 6

解释:上面代码中,变量 i 是 var 命令声明的,在全局范围内都有效,所以全局只有一个变量 i 。每一次循环,变量 i 的值都会发生改变,而循环内被赋给数组 a的函数内部的 console.log(i) ,里面的 i 指向的就是全局的 i 。也就是说,所有数组 a 的成员里面的 i ,指向的都是同一个 i ,导致运行时输出的是最后一轮的 i 的值,也就是 10。
如果使用 let ,声明的变量仅在块级作用域内有效,最后输出的是 6 

变量注意:

        ECMAScript的变量是松散型的,即可以用来保存任何类型的数据。如下:

let c = 3;
c = "asd";
console.log(c)//输出asd

 const 关键字 

        const 声明一个只读的常量。一旦声明,常量的值就不能改变。

const 声明有以下特点: 
  • 声明必须赋初始值
  • 标识符一般为大写
  • 不允许重复声明
  • 值不允许修改
  • 块儿级作用域

注意: 对象属性修改和数组元素变化不会发生 const 错误
应用场景:声明对象类型使用 const,非对象类型声明选择 let 

例子: 值不允许修改

const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.

上面代码表明改变常量的值会报错。const 声明的变量不得改变值,这意味着, const 一旦声明变量,就必须立即初始化,不能留到以后赋值 。

声明必须赋初始值 

const f;
// SyntaxError: Missing initializer in const declaration

const 的作用域与 let 命令相同:只在声明所在的块级作用域内有效 

if (true) {
    const MAX = 5;
}
console.log(MAX); // Uncaught ReferenceError: MAX is not defined

const 命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。

var tmp = 123
if (true) {
  tmp = 'abc' 
  const tmp;//SyntaxError: Missing initializer in const declaration
}

const 声明的常量,也与 let 一样不可重复声明。 

var message = "Hello!";
let age = 25;
// 以下两行都会报错
const message = "Goodbye!";
const age = 30;

对象属性修改和数组元素变化不会发生 const 错误 

const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
const本质 

const 实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针, const 只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。

变量解构赋值 

         ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构赋值。以前为变量赋值,只能直接指定值。

数组的解构 
const F4 = ['小沈阳', '刘能', '赵四', '宋小宝']
let [xiao, liu, zhao, song] = F4
console.log(xiao)//小沈阳
console.log(liu)//刘能
console.log(zhao)//赵四
console.log(song)//宋小宝

上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值。 本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。

 数组解构默认值 

        解构赋值允许指定默认值。 

let [foo = true] = [];
console.log(foo); // true
let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
注意事项: 

 只有当一个数组成员严格等于 undefined ,默认值是才会生效的。(ES6 内部使用严格相等运算符( === ),判断一个位置是否有值。)

let [n = 1] = [undefined];
console.log(n); // 1
let [n2 = 1] = [null];
console.log(n2);//null
对象的解构 

        对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。 

const zhao = {
  name: '赵本山',
  age: '不详',
  xiaopin: function () {
    console.log('我可以演小品')
  }
}

let {name, age, xiaopin} = zhao;
console.log(name);
console.log(age);
console.log(xiaopin);
xiaopin();

 输出结果:

也可以直接通过函数名解构出里面的函数: 

const zhao = {
  name: '赵本山',
  age: '不详',
  xiaopin: function () {
    console.log('我可以演小品')
  }
}


let { xiaopin } = zhao
xiaopin()//我可以演小品

如果变量名与属性名不一致,必须写成下面这样。 

let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
console.log(baz); // "aaa"
let obj = { first: 'hello', last: 'world' };
let { first: f, last: l } = obj;
console.log(f); // 'hello'
console.log(l); // 'world'
console.log(foo);//foo is not defined

解释:对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。上面代码中, foo 是匹配的模式, baz 才是变量。真正被赋值的是变量 baz ,而不是模式 foo 。

对象解构默认值 

        默认值生效的条件是,对象的属性值严格等于 undefined 。

// 对象解构默认值
var {x = 3} = {};
console.log(x); // 3
var {x, y = 5} = {x: 1};
console.log(x); // 1
console.log(y); // 5
var {x: y = 3} = {};
console.log(y);// 3
var {x: y = 3} = {x: 5};
console.log(y);// 5
var { message: msg = 'Something went wrong' } = {};
console.log(msg); // "Something went wrong
var {x = 3} = {x: undefined};
console.log(x); // 3
var {x = 3} = {x: null};
console.log(x); // null

如果解构失败 ,变量的值等于 undefined 。

let {foo} = {bar: 'baz'};
console.log(foo); // undefined
注意事项: 

 1、如果解构模式是嵌套的对象,而且子对象所在的父属性不存在,那么将会报错。

let {
  user: { bar }
} = { baz: 'baz' }
//TypeError: Cannot read properties of undefined (reading 'bar')

 解释:等号左边对象的user属性,对应一个子对象。该子对象的 bar 属性,解构时会报错。原因很简单,因为 foo 这时等于 undefined ,再取子属性就会报错,请看下面的代码。

let _tmp = {baz: 'baz'};
_tmp.foo // undefined
_tmp.foo.bar // 报错

2、如果要将一个已经声明的变量用于解构赋值,必须非常小心。 

// 错误的写法
let x;
{x} = {x: 1};
// SyntaxError: syntax error

上面代码的写法会报错,因为 JavaScript 引擎会将 {x} 理解成一个代码块,从而发生语法错误。只有不将大括号写在行首,避免 JavaScript 将其解释为代码块,才能解决这个问题 

// 正确的写法
let x;
({x} = {x: 1});

字符串解构 

        字符串也可以解构赋值。这是因为字符串被转换成了一个类似数组的对象,且类似数组的对象都有一个 length 属性,因此还可以对这个属性解构赋值。如下:

const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
let {length : len} = 'hello';
len // 5

数值和布尔值的解构赋值 

         

function add([x, y]){
return x + y;
}
add([1, 2]); // 3

解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于 undefined 和 null 无法转为对象,所以对它们进行解构赋值,都会报错。

let {toString: s} = 123;
s === Number.prototype.toString // true
let {toString: s} = true;
s === Boolean.prototype.toString // true

函数参数的解构赋值 

        函数的参数也可以使用解构赋值

function add([x, y]){
return x + y;
}
add([1, 2]); // 3

函数参数的解构也可以使用默认值 (原理同上)

function move({x = 0, y = 0} = {}) {
return [x, y];
}
move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
move({}); // [0, 0]
move(); // [0, 0]

day01-ES6新特性以及ReactJS入门 var 有一个问题,就是定义的变量有时会莫名奇妙的成为全局变量。之前,我们写js定义变量的时候,只有一个关键字: var。 阅读详情

相关推荐

Zynq工程IP核封装:XCI引用与约束继承实战指南

IP核封装是FPGA系统设计中实现模块复用、团队协作与技术资产沉淀的关键环节。其本质是将功能逻辑、时序约束、接口协议和硬件配置统一抽象为可配置、可验证、可演进的标准化组件。核心原理在于通过XCI文件保留IP核的参数化定义能力,依托Vivado IP Packager实现约束继承、端口自动映射与时钟域解耦,从而保障跨项目集成的时序可信性与约束完备性。该技术广泛应用于Zynq SoC视频处理、高速接口(如HDMI/TMDS)、多时钟域控制系统等场景,尤其在需要长期维护与版本迭代的工业级嵌入式开发中具有不可替代的

weixin_42593701的博客 123

[ES6] ES6介绍

ES6是什么 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。Mozilla公司将在这个标准的基础上,推出JavaScript 2.0。 ECMA 与JavaScript的关系 1996年11月, JavaScript的创造者Netscape公司,决定将、JavaScript 提交给标准化组织, ECMA,希望这种语言能够成为国际标准。次年,ECMA发布262号标准文件(ECMA-262)的 第一版,规定了浏览器脚本语言的标准,并将这种语言称

chc2517的博客 531

CMOS sensor 基础

NA

m0_72053187的博客 1657

Atitit es6新特性 Es7 es8 新特性 目录 1.1. ECMAScript 的历史 1 2. 新特性 2 2.1. 全面的class模型 2 2.2. .模块 import、expor

Atitit es6新特性 Es7 es8 新特性 目录 1.1. ECMAScript 的历史 1 2. 新特性 2 2.1. 全面的class模型 2 2.2. .模块 import、export 2 2.2.1. 4. arrow functions (箭头函数) 2 2.2.2. 5. template string (模板字符串) 2 2.2.3. 8. rest ...

attilax的专栏 703

【FOC无刷电机控制】六步换向、FOC,STM32cubemx从零开始搭建BLDC六步换相代码、FOC代码(基于霍尔传感器)

FOC、六步换相,无刷电机控制

xifan的博客 3万+

Archery通过OpenResty代理转发后登录一直提示Forbidden

测试几遍,连账号密码都没用验证,因为不管输什么都是提示Forbidden。找到配置文件settings.py,下面命令可到配置文件路径。回到页面刷新,随便输入个账号密码,验证失败证明请求成功了。查看Preview,提示CSRF验证失败,请求被中断。域名:dba.hkeasyspeed.com。打开开发者工具查看,网络里面可以看到报403。添加一条配置,把你配置域名添加进去。可以看到页面可以正常访问到。进入Archery容器。重启Archery容器。正常输入账号密码,OK。

万物皆可学 3144

ES6 第一天

let和const命令 ES6 新增了let命令,用来声明变量。 ES6新增了const命令用来声明一个只读的常量。 2.1 let命令 2.1.1 基础用法 2.1.2 let命令特点【重点】 let不存在变量提升与暂时性死区 代码案例: <script> //var有变量提升 console.log(age); var age = 20; ​ //let不存在变量提升 ...

ILove_bugs的博客 523

黑猫带你学UFS协议第13篇:UFS初始化详解(Boot Operation)

本文详细解析了UFS设备的初始化过程,包括部分初始化、加载启动代码(可选)和初始化完成三个阶段。重点介绍了如何通过设备描述符和逻辑单元描述符配置引导特性,以及如何从UFS设备加载启动代码。内容适用于嵌入式硬件和存储领域的开发者。

黑猫奥利奥的博客 3555

新一代JavaScript标准,ES6即将发布

http://www.youkuaiyun.com/article/2015-06-15/2824967-es6-in-depth-generators 转载于:https://www.cnblogs.com/hghrpg/p/4587647.html

weixin_30266829的博客 486

rv1126如何切换720p和1080p

切换720p和1080p可以使用modetest,但是需要将这两种模式都添加到connector中去 添加一个新的mode到connector中去,其实内核中已经有相关接口了,需要做一些小改动。 1.不采用设备树的方式去配置,将720p和1080p的timing参数配置放在数组中。 2.这里的printer和设备树中的.compatible = "printer"一致。 3.将其添加到connector中去 static int panel_simple_get_fixed_modes(struct

weixin_42097108的博客 864

【Python计量】linearmodels面板数据回归(一)

我们以伍德里奇《计量经济学导论现代方法》的”第14章高级面板数据方法“的案例14.1为例,使用jtrain中的数据来进行固定效应估计。

mfsdmlove的博客 9277

Atom 使用Jshint时const is available in ES6 (use esversion:6)

问题: Atom使用Jshint时‘const’ is available in ES6 (use ‘esversion: 6’) 在项目的根目录新建一个文件名为.jshintrc的文件,输入 { "esversion": 6 } 如图:

面朝大海,春暖花开 5076

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JavaScript高级学习:ES6新特性10——继承的学习01

提示: 本文为JavaScript栏目:JavaScript高级系列——ES6新特性章节 第十章 JavaScript高级学习:ES6新特性10——继承的学习01前言继承ES5与ES6中继承用法的对比ES5中继承的用法ES6中继承的用法super关键字的使用super关键字作为对象使用super关键字在静态方法中的含义 前言 本文粗浅学习继承。 提示:以下是本篇文章正文内容,下面案例可供参考 继承 ES5与ES6中继承用法的对比 ES5中继承的用法 ES5中的继承实际上是通过代码的灵活运用,让s去自动同

GAlbinus的博客 164

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JavaScript高级学习:ES6新特性01——常量的声明和使用

Web学习:ES6新特性01——常量的声明和使用常量的声明和使用举例说明:const处理对象: 常量的声明和使用 const 表示常量,要求声明的时候必须赋值,后续不可更改 const的特性和let一样。 const声明的常量推荐变量名全大写。 举例说明: const name = "张三丰"; 改变const声明的变量的值,报错 name = "张无忌"; const声明不赋值报错,报错 const age; const处理对象: const实际上保证的不是之不能变化,而是保证的变量所指向的内存地址

GAlbinus的博客 226

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

全新javaScript进阶面向对象ES6(笔记)

2019全新javaScript进阶面向对象ES6(学习笔记),pink老师讲JS ES6的 学习笔记

Cicada的博客 3678

ES5和6的一些新特性

ES5和6的一些新特性 更详细的大家参考:阮一峰的ES6教程 1.1.let 和 const 命令 var之前,js定义变量只有一个关键字:var var有一个问题,就是定义的变量有时会莫名奇妙的成为全局变量。 例如这样的一段代码: for(var i = 0; i &lt; 5; i++){ console.log(i); } console.log("循环外:" + i) 你猜下打印...

随风而欲的博客 1444

01 【ES6 介绍】

01 【ES6 介绍】

DSelegent的博客 243

ES6-01-ES的简介

ES的简介

qq_58167492的博客 170

JavaScript ES6到ES10语法 ES6新增的y u修饰符 flags属性

随着JavaScript语言的不断演进,从ES6(ECMAScript 2015)开始引入了一系列新的特性和改进,其中包括对正则表达式的支持。修饰符的作用在于扩展正则表达式的字符集支持,使其能够准确地匹配各种语言和符号系统中的字符。希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。属性,这些特性不仅增强了正则表达式的功能,还提升了其处理Unicode字符的能力,为开发人员提供了更强大的文本处理工具。属性的值,因为它决定了下一次匹配的起点。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 815

【ES6】01-ECMAScript基本认识 + 变量常量 + 数据类型

本文主要铺垫ES6的基本和一些简单的知识点。

2301_76662826的博客 1381

基于 Node.js + Koa 构建完整的 Web API (让项目支持 ES6/ES2015 及更高版本的新特性)

主题内容:基于 Node.js + Koa 构建完整的 Web API (让项目支持 ES6/ES2015 及更高版本的新特性) 目标框架:Node.jsv14.15.4(包含npm 6.14.10) 开发工具:Visual Studio Code (VSCode) 开发平台:macOS Big Sur 11.1 / Windows 10 开发人员:成长的小猪 Jason Song 背景描述:上一篇基于 Node.js + Koa 构建完整的 Web API 项目我们介绍了引入KoaWeb...

成长的小猪 宋永登 943

ES6手录01-let与const

ES6核心特性与变量声明解析 ES6(ECMAScript 2015)是JavaScript的重大升级,旨在解决早期语言缺陷并支持企业级开发。其核心特点包括: 版本演进:完全兼容ES5,新增箭头函数、类等语法特性,后续每年发布小版本更新 变量声明优化: let解决var的重复声明、变量提升等问题,具有块级作用域和暂时性死区特性 const用于声明不可变常量,必须立即初始化,但对对象/数组属性可修改 开发工具:Babel转码器实现ES6到ES5的转换,保证浏览器兼容性 推荐使用let/const替代var,这

qq_45925548的博客 1129

ES6~ES11新特性全解析

在JavaScript的世界里,ES6 - ES11带来了许多令人兴奋的新特性,这些特性极大地提升了JavaScript的表达力和开发效率。例如,一个大型项目中可以将不同功能的代码拆分到不同模块,方便维护和复用。掌握这些ES6 - ES11的新特性,无论是初学者还是有经验的开发者,都能编写出更高效、可读性更高的JavaScript代码。:从数组或对象中提取数据并赋值给变量,无论是数组解构还是对象解构,都让代码更简洁。:让异步代码的书写和阅读更接近同步代码,进一步简化了异步编程的复杂度。

LQS5858的博客 984

JS高级 之 ES6~ES13 新特性

JS高级 之 ES6~ES13 新特性

玄鱼殇 1041

ES6核心知识解析01:什么是ES6以及为什么需要ES6

摘要:ES6是ECMAScript 2015的重大版本更新,是JavaScript语言里程碑式的升级,解决了ES5在大型项目开发中的痛点。虽然后续有小版本更新,但ES6因其重大变革成为代名词。它使JavaScript从脚本语言升级为支持工程化开发的语言,是现代前端开发的基础。本专栏将系统梳理ES6核心知识,帮助开发者建立完整知识体系,欢迎订阅交流。

资浅程序媛,个人公众/头条/百家号:郑州小闲人,关注权限已向你开放 548
上一篇: java基础之面向对象
下一篇: java基础之面向对象基础进阶day01
谭梦寻
博客等级 码龄5年 937粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值