一、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基础知识的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持Devmax。

ES6基础知识介绍的更多相关文章

  1. 详解如何使用webpack+es6开发angular1.x

    本篇文章主要介绍了详解如何使用webpack+es6开发angular1.x,具有一定的参考价值,有兴趣的可以了解一下

  2. JavaScript基础之变量

    这篇文章主要介绍了如何理解JavaScript中的变量,帮助大家更好的学习JavaScript,感兴趣的朋友可以了解下

  3. 结合 ES6 类编写JavaScript 创建型模式

    这篇文章主要介绍了结合ES6类编写JavaScript创建型模式,本文开始系统性的对20多种JavaScript 设计模式进行简单概述,然后结合ES6类的方式来编写实例代码展示其使用方式,需要的朋友可以参考一下

  4.  typeScript入门基础介绍

    这篇文章主要介绍了 typeScript入门基础,TypeScript 是由微软开发的开源、跨平台的编程语言,是 javaScript 的超集,最终被编译为 javaScript代码。常常被简称为TS支持JS、ES语法,下文将继续其他基础介绍,需要的朋友可以参考一下

  5. 分析ES5和ES6的apply区别

    这篇文章主要介绍了分析ES5和ES6的apply区别,对ES6感兴趣的同学,可以参考下

  6. ES6的Promise用法详解

    本文详细讲解了ES6的Promise用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  7. Javascript 基础---Ajax入门必看

    下面小编就为大家带来一篇Javascript 基础---Ajax入门必看。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. Javascript基础知识详解

    本篇适合javascript新手或者学了前端一段时间,对js概念不清晰的同学。本文将讲述几点对于初学者遇到的javascript的坑,相信对javascript基础薄弱的同学,可以加深对javascript的理解

  9. JavaScript基础之作用域

    这篇文章主要介绍了如何理解JavaScript中的作用域,帮助大家更好的学习JavaScript,感兴趣的朋友可以了解下

  10. Mybatis基础概念与高级应用小结

    这篇文章主要介绍了Mybatis基础回顾与高级应用,本文内容有点小长,希望大家耐心阅读,此文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部