ES6核心,值得驻足花一天时间来学习
1.let 和 const 命令
在es5时,只有两种变量声明,var 和function。在es6中新增了四种let和const,以及另外两种声明import和class。 我们先讲解let和const,后续会补充import和class
(1)let
我们先来看基本语法
{
let a = 10;
var b = 1;
}
b // 1
a // ReferenceError: a is not defined.
复制代码
我们在代码块中声明了a,b。然后a is not defined.这是因为let命令只在对应的代码块中有效,我们在外部去引用它,就会报错。这就是let的块级作用域的效果,如果不太清楚什么是块级作用域。我们来看下面的例子
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[0]();//10
a[6](); // 10
复制代码
这是一个老生常谈的问题了。i在for循环中定义的是全局变量。我们在调用函数时。函数内部的i引用的是全局的i,所以打印出来的 是10. 我们之前是这样解决的。
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = (function (a) {
return function(){
console.log(a);
}
}(i));
}
a[0]();//0
a[6](); // 6
复制代码
我们使用了立即执行函数将i的值传入了内部的函数,这样内部的函数就能够获取到对应的i。
我们用let来代替var,最后输出的是 6。
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
复制代码
这是因为我们每一次的循环都生成了一个新的块级作用域,内部保存着i的值,所以就会打印出6.
let不存在变量提升
console.log(a);
console.log(b);
var a=0;//undefined
let b=0;//ReferenceError: b is not defined
复制代码
TDZ(暂时性死区) let命令在块级作用域中,即使不存在变量提升,它也会影响当前块级作用域,即绑定在了当前作用域。在作用域中引用外部的变量将会报错。
var a=10;
{
console.log(a); //ReferenceError: a is not defined
let a=10;
}
复制代码
同时,我们在TDZ中使用typeof也会报错.
console.log( typeof a);//undefined
复制代码
console.log( typeof a);//ReferenceError: a is not defined
let a=10;
复制代码
let 不允许重复声明变量
{
var a=0;
let a=1;//SyntaxError: Identifier 'a' has already been declared
}
复制代码
(2) const常量
const常量声明一个只读属性的变量,不可更改,不可先声明后赋值,生成块级作用域。
const a;//SyntaxError: Missing initializer in const declaration(const声明中缺少初始值设定项)
a=10;
复制代码
它同let有很多相似的地方。 .不可重复声明
const a=10;
var a=10;//SyntaxError: Identifier 'a' has already been declared
复制代码
.变量不提升
console.log(a)//ReferenceError: a is not defined
const a=10;
复制代码
.同样存在暂时性死区
var a=10;
{
console.log(a);//ReferenceError: a is not defined
const a=10;
}
复制代码
另外,const保证常量的值不被修改的原理是什么呢?const实际上无法改变的只是常量在栈区的值不变,如果这个值是一个基本数据类型,那么const能够保障常量的值不变,但如果是引用类型的数据,栈区保存的其实是对应常量的地址。地址无法改变,但是对应地址的堆区内容却可以改变。
const a=[1,2,3]
a.push(4)
console.log(a); //[1, 2, 3, 4]
复制代码
很显然,我们通过push,直接修改了堆区的内容,间接改变了const常量的值。
如果要真正做到常量的功能,可以使用Object.freeze()
var a=[1,2,3];
Object.freeze(a)
a.push(4) //Cannot add property 3, object is not extensibleat Array.push
console.log(a);
复制代码
2.字符串扩展方法
(1)for of字符串遍历
使用for of可以遍历字符串,并将字符串分解为单独的字符串
var a='lang'
for (item of a){
console.log(item);
}
// l
// a
// n
// g
复制代码
(2) codePointAt字符串查询.
根据下标,查询对应字符串。在Es5时,就有一个charAt()方法。但charAt()显然没想到,随着Unicode编码的扩展,原先的0x0000~0xFFFF已经无法满足表示所有字符了。
var text = "
ES6核心,值得驻足花一天时间来学习的更多相关文章
- ES6核心特性
摘要:聊JS离不开ES6啊! 原文:ES6核心特性 作者:ljianshu 前言 ES6 虽提供了许多新特性,但我们实际工作中用到频率较高并不多,根据二八法则,我们应该用百分之八十的精力和时间,好好专 ...
- JavaScript ES6 核心功能一览(转)
原文地址:Overview of JavaScript ES6 features (a.k.a ECMAScript 6 and ES2015+) 原文作者:Adrian Mejia 译文出自:掘金翻 ...
- es6核心特性-数组扩展
1. Array.from() : 将伪数组对象或可遍历对象转换为真数组 如果一个对象的所有键名都是正整数或零,并且有length属性,那么这个对象就很像数组,称为伪数组.典型的伪数组有函数的argu ...
- 花一天时间试玩vsphere6.7(EXSI)服务器版的vmware
花一天时间试玩vsphere6.7(EXSI)服务器版的vmware 要注册账号(2019年11月14注册): 登陆网址:https://my.vmware.com/cn/group/vmware/h ...
- "做中学"之“极客时间”课程学习指导
目录 "做中学"之"极客时间"课程学习指导 所有课程都可以选的课程 Java程序设计 移动平台开发 网络攻防实践 信息安全系统设计基础 信息安全专业导论 极客时 ...
- 增强学习(五)----- 时间差分学习(Q learning, Sarsa learning)
接下来我们回顾一下动态规划算法(DP)和蒙特卡罗方法(MC)的特点,对于动态规划算法有如下特性: 需要环境模型,即状态转移概率\(P_{sa}\) 状态值函数的估计是自举的(bootstrapping ...
- ES6核心内容精讲--快速实践ES6(一)
前言 本文大量参考了阮一峰老师的开源教程ECMAScript6入门,适合新手入门或者对ES6常用知识点进行全面回顾,目标是以较少的篇幅涵盖ES6及部分ES7在实践中的绝大多数使用场景.更全面.更深入的 ...
- JavaScript ES6 核心功能一览
JavaScript 在过去几年里发生了很大的变化.这里介绍 12 个你马上就能用的新功能. JavaScript 历史 新的语言规范被称作 ECMAScript 6.也称为 ES6 或 ES2015 ...
- ES6核心内容精讲--快速实践ES6(二)
Iterator和for...of 是什么: Iterator(遍历器)是专门用来控制如何遍历的对象,具有特殊的接口. 怎么用: Iterator(遍历器)对象带有next方法,每一次调用next方法 ...
随机推荐
- TCP系列45—拥塞控制—8、SACK关闭的拥塞撤销与虚假快速重传
一.概述 这篇文章介绍一下TCP从Recovery状态恢复到Open状态的时候cwnd的更新.我们在tcp重传部分的文章中曾经介绍过虚假重传的概念,Linux在探测到虚假重传的时候就会执行拥塞撤销操作 ...
- 写在SVM之前——凸优化与对偶问题
SVM之问题形式化 SVM之对偶问题 SVM之核函数 SVM之解决线性不可分 >>>写在SVM之前——凸优化与对偶问题 本篇是写在SVM之前的关于优化问题的一点知识,在SVM中会用到 ...
- 【beta】Scrum站立会议第5次....11.7
小组名称:nice! 组长:李权 成员:于淼 刘芳芳韩媛媛 宫丽君 项目内容:约跑app(约吧) 时间:2016.11.7 12:00——12:30 地点:传媒西楼220室 本次对beta阶段的 ...
- PHP中is_null()方法
is_null — 检测变量是否为 NULL bool is_null ( mixed $var ) 如果 var 是 null 则返回 TRUE,否则返回 FALSE. 举例: $x=" ...
- Android内存泄漏第二课--------(集合中对象没清理造成的内存泄漏 )
一.我们通常把一些对象的引用加入到了集合容器(比如ArrayList)中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大.如果这个集合是static的话,那情况就更严重 ...
- 第161天:CSS3实现兼容性的渐变背景(gradient)效果
CSS实现兼容性的渐变背景(gradient)效果 一.有点俗态的开场白 在对CSS3支持日趋完善的今天,实现兼容性的渐变背景效果已经完全成为可能,本文就将展示如何实现兼容性的渐变背景效果.在众多的浏 ...
- Sum of Consecutive Integers LightOJ - 1278(推公式 数学思维)
原文地址:https://blog.csdn.net/qq_37632935/article/details/79465213 给你一个数n(n<=10^14),然后问n能用几个连续的数表示; ...
- 【BZOJ3894】文理分科(最小割)
[BZOJ3894]文理分科(最小割) 题面 BZOJ Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个 ...
- BZOJ2595 [Wc2008]游览计划 【状压dp + 最短路】
题目链接 BZOJ2595 题解 著名的斯坦纳树问题 设\(f[i][j][s]\)表示点\((i,j)\)与景点联通状况为\(s\)的最小志愿者数 设\(val[i][j]\)为\((i,j)\)需 ...
- NOIP2017 Day1 T3 逛公园(最短路+拓扑排序+DP)
神tm比赛时多清个零就有60了T T 首先跑出1起点和n起点的最短路,因为k只有50,所以可以DP.设f[i][j]表示比最短路多走i的长度,到j的方案数. 我们发现如果在最短路上的和零边会有后向性, ...