一、ES6基础
一、ECMAScript和JavaScript关系
JavaScript 的创造者 Netscape 公司,决定将 JavaScript 提交给标准化组织 ECMA,希望这种语言能够成为国际标
准,但是JavaScript本身也已经被 Netscape 公司注册为商标,后面的标准都由ECMA制定,取名ECMAScript。
那么ES6这个版本引入的新内容较多,通常指JavaScript语言的下一个版本。
二、let命令
ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内
有效。
var和let定义变量区别:
<script>
//var的作用域是函数级的(函数内部定义变量只能函数里面使用)
// function showName()
// {
// var myName = "张学友";
// alert(myName + "欢迎您!"); //此处的myName为"张学友"
// }
// showName();
// alert(myName + "欢迎您!"); //此处会报错,myName只能在showName函数中使用
//var的作用域是函数级的(在代码块中定义的变量可以在代码块之外使用)
// if(1==1)
// {
// var myName = "张学友";
// }
// alert(myName + "欢迎您!"); //此处可以运行
//let的作用域是代码块级别的
// if(1==1)
// {
// let myName = "张学友";
// }
// alert(myName + "欢迎您!"); //此处会报错
//let不存在变量提升
// console.log(a); //报错
// let a = "apple";
// console.log(b); //undefined
// var b = "banana";
</script>
var和let在循环计数时候的区别:
<script>
// for(var i = 1;i <= 10;i++)
// {
// //
// }
// alert(i); //此处会打印11,i在循环体内和循环体外都可以使用
//此时计数器的变量泄露成了全局变量
// for(let i = 1;i <= 10;i++)
// {
// //
// }
// alert(i); //此处会报错,i只在循环体内有效,在循环体外无效
// 输出十个11
// i是全局的,定时器代码在循环之后发生,所以打印十个11
// for (var i = 1; i <= 10; i++) {
// setTimeout(function(){
// console.log(i);
// })
// }
//输出1 2 3 4 5 6 7 8 9 10
for (let j = 1; j <= 10; j++) {
setTimeout(function(){
console.log(j);
})
}
</script>
循环绑定网页元素事件中var和let的区别:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>循环绑定按钮事件</title>
</head>
<body>
<h2>点击三个按钮分别弹出1,2,3</h2>
<input type="button" class="myButton" value="第一个按钮" />
<input type="button" class="myButton" value="第二个按钮"/>
<input type="button" class="myButton" value="第三个按钮"/>
</body>
</html>
<script>
//在此案例中i是全局的,点击按钮发生在循环之后,所以打印结果全部为4
// var list = document.getElementsByClassName("myButton");
// for(var i = 0;i < list.length;i++)
// {
// list[i].onclick = function(){
// alert(i+1);
// }
// }
//上述代码不能打印1,2,3,而是打印4,需要采取JS闭包来解决此问题;
//闭包就是能够读取其他函数内部变量的函数
// var list = document.getElementsByClassName("myButton");
// for(var i = 0;i < list.length;i++)
// {
// list[i].onclick = (function(num)
// {
// return function(){
// alert(num);
// }
// })(i+1);
// }
//如果使用ES6中let关键字则不存在上面演示的问题
var list = document.getElementsByClassName("myButton");
for(let i = 0;i < list.length;i++)
{
list[i].onclick = function(){
alert(i+1);
}
}
</script>
三、const命令
const声明一个只读的常量。一旦声明,常量的值就不能改变。
<script>
// const PI = 3.14;
// PI = 3.15; //此处会报错,const声明的变量不能改变其值
//const一旦声明变量,就必须立即初始化,不能留到以后赋值。
//const PI; //报错
//const实际上保证的,并不是变量的值不得改动,
//而是变量指向的那个内存地址所保存的数据不得改动。
const arr = [];
arr.push('jack'); //可以执行
arr.push("rose"); //可执行
console.log(arr[0]);
console.log(arr[1]);
</script>
四、变量的解构赋值
1、数组的解构赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值
// let a = 1;
// let b = 2;
// let c = 3;
//上述代码可以如下编写(从数组中提取值,按照对应位置,对变量赋值)
// let[a,b,c]=[1,2,3];
数组解构赋值案例:
//let [a, [[b], c]] = [1, [[2], 3]]; //a=1,b=2,c=3
//let [ , , c] = ["jack", "rose", "mike"]; //c=mike
//let [x, , y] = [1, 2, 3]; //x=1,y=3
//let [head, ...tail] = [1, 2, 3, 4]; //head=1,tail=[2,3,4]
//let [x, y, ...z] = ['a']; //x=a,y=undefined,z=[]
解构不成功,变量的值就等于undefined:
//let [foo] = []; //解构不成功,foo=undefined
//let [bar, foo] = [1]; //bar=1,foo解构不成功foo=undefined
不完全解构:
左边的模式只能匹配右边的一部分,也可以解构成功:
let [x, y] = [1, 2, 3]; //x=1,y=2
字符串解构(将字符串当成一个数组):
let [a, b, c, d, e] = 'hello';
console.log(a);
console.log(b);
console.log(c);
console.log(d);
console.log(e);
默认值:
解构赋值允许指定默认值
//let [foo = true] = []; //foo=true;
//let [x, y = 'b'] = ['a']; // x='a', y='b'
//let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
//let [x = 1] = [null]; //x=null(只有当一个数组等于undefined,默认值才会生效)
默认值可以引用解构赋值的其他变量,但该变量必须已经声明
//let [x = 1, y = x] = []; // x=1; y=1
//let [x = 1, y = x] = [2]; // x=2; y=2
//let [x = 1, y = x] = [1, 2]; // x=1; y=2
//let [x = y, y = 1] = []; // ReferenceError: y is not defined
2、对象的解构赋值
解构不仅可以用于数组,还可以用于对象。
let { foo, bar } = { foo: 'aaa', bar: 'bbb' }; //foo='aaa', bar='bbb'
以上代码看上去和数组解构赋值没有多大区别,但是:
(1) 数组解构中数组的元素是按次序排列的,变量的取值由它的位置决定;
(2) 对象解构中对象的属性没有次序,变量必须与属性同名,才能取到正确的值 ;
如下:
let { bar, foo } = { foo: 'aaa', bar: 'bbb' }; //foo="aaa" bar= "bbb"
let { baz } = { foo: 'aaa', bar: 'bbb' }; //baz = undefined,解构失败,值为undefined
对象的解构赋值,可以很方便地将现有对象的方法,赋值到某个变量:
// 例一
let { log, sin, cos } = Math; //将Math对象的对数、正弦、余弦三个方法,赋值到对应的变量上
// 例二
const { log } = console; //将console.log赋值到log变量,简化代码
log('hello') // hello
如果变量名与属性名不一致,必须写成下面这样:
let { foo: baz } = { foo: 'aaa', bar: 'bbb' }; //baz = "aaa"
let obj = { first: 'hello', last: 'world' };
let { first: f, last: l } = obj; //f = 'hello' l = 'world'
这实际上说明,对象的解构赋值是下面形式的简写
let { foo: foo, bar: bar } = { foo: 'aaa', bar: 'bbb' };
真正被赋值的是后者,而不是前者:
let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
//baz = "aaa" foo = error: foo is not defined
与数组一样,解构也可以用于嵌套结构的对象 :
let obj = {
p: [
'Hello',
{ y: 'World' }
]
};
let { p: [x, { y }] } = obj;
x // "Hello"
y // "World"
注意,这时p是模式,不是变量,因此不会被赋值。如果p也要作为变量赋值,可以写成下面这样。
let obj = {
p: [
'Hello',
{ y: 'World' }
]
};
let { p, p: [x, { y }] } = obj;
x // "Hello"
y // "World"
p // ["Hello", {y: "World"}]
默认值:
let {x = 3} = {};
x // 3
let {x, y = 5} = {x: 1};
x // 1
y // 5
let {x: y = 3} = {};
y // 3
let {x: y = 3} = {x: 5};
y // 5
let { message: msg = 'Something went wrong' } = {};
msg // "Something went wrong"
默认值生效的条件是,对象的属性值严格等于undefined
var {x = 3} = {x: undefined};
x // 3
var {x = 3} = {x: null};
x // null
注意点:
如果要将一个已经声明的变量用于解构赋值,必须非常小心
// 错误的写法
let x;
{x} = {x: 1};
上面代码的写法会报错,因为 JavaScript 引擎会将{x}理解成一个代码块, 只有不将大括号写在行首,才能解决
这个问题。
// 正确的写法
let x;
({x} = {x: 1});
由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构。
let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr; //利用数组下标解构赋值
first // 1
last // 3
一、ES6基础的更多相关文章
- ES6 基础
转载自:ES6 基础 一.新的变量声明方式 let/const 与var不同,新的变量声明方式带来了一些不一样的特性,其中最重要的两个特性就是提供了块级作用域与不再具备变量提升. 通过2个简单的例子来 ...
- 新手必看ES6基础
ES6 基础 一.新的变量声明方式 let/const 与var不同,新的变量声明方式带来了一些不一样的特性,其中最重要的两个特性就是提供了块级作用域与不再具备变量提升. 通过2个简单的例子来说明这两 ...
- ES6基础语法
1. 什么是ECMAScript ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association ...
- 从零开始学 Web 之 ES6(四)ES6基础语法二
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- 从零开始学 Web 之 ES6(五)ES6基础语法三
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- 从零开始学 Web 之 ES6(六)ES6基础语法四
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- ES6 基础学习
ECMAScript 6 标准入门 一.let和const let命令 let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效:是块级作用域,且let不允许 ...
- ES6基础-ES6 class
作者 | Jeskson 来源 | 达达前端小酒馆 ES - Class 类和面向对象: 面向对象,即万物皆对象,面向对象是我们做开发一种的方式,开发思维,面向对象的思维中万物皆对象,以人作为例子,它 ...
- ES6基础-ES6的扩展
进行对字符串扩展,正则扩展,数值扩展,函数扩展,对象扩展,数组扩展. 开发环境准备: 编辑器(VS Code, Atom,Sublime)或者IDE(Webstorm) 浏览器最新的Chrome 字符 ...
- ES6基础-变量的解构赋值
作者 | Jeskson 来源 | 达达前端小酒馆 解构赋值: 数组的解构赋值,对象的解构赋值,字符串的解构赋值,数值与布尔值的解构赋值,函数参数的解构赋值. 开发环境准备: 编辑器,VS Code, ...
随机推荐
- iptables匹配条件总结1
源地址 -s选项除了指定单个IP,还可以一次指定多个,用"逗号"隔开即可 [root@web-1 ~]# iptables -I INPUT -s 172.16.0.116,172 ...
- shell脚本的分发,测试,查看
#!/bin/bash for i in {2..64} do #远端复制文件或目录 rcp /test/cpuburn-in 10.1.1.$i:/test/ done #!/bin/bash fo ...
- Linux配置Redis集群 和 缓存介绍。
// 一.什么是缓存? mybatis一级缓存和二级缓存 mybatis的一级缓存存在哪? SqlSession,就不会再走数据库 什么情况下一级缓存会失效? 当被更新,删除的时候sqlsession ...
- STS中创建 javaweb 项目?
package com.aaa.readme; /* * 一. * 1.安装Tomcat 版本8.5 * * 2.file---->new------>dynamic java web p ...
- 解决Vue3使用 Ant Design,出现多个Modal,全是黑屏,导致列表页看不见问题!
尴尬问题 不报错,但是我看着就难受. 求知路上 请教了下强哥,强哥告诉我可能某个样式属性失效引起(无效),建议我F12看下样式. 接着,我F12狂看元素样式,查了一个小时未果,我真抓狂了. 都想明天问 ...
- ExecutorService线程池简单使用
简介 ExecutorService是Java中对线程池定义的一个接口,它位于java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法. 常用方法 public < ...
- 分布式系统及CAP理论
一.集中式系统 在学习分布式之前,先了解一下与之相对应的集中式系统是什么样的. 集中式系统用一句话概括就是:一个主机带多个终端.终端没有数据处理能力,仅负责数据的录入和输出.而运算.存储等全部在主机上 ...
- NSMutableString常用方法
1.NSMutableString常用方法 - (void)appendString:(NSString *)aString; 拼接aString到最后面 NSMutableString *strM ...
- CSS3自定义滚动条样式-webkit内核
自定义滚动条实现 此部分针对webkit内核的浏览器,使用伪类来改变滚动条的默认样式,详情如下: 滚动条组成部分 1. ::-webkit-scrollbar 滚动条整体部分 2. ::-webkit ...
- 关于sys.path.append()
当我们导入一个模块时:import xxx,默认情况下python解析器会搜索当前目录.已安装的内置模块和第三方模块,搜索路径存放在sys模块的path中: >>> import ...