ES6出来挺长一段时间了,但目前网上好像教程并不多也不详细。我依然遵循傻瓜式教学模式,白话文说明JavaScript和ES6的一些区别,说明下ES6的一些新特性。本文适合新手学习,大神请勿见笑,在下在此班门弄斧了。本文估计要写一段时间,晚上抽空便更新一段。

var和let的区别
var是函数作用域,let是代码块作用域
var a = 12;
if(true){
var a = 5;
console.log(a);
}
console.log(a);
两次都输出5,if模块里a被重新赋予值5;
let b = 12;
if(true){
let b = 5;
console.log(b);
}
console.log(b);
第一次输出5,第二次输出12,let是代码块作用域,代码块里重新let,不会影响代码块外面的a;
  let解决变量提升的问题
console.log(a); // undefined
console.log(b); // undefined
var a = 12;
let b = 3;
这里其实会出现类似函数提升一样的效果,也就是对于 js 引擎上面的代码的执行顺序其实是先 var a,再 console.log(a)(所以会输出undefined) ,而let不会出现函数提升的效果;
  暂时性死区
var a = 123;
if(true){
a = 456;
let a = 5;
console.log(a);
}
尽管a是全局变量,但是在代码块里let了a,这个代码块便形成封闭作用域,全局变量a也会失效,这时a = 456是在let a之前操作,这时的a是未定义的,所以a = 456这个操作会报错,形成暂时性死区;
  块级作用域
{
let a = 5;
console.log(a);
{
console.log(a);
}
}
console.log(a);
第一第二行打印出5,第三行报错,let是代码块作用域,内部声明的函数皆不会影响到作用域的外部;
块级作用域另一个例子:
function f(){
console.log('out');
}
(function(){
if(true){
function f(){
console.log('in');
}
}
f();
}());
ES6环境下输出为out,if模块下函数重定义只在块级内生效,不会影响到块级外;
 
const的用法
const a;
const a = 5;
let a = 5;
const给变量赋值后,值就不能改变,const定义赋值需同时进行,不可只定义不赋值;
const作用域和let相同,声明的常量也不提升,也存在暂时性死区;
  const obj = {
"name": "666"
};
Object.freeze(obj);
obj.name = 'hi';
console.log(obj);
const定义一个对象后,对象虽不能再定义,但是依然可以改变对象中的属性;
如果希望对象中的属性也不可被更改,就用对象冻结方法Object.freeze();
  跨模块常量,读取其他js文件中的变量
同目录下constants.js中的代码为:
export const A = 123;
export const B = 'abc';
export const C = '666';
引入constants.js
import * as constants from './constants';
console.log(constants.A); // 123
console.log(constants.B); // abc
import {A,B} from './constants';
console.log(A); // 123
console.log(B); // abc
  解构赋值,一种特殊的复制方法
