JavaScript ES6常用基础知识总结


Posted in Javascript onFebruary 09, 2019

ES6 let与const及其相关

块级作用域

ES6新增了块级作用域,总结一句话大致就是:大括号{}包起来的代码块基本山都可以当做块级作用域。

常见的有

直接使用{}包起来:

{
 var a = 4
 }

函数体大括号,if-else大括号,for循环大括号,switch大括号,try-catch大括号等。 需要注意的是,for循环,每一次循环时的{}都是一个独立的块级作用域。

for(let i=0; a < 5; i++){
  let j = i
 }

上面代码循环了五次,实际上有五个独立的j。

日常开发中,我们就可以利用这个特性,来创建块级作用域了。

块级作用域变量let与const

使用let或const声明的变量只在当前块级作用域生效,出了这个代码块,就无法访问。

{
  let a = 5
 }
console.log(a) 
// Uncaught ReferenceError: a is not defined

日常开发中,块级作用域中使用的变量,尽量使用let或者const声明。

需要注意的问题:

let和const变量一定要先声明,再使用,避免出错。不要试图利用变量提升的特性。
const声明变量时,一定要初始化,否则会报错。let建议也在声明时初始化。
const声明的变量一旦初始化,以后就不可以在进行赋值操作,但可以对其引用的对象进行更改。

const noChangeMe; 
 // Uncaught SyntaxError: Missing initializer in const declaration
 const noChangeMe = [1,2,4]
 noChangeMe = [2, 3] 
 // Uncaught TypeError: Assignment to constant variable
 noChangeMe[100] = 100 // everything is OK

let和const声明的变量不能再重复声明。 虽然var可以无限次重复声明,但是并不适用于这两个新的声明方式。

let a = 1
 let a = 2 
 // Identifier 'a' has already been declared

不要用window.xxx去调用let与const声明的变量 ES6规定,let、const、class声明的全局变量,不属于顶层对象的属性。

String

