ES6——基础

ES6基础

在这里插入图片描述

1. 概念

​ ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准。

​ ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现(另外的 ECMAScript 方言还有 Jscript 和 ActionScript)。

2. const、let、var

const

​ 声明的变量必须提供一个值,而且会被认为是常量,意思就是它的值被设置完成后就不能再修改了。

const name = 'lux'
name = 'joe' // 再次赋值此时会报错

​ 如果 const 的是一个对象,对象所包含的值是可以被修改的。抽象一点儿说,就是对象所指向的地址不能改变,而变量成员是可以修改的。

const student = { name: 'cc' }
// 没毛病
student.name = 'yy'
// 如果这样子就会报错了
student  = { name: 'yy' }
let

​ ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在代码块内有效,只能申明一次,没有变量提升

var

​ 全局有效,可以多次申明,有变量提升(当脚本开始运行的时候申明的变量就已经存在,但是并未赋值)。ES6都用let,不用var。

//变量提升示例
console.log(a);  //ReferenceError: a is not defined
let a = "apple";
 
console.log(b);  //undefined
var b = "banana";

3. 解构

​ 基本用法:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。

//数组举例
基本
let [a, b, c] = [1, 2, 3];
// a = 1,b = 2,c = 3
可嵌套
let [a, [[b], c]] = [1, [[2], 3]];
// a = 1,b = 2,c = 3
可忽略
let [a, , b] = [1, 2, 3];
// a = 1,b = 3
不完全解构
let [a = 1, b] = []; 
// a = 1, b = undefined
剩余运算符
let [a, ...b] = [1, 2, 3];
//a = 1,b = [2, 3]

在数组的解构中,解构的目标若为可遍历对象,皆可进行解构赋值。可遍历对象即实现 Iterator 接口的数据。
let [a, b, c, d, e] = 'hello';
// a = 'h',b = 'e',c = 'l',d = 'l',e = 'o'
解构默认值
let [a = 2] = [undefined]; // a = 2
当解构模式有匹配结果,且匹配结果是 undefined 时,会触发默认值作为返回结果。
let [a = 3, b = a] = [];     // a = 3, b = 3
let [a = 3, b = a] = [1];    // a = 1, b = 1
let [a = 3, b = a] = [1, 2]; // a = 1, b = 2

集合遍历:ES6便利所有Array、Object、Map、Set

for(let item of items){}

while(!$result.value){$result=$Iterator.next()}

//有一些场合会默认调用 Iterator 接口(即Symbol.iterator方法)

//【解构函数】
let set = new Set().add('a').add('b').add('c');
let [first, ...rest] = set;
// first='a'; rest=['b','c'];

//【扩展运算符】
var str = 'hello';
[...str] //  ['h','e','l','l','o']

let s = new Set().add().add()//无序不可重复
let ws = new WeakSet().add()//只能放对象,String都不行
let m = new Map().set()//key类型不限制
let wm = new WeakMap().set()//key只能存放对象,String都不行

null是一个object,{null==""}//true

4. 函数

function log(x, y) {
  y = y || 'World';
  console.log(x, y);
}

log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello World

​ 上面代码检查函数log的参数y有没有赋值,如果没有,则指定默认值为World。这种写法的缺点在于,如果参数y赋值了,但是对应的布尔值为false,则该赋值不起作用。就像上面代码的最后一行,参数y等于空字符,结果被改为默认值。

function log(x, y = 'World') {
  console.log(x, y);
}

log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello
箭头函数 (…params)=>{code block}

普通函数function fun_name(…params){code block}

​ 箭头函数最直观的三个特点:

  1. 不需要 function 关键字来创建函数

  2. 省略 return 关键字

  3. 继承当前上下文的 this 关键字

//例如:
[1,2,3].map(x => x + 1)

//等同于:
  [1,2,3].map((function(x){
  return x + 1
}).bind(this))