let [a,b,c] = [1,2,3];
console.log(a); // 1
let [a,[b,c],d] = [1,[3],5];
console.log(b); // 3
let [,,c] = ['isA','isB','isC'];
console.log(c); // isC
let [a] = 1; // 报错,=号两边模式必须相同
let [a = 'a'] = []; // 设置默认值
console.log(a); // a
let [a,b = 'isB'] = ['a']; // b设置默认值
console.log(a); // a
console.log(b); // isB
let [a = 'aaa',b] = [undefined,'bbb'];
console.log(a); // aaa
console.log(b); // bbb
let { a } = { b: 'bbb', a: 'aaa' };
console.log(a); // aaa
let { a } = { b: "bbb", c: "ccc" };
console.log(a); // undefined
数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名;
let { b: a} = { c: 'ccc', b: 'bbb'};
console.log(a); // bbb
let obj = { first: 'hello', second: 'world'};
let { first: f, second: s } = obj;
console.log(f); // hello
console.log(s); // world
真正被赋值的是后者,而不是前者;
let obj = {
p: [
'hello',
{
y: 'world'
}
]
};
let { p: [ x, { y } ] } = obj;
console.log(x); // hello
console.log(y); // world
let x;
{ x } = { x: 'xxx' };
console.log(x); // 语法错误,{ x }会被理解成一个代码块
let x;
({ x } = { x: 'xxx' });
console.log(x); // xxx
字符串的解构赋值
let [a,b,c,d,e] = 'hello';
console.log(a); // h
console.log(b); // e
console.log(c); // l
console.log(d); // l
console.log(e); // o
length属性的解构赋值
let { length: len } = 'hello word';
console.log(len); // 10
其他属性的解构赋值
let { toString: s } = 123;
console.log(isNaN(s)); // true
let { a, b } = { a: null, b: undefined };
console.log(a); // null
console.log(b); // undefined
函数参数解构赋值
function add([x,y]){
return x + y;
}
console.log( add([1,2]) ); // 3
function move({ x = 0, y = 0} = {}){
return { x, y };
}
console.log( move() ); // { x: 0, y: 0 }
console.log( move({ x: 5, y: 9}) ); // { x: 5, y: 9 }
console.log( move({ y:6 }) ); // { x: 0, y: 6 }
console.log( move({}) ); // { x: 0, y: 0 }
变换x,y值
let x = 3, y = 5;
[ x, y ] = [ y, x ];
console.log(x); // 5
console.log(y); // 3
解构赋值取函数返回的数组
function example(){
return [1, 2, 3];
}
let [a, b, c] = example();
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3
解构赋值取函数返回的对象
function example(){
return {
a: 'aaa',
b: 'bbb',
c: 'ccc'
}
}
var { a, b, c } = example();
console.log(a); // aaa
console.log(b); // bbb
console.log(c); // ccc
其他应用
function f([x, y, z]){...}
f([1, 2, 3]);
function f({x, y, z}){...}
f({y: 1, x: 2, z: 3});
解构赋值提取json数据
var jsonData = {
id: 1002,
status: "ok",
data: [
{
age: 23,
name: "quuek"
},
{
age: 20,
name: "huuk"
},
{
age: 18,
name: "asut"
}
]
}
let { id, status, data: list } = jsonData;
console.log(id); // 1002
console.log(status); // ok
console.log(list); // [{ age: 23, name: "quuek"}, ...]
  集合遍历
let map = new Map();
map.set('first', 'hello');
map.set('second', 'world');
for(let[key, val] of map){
console.log(key + ' is ' + val); // first is hello second is world
}
获取键名
for (let [key] of map) {
// ...
}
// 获取键值
for (let [,value] of map) {
// ...
}
  字符串遍历器
let str = 'a1b2c3d4e5';
for(let item of str){
console.log(item); // a,1,b,2,c,3 ...
}
 
includes(), startsWith(), endsWith()的使用方法
let str = 'this is a string of test';
let includes = str.includes('es');
let startsWith = str.startsWith('t');
let endsWith = str.endsWith('t');
console.log(includes);
console.log(startsWith);
console.log(endsWith);
let includes2 = str.includes('es', 6);
let startsWith2 = str.startsWith('t', 3);
let endsWith2 = str.endsWith('t', 7);
console.log(includes2);
console.log(startsWith2);
console.log(endsWith2);
使用第二个参数n时,endsWith的行为与其他两个方法有所不同。它针对前n个字符,而其他两个方法针对从第n个位置直到字符串结束。
  repeat(n) 将原字符串重复n次
let newab = 'ab'.repeat(3);
console.log(newab); // ababab
  传统的JavaScript语言,输出模板通常是这样写的。
$("#result").append(
"There are <b>" + basket.count + "</b> " +
"items in your basket, " +
"<em>" + basket.onSale +
"</em> are on sale!"
);
上面这种写法相当繁琐不方便,ES6引入了模板字符串解决这个问题。
let count = 5, onSale = 'qw';
document.getElementById('result').innerHTML = (`
<p>There are <b>${count}</b> items</p>
<div class="second-line">in your basket, <em>${onSale}</em></div>
are on sale!
`);
普通字符串
`In JavaScript '\n' is a line-feed.`
多行字符串
`In JavaScript this is
not legal.`
console.log(`string text line 1
string text line 2`);
字符串中嵌入变量
var name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`
上面代码中的字符串,都是用反引号表示。如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。
var greeting = `\`Yo\` World!`;
如果使用模板字符串表示多行字符串,所有的空格和缩进都会被保留在输出之中。
$("#warning").html(`
<h1>Watch out!</h1>
<p>Unauthorized hockeying can result in penalties
of up to ${maxPenalty} minutes.</p>
`);
模板字符串中嵌入变量,需要将变量名写在${}之中。
function authorize(user, action) {
if (!user.hasPrivilege(action)) {
throw new Error(
// 传统写法为
// 'User '
// + user.name
// + ' is not authorized to do '
// + action
// + '.'
`User ${user.name} is not authorized to do ${action}.`);
}
}
大括号内部可以放入任意的JavaScript表达式,可以进行运算,以及引用对象属性。
var x = 1;
var y = 2;
`${x} + ${y} = ${x + y}`
"1 + 2 = 3"

未写完,更新中......

ES6新特性之傻瓜式说明的更多相关文章

  1. 轻松学会ES6新特性之生成器

    生成器虽然是ES6最具魔性的新特性,但也是最难懂得的一节,笔者写了大量的实例来具体化这种抽象的概念,能够让人一看就懂,目的是希望别人不要重复或者减少笔者学习生成器的痛苦经历. 在说具体的ES6生成器之 ...

  2. 34.js----JS 开发者必须知道的十个 ES6 新特性

    JS 开发者必须知道的十个 ES6 新特性 这是为忙碌的开发者准备的ES6中最棒的十个特性(无特定顺序): 默认参数 模版表达式 多行字符串 拆包表达式 改进的对象表达式 箭头函数 =&> ...

  3. 前端学习笔记 --ES6新特性

    前言 这篇博客是我在b站进行学习es6课程时的笔记总结与补充. 此处贴出up主的教程视频地址:深入解读ES6系列(全18讲) 1.ES6学习之路 1.1 ES6新特性 1. 变量 2. 函数 3. 数 ...

  4. ES6新特性概览

    本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...

  5. ES6新特性之模板字符串

    ES6新特性概览  http://www.cnblogs.com/Wayou/p/es6_new_features.html 深入浅出ES6(四):模板字符串   http://www.infoq.c ...

  6. Atitit js版本es5 es6新特性

    Atitit js版本es5 es6新特性 Es5( es5 其实就是adobe action script的标准化)1 es6新特性1 Es5( es5 其实就是adobe action scrip ...

  7. ES6新特性:Proxy代理器

    ES6新特性:Proxy: 要使用的话, 直接在浏览器中执行即可, node和babel目前还没有Proxy的polyfill;,要使用的话,直接在浏览器中运行就好了, 浏览器的兼容性为:chrome ...

  8. ES6新特性(函数默认参数,箭头函数)

    ES6新特性之 函数参数的默认值写法 和 箭头函数. 1.函数参数的默认值 ES5中不能直接为函数的参数指定默认值,只能通过以下的变通方式:   从上面的代码可以看出存在一个问题,当传入的参数为0或者 ...

  9. ES6新特性简介

    ES6新特性简介 环境安装 npm install -g babel npm install -g babel-node //提供基于node的REPL环境 //创建 .babelrc 文件 {&qu ...

随机推荐

  1. const 常量与 define常量的区别

    c++中的常量可以使用const定义,也可以使用#define宏定义的方式:二者区别如下: - **区别** 1. const定义的常量有自己的数据类型,编译器可以对其进行严格的类型检查:但是defi ...

  2. BZOJ 4031 HEOI2015 小Z的房间 基尔霍夫矩阵+行列式+高斯消元 (附带行列式小结)

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可 ...

  3. rcnn spp_net

    在http://www.cnblogs.com/jianyingzhou/p/4086578.html中 提到 rcnn开创性工作,但是计算时间太长,重复计算太大. spp_net将重复计算避免了 我 ...

  4. Z.XML第一次迭代分数分配

    紧张的第一次迭代落下帷幕,便到了分数分配这样令人揪心又无奈的日子.如何进行分数分配,以使大家都能满意,这一直是个难以非常好地处理的问题.幸运地是,我们团队的所有成员每个人都对本次迭代乃至整个项目过程付 ...

  5. get? post? put? delete? head? trace? options? http请求方法

    http1.1协议里面定义了八种请求方法: get:用作获取,读取数据 post:向指定的资源提交数据 put:更新,向指定的资源上传一个内容,比如说:更新一个用户的头像或者替换掉已有的一个视频 de ...

  6. 【iOS开发】NSOperation简单介绍

    iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...

  7. 福大软工1816:Alpha(2/10)

    Alpha 冲刺 (2/10) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.学习qqbot库: 2.实 ...

  8. java对数组的操作

    1 拷贝数组 数组全拷贝 数组定位拷贝 2 判断数组是否相等(每个元素都对应相等) 3 数组和集合的相互转化 import java.util.Arrays; import java.util.Lis ...

  9. PAT 甲级 1036 Boys vs Girls(20)

    https://pintia.cn/problem-sets/994805342720868352/problems/994805453203030016 This time you are aske ...

  10. Xcode & swift

    swift-apps swift 2018 apps Xcode Swift Playground https://developer.apple.com/download/ https://deve ...