使用反引号”`”
使用``将字符串包起来,可以解决下面的问题:

字符串不能换行,如果换行只能使用+号
字符串中的引号如果和最外层相同,需要进行转义
字符串中插入变量,需要用+号 以前这样的写法:

var name = 'world'
 var str = "小明说:\"hello, " + name + "\""  // 小明说:"hello, world"

现在可以方便的写作:

var name = 'world'
 str str = `小明说:"hello, ${name}"`

总的来说,有三个好处:

不怕字符串中出现的引号;
不怕换行,反引号包起来的字符串可以随便换行;
使用${}将变量或表达式包起来直接放在字符串中,不用写很多+

ES6 遍历字符串

使用for...of代替for循环:

var string = 'string'
 for(var i of string) {
 console.log(i)
 }

includes(),startsWidth(),endsWidth()
不用使用indexOf()判断字符串中是否包含某个值了,使用includes():

var string = 'string'
 string.includes('i', 0)  // true

includes第二个参数表示查找的起始索引。 还可以使用startsWidth()和endsWidth()判断字符串是否以某些字符开始或结尾。

ES6 函数

参数的默认值

方便地设置函数参数的默认值

function print( a = 2 ){
 console.log(a)
 }
 print() //2

ES6 扩展运算符…获取其余参数

可以使用...加上变量名保存其他参数全部数量。 当只知道函数的前几个具体参数,不确定之后会有多少个参数传入时,可以使用...把其他传入的参数保存到一个数组中。

function print(value1, value2, ...values){
 console.log(values.join('--'))
 }
 print(1, 2, '参数3') // 参数3
 print(1, 2, '参数3', '参数4', '参数5') // print(1, 2, '参数3', '参数4', '参数5')

ES6 使用箭头函数

使用箭头函数有两个好处:

代码更加简洁
静态绑定this 箭头函数中,this指向的是定义箭头函数的对象中的this。

var name = 'outer'
 var obj = {
  name: 'inner',
  func: () => {
  console.log(this.name)
  }
 }
 var obj2 = {
   name: 'inner',
   func: function() {
     console.log(this.name)
   }
 }
 obj.func() // "outer"
 obj2.func() // "inner"

第一个使用了箭头函数,由于箭头函数的this与其所在环境中的this相同,也就是与obj的this相同,而obj处于全局环境的活动对象中,this指向全局对象,这里指window,所以输出outer。 注意:obj对象的this与它的属性中的this不一样。 第二个使用了寻常函数,作为obj2的一个属性,func方法中的this指向了所在的对象。输出inner。

ES6 数组

使用Array.from()把类数组对象转为数组

一般来说,含有length属性的对象就可以当作类数组对象。平时获取多个DOM对象后,不能使用数组中的很多方法。我们可以使用Array.from方便的转换为数组,。

var divs = Array.from(document.querySelectorAll('div'))
 divs.forEach((value, index) => {})

使用fill()初始化数组

想要以某个值初始化数组,需要遍历。而使用fill()方法,就方便了很多。

var arr = new Array(100) // 建立一个100元素的数组
 arr.fill('初始值', 0, arr.length)

第一个参数是要填充的值,后面两个与一般的数组方法一样,起始索引和结束索引(不包括)。

使用includes方法

和字符串的includes方法一样,看数组中是否有给定值。

对象
使用简单的属性表示和方法表示

var name = 'John'
 var a = {
 name: name,
 sayName: function(){ console.log(this.name) }
 }

改写为:

var name = 'John'
 var a = {
 name,
 sayName () { console.log(this.name) }
 }

记得Object.is()这个方法
其与===的差别:

NaN === NaN // false
 Object.is(NaN, NaN) // true

 -0 === +0  //true
 Object.is(+0, -0) // false
 Object.is(+0, 0) / true
 Object.is(-0, 0) / false

可以这样理解,遵循的原则: 是同一个东西就要相等。 NaN与NaN就是一个东西,而-0带了个负号,和0与+0不一样。0和+0相同就像1和+1相同一样。

使用Object.assign()合并多个对象

Object.assign()是用来合并对象的。assign,译作分配,指派。这个方法本意是将某些对象自己的属性拷贝到目标对象上。它不回去复制继承来的属性。 比如可以在定义某个配置的时候,定义一个基础配置,在定义两个不同情况下的配置。使用时,进行合并。

var pathConfig = {
 path: 'style/images'
 }
 var devConfig = {
 baseUrl: 'http://localhost:8080/'
 }
 var buildConfig = {
 baseUrl: 'https://192.128.0.2'
 }
 // 使用时,合并
 var mode = 'dev'
 var config = Object.assign({}, pathConfig, mode === 'dev' ? devConfig : buildConfig)

只是举个例子。

Object.keys(),Object.values(),Object.entries
这三个方法返回对象自身的,可枚举的,属性名为字符串的属性相关的东西,分别为:

Object.keys(): 属性名组成的数组
Object.values(): 属性值组成的数组
Object.entries: ["key", "value"]组成的数组。
 var john = {
 name: 'John',
 age: 12
 }
 Object.keys(john) // ["name", "age"]
 Object.values(john) // ["John", 12]
 Object.entries(john) // [["name", "John"], ["age", 12]]

ES6 ...运算符

前面在函数的剩余参数处理中提到了...扩展运算符。总结了一下,感觉有两个用法:

用来读取数组或者对象的时候,是把数组或对象给扩展开;
用来给对象或者数组赋值的时候,自动给对象或数组添加属性或元素。
用来读取
读取的时候就是把数组或者对象给扩展开来。

var a = [...[1,2,3], 4] // 把数组的每一项都展出来
 a // [1, 2, 3, 4]
 var obj = {
 name: 'John',
 age: 12
 }
 var newObj = {...obj, job: 'teacher' } // 把某个属性展出来
 newObj // {name: "John", age: 12, job: "teacher"}

所以可以很方便的用来扩展,合并数组或对象。

用作赋值

用作赋值的时候,是用作解构赋值,含义就是把等号右边表达式的剩余属性或数组项都放到...后面的变量里。

var a, restB
 [a, ...restB] = [1, 3, 5]
 a // 1
 restB // [3, 5]

 var c, restD
 { name, ...restD } = {name: 'John', age: 12, job: 'teacher'}
 name // "John" 是一个属性的值
 restD // { c, ...restD } = {name: 'John', age: 12, job: 'teacher'} 是一个对象

对于对象的解构赋值,会把对应不到的属性全部放进...后面的变量对象中。

注意:因为是把剩下没人要的属性或者数组项都收下,所以...应该放在数组或者对象中的最后,且只能有一个。

以上即是ES6常用基础知识总结,希望对大家有所帮助

Javascript 相关文章推荐
基于JQuery实现CheckBox全选全不选
Jun 27 Javascript
表格奇偶行设置不同颜色的核心JS代码
Dec 24 Javascript
JS二维数组的定义说明
Mar 03 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
Jul 21 Javascript
jQuery中的read和JavaScript中的onload函数的区别
Aug 27 Javascript
js兼容火狐显示上传图片预览效果的方法
May 21 Javascript
JavaScript必知必会(五) eval 的使用
Jun 08 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
Aug 23 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
Nov 21 Javascript
JS获取指定月份的天数两种实现方法
Jun 22 Javascript
Vue 表情包输入组件的实现代码
Jan 21 Javascript
JS异步错误捕获的一些事小结
Apr 26 Javascript
Vue组件的使用及个人理解与介绍
Feb 09 #Javascript
Vue自定义指令写法与个人理解
Feb 09 #Javascript
Vue指令指令大全
Feb 09 #Javascript
vue基于两个计算属性实现选中和全选功能示例
Feb 08 #Javascript
vue计算属性get和set用法示例
Feb 08 #Javascript
vue多次循环操作示例
Feb 08 #Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
Feb 08 #Javascript
You might like
PHP新手上路(四)
2006/10/09 PHP
php快速url重写更新版[需php 5.30以上]
2010/04/25 PHP
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
jQuery siblings()用法实例详解
2016/04/26 Javascript
Vue.JS入门教程之自定义指令
2016/12/08 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
使用Angular CLI进行Build(构建)和Serve详解
2018/03/24 Javascript
Vue一次性简洁明了引入所有公共组件的方法
2018/11/28 Javascript
Javascript实现一朵从含苞到绽放的玫瑰
2019/03/30 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
Python的pycurl包用法简介
2015/11/13 Python
Python简单实现子网掩码转换的方法
2016/04/13 Python
python 列表降维的实例讲解
2018/06/28 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
python判断计算机是否有网络连接的实例
2018/12/15 Python
Python基础教程之if判断,while循环,循环嵌套
2019/04/25 Python
人工神经网络算法知识点总结
2019/06/11 Python
基于Tensorflow高阶读写教程
2020/02/10 Python
python 一维二维插值实例
2020/04/22 Python
python获取响应某个字段值的3种实现方法
2020/04/30 Python
python tqdm实现进度条的示例代码
2020/11/10 Python
10分钟理解CSS3 FlexBox弹性布局
2018/12/20 HTML / CSS
美国波西米亚风格服装品牌:Show Me Your Mumu
2018/01/05 全球购物
奥地利体育网上商店:Gigasport
2019/10/09 全球购物
高中生的自我评价
2014/03/04 职场文书
高中生职业规划范文
2014/03/09 职场文书
化工专业求职信
2014/07/01 职场文书
房屋产权共有协议书范本
2014/11/03 职场文书
2014年保卫工作总结
2014/12/05 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
2016年端午节寄语
2015/12/04 职场文书