​ 当你的函数有且仅有一个参数的时候,是可以省略掉括号的。当你函数返回有且仅有一个表达式的时候可以省略{} 和 return;例如:

var people = name => 'hello' + name
//参数name就没有括号
var people = (name, age) => {
  const fullName = 'hello' + name
  return fullName
}
//如果缺少()或者{}就会报错

​ js中函数有两种命名方式:

function fun_name(){};函数提升,解释器优先编译
let fun = function(){};等到执行到该代码才会编译

function fun_name(){}();自动忽略()
let fun = function(){}();可以直接调用
(function fun_name(){})()//function fun_name(){}用括号括起来可以看作是函数表达式,用()直接调用

常用函数

//repeat字符串复制指定次数
let a = "啤酒子"
console.log(a.repeat(3))
Promise

​ Promise的构造函数的参数是函数,该函数的参数是两个函数,这两个函数js自带的,Promise执行成功执行resolve方法,失败执行reject

/*执行顺序: AAA -> CCC -> BBB。
Promise新建后会立即执行,所以首先输出 AAA。
然后,then方法指定的回调函数将在当前脚本所有同步任务执行完后才会执行,所以BBB 最后输出。*/
let promise = new Promise(function(resolve, reject){
    console.log("AAA");
    resolve()
});
promise.then(() => console.log("BBB"));
console.log("CCC")
生成器函数
function* show(){
	console.log('开始生成器函数')//调用next开启函数
	yield;//到这里会停止,直到再次调用next方法
	console.log('再次开启生成器函数')
}
let fun = show();
fun.next();
fun.next();

5. 模板字符串

​ 模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。

		// 普通字符串
        `In JavaScript '\n' is a line-feed.`

         // 多行字符串
          `In JavaScript this is
       not legal.`

        console.log(`string text line 1
         string text line 2`);

       // 字符串中嵌入变量
        let name = "Bob", time = "today";
        `Hello ${name}, how are you ${time}?`.

​ 模板字符串调用函数

 function fn() {
   return "Hello World";
 }

 `foo ${fn()} bar`
// foo Hello World bar

举例:

let serverUrl='http:localhost:8080'
let typeid='1'
let str='${serverUrl}/test.do?typeid=${typeid}'

//函数需要返回字符串或者简单数据类型
let fun = ()=>{return ""}
console.log(${fun()})

//数组拼接
let arr1 = [1,2,3]
let arr2 = [4,5,6]
let arr3 = [...arr1, ...arr2]

6. 获取标签

document.querySelector

7. import & export

​ 模块功能主要由两个命令构成:exportimportexport命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。

import {} from './xx.js'//如果是导入export default就不要花括号,因为只有一个export default

export let job = 'worker'//加在变量、函数前,相当于public,特殊的

8. document —整个dom树

1.获取标签
document.querySelectorAll(#id||.classname||'label_name')

没有则返回空的nodelist(DOM快照,对增删不敏感,对修改敏感)

document.querySelector(#id||.classname||'label_name')

返回符合条件的第一个,没有则返回null

2.document.getELementByTagName()

返回类型HTMLCollection

(对增删敏感,注意不是数组,可用数组下标索引,但不能用数组方法)

arguments:js中传形参,可传可不传,要想看到传过来的参数,直接console.log(arguments)

navigator:Navigator 对象包含的属性描述了正在使用的浏览器。

注意
1. let a = [1,2,3] 不可以被 a = 10覆盖掉
function show(x,y=[1,2,3]){} show(1,2)可以覆盖
2. 已有的字符串拼接${a + b},不是${a}+${b}
3. find()方法(当前参数,参数索引,数组)
[1,2,3,4,5].find(function(x,y,z){
	// console.log(x,y,z);
	console.log(z[y])//1,2,3,4,5
})
4. console.error()控制台打印,后面的代码依然会执行
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
曾经听许多前端从业者说:“前端发展太快了。”这里的快,十有八九是说层出不穷的新概念,余下的一二,大抵只是抒发一下心中的苦闷罢——前两日刚习得的新技术转眼就“落后”——仔细品味这苦闷,除却不得不持续奔跑的无奈,更多的是一口气,一口卯足了劲儿也要把新知识全数揽入囊中的不服气。作为刚入行的新人,对这点体会颇深。就像是蓦地从某个时间点切入,半数时间向前走,半数时间向后看,瞻前顾后,回味揣摩这十年间的岁月精魄,还得翘首盼着花花新世界,不时再问自己一句,这样走下去真的会好么?是的,其实答案人尽皆知,同时也无人知晓,因为没人能预言未来,顶多只能预测未来,但有一件事情永不会错,当你笃定地沿着一条路走下去,结果通常不会太糟糕,但凡能在浮躁的社会冷静下来潜心磨砺,多少总会有收获。幸而我有意弱化了对新信息的执念,开始做一些事情,《深入浅出ES6》就是其中一件。 纵观整个系列,亦即纵观ECMAScript 2015的整个体系,吸取了诸多成功经验:借鉴自CoffeeScript的箭头函数;始于C++项目Xanadu,接着被E语言采用,后来分别于Python和JavaScript框架Dojo中以Deferred对象的面貌出现的Promise规范(详见Async JavaScript一书3.1章);借鉴了C++、Java、C#以及Python等语言的for-of循环语句;部分借鉴Mustache、Nunjucks的模板字符串。 当然,新的语言体系也在之前的基础上查漏补缺:弥补块级作用域变量缺失的let和const关键字;弥补面向大型项目缺失的模块方案;标准委员会甚至为JavaScript增加了类特性,有关这一方面的特性褒贬不一,Douglas Crockford曾在2014年的Nordic.js大会发表了题为《The Better Parts》的演讲,重新阐述了他个人对于ECMAScript 6的看法,他认为Class特性是所有新标准中最糟糕的创新(我个人也略赞同这一说法,类的加入虽然有助于其它语言的使用者开始使用JavaScript,但是却无法发挥出JavaScript原型继承的巨大优势);以及为了保持非侵入式弥补其它新特性而诞生的Symbols。 其它的新特性也相当诱人,熟练掌握可以大幅度提升开发效率:迭代器Iterator、生成器Generators、不定参数Rest、默认参数Default、解构Destructuring、生成器Generator、代理Proxy,以及几种新类型:Set、Map、WeakSet、WeakMap、集合Collection。 以上提及的新特性只是其中的一部分,更多的新特性等待着大家进一步挖掘。整个系列的翻译历时150余天,坚持专栏翻译的日子艰苦也快乐,编辑徐川细心地帮我审校每一篇文章,编辑丁晓昀赠予钱歌川先生详解翻译之著作让我大开眼界,与李松峰老师的交流也让我深刻理解了“阅读、转换、表达”的奥义所在,最感谢我的母亲,在我遇到困难需要力量的时候永远支持着我。选择ES6作为前端生涯的切入点实之我幸,恰遇这样的机会让我可以一心一意地向前走,向未来走。我很敬佩在“洪荒”和“战乱”年代沉淀无数经 验的前辈们,你们在各种不确定的因素中左右互搏,为终端用户提供统一的用户体验,直到如今你们依然孜孜不倦地吸取业内新鲜的经验。技术在进步,也为前端人 提供着无限的可能性,我们有责任也有义务去推动新标准的发展和普及,诚然在商业的大环境下我们不愿放弃每一寸用户的土壤,但携众人之力定将能推动用户终端 的革新。ES7标准的提案纷纷提上日程,用不了多久也将登上前端大舞台。也感谢午川同学友情提供译文《深入浅出ES6(十):集合 Collection》,让我在困难时期得以顺利过渡。最后祝愿国内前端社区向着更光明美好的未来蓬勃生长!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值