学习笔记:ES6

学习笔记:ES6

 

http://es6.ruanyifeng.com/  ECMAScript 6

https://frankfang.github.io/es-6-tutorials/  ES 6 新特性列表  2017-12-29

http://www.runoob.com/w3cnote/es6-concise-tutorial.html  ESMAScript 6简明教程  2018-1-8

https://juejin.im/post/5991549af265da3e345f6e6d  ES6 变量声明与赋值:值传递、浅拷贝与深拷贝详解

https://segmentfault.com/a/1190000013099221  ES6 换种思路处理数据  2018-2-2

 


以下是ES6排名前十的最佳特性列表(排名不分先后):

  • Default Parameters(默认参数) in ES6
  • Template Literals (模板文本)in ES6
  • Multi-line Strings (多行字符串)in ES6
  • Destructuring Assignment (解构赋值)in ES6
  • Enhanced Object Literals (增强的对象文本)in ES6
  • Arrow Functions (箭头函数)in ES6
  • Promises in ES6
  • Block-Scoped Constructs Let and Const(块作用域构造Let and Const)
  • Classes(类) in ES6
  • Modules(模块) in ES6

 

 


笔记正文

ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

 

let命令

它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。(for循环的计数器,就很合适使用let命令。)

在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”

不允许重复声明 : let不允许在相同作用域内,重复声明同一个变量。

let实际上为 JavaScript 新增了块级作用域。

ES6 允许块级作用域的任意嵌套。

内层作用域可以定义外层作用域的同名变量。

ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。

考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。

// 函数声明语句
{
  let a = 'secret';
  function f() {
    return a;
  }
}

// 函数表达式
{
  let a = 'secret';
  let f = function () {
    return a;
  };
}

 

const 命令

const声明一个只读的常量。一旦声明,常量的值就不能改变。

const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。

const的作用域与let命令相同:只在声明所在的块级作用域内有效。

 

ES5和ES6

ES5 只有两种声明变量的方法:var命令和function命令。

ES6 一共有6种声明变量的方法:var命令和function命令、let和const命令、import命令和class命令

顶层对象window的属性与全局变量挂钩,被认为是JavaScript语言最大的设计败笔之一。

ES6为了改变这一点,一方面为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从ES6开始,全局变量将逐步与顶层对象的属性脱钩。

var a = 1;
// 如果在Node的REPL环境,可以写成global.a
// 或者采用通用方法,写成this.a
window.a // 1

let b = 1;
window.b // undefined

 

变量的解构赋值

数组的解构赋值:

以前,为变量赋值,只能直接指定值。

let a = 1;
let b = 2;
let c = 3;

ES6 允许写成下面这样。

let [a, b, c] = [1, 2, 3];

上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值。

解构赋值允许指定默认值

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 { bar, foo } = {  bar: "bbb" , foo: "aaa"};
foo // "aaa"
bar // "bbb"

字符串的解构赋值:

字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。

const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"

数值和布尔值的解构赋值(略)

函数参数的解构赋值(略)

 


 

字符串的扩展

1、字符的 Unicode 表示法: 用大括号

JavaScript 允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的 Unicode 码点。

但是,这种表示法只限于码点在\u0000~\uFFFF之间的字符。超出这个范围的字符,必须用两个双字节的形式表示。

let s1='\u20BB7';    //₻7
let s2='\u{20BB7}';    //?

2、codePointAt()

3、String.fromCodePoint()

4、字符串的遍历器接口。

for (let codePoint of 'foo') {
    console.log(codePoint)
}

除了遍历字符串,这个遍历器最大的优点是可以识别大于0xFFFF的码点,传统的for循环无法识别这样的码点。

5、at()

'abc'.at(0) // "a"
'?'.at(0) // "?"

ES5 对字符串对象提供charAt方法,返回字符串给定位置的字符。该方法不能识别码点大于0xFFFF的字符。
目前,有一个提案,提出字符串实例的at方法,可以识别 Unicode 编号大于0xFFFF的字符,返回正确的字符。

6、normalize()

7、includes(), startsWith(), endsWith()

includes():返回布尔值,表示是否找到了参数字符串。
startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。

8、repeat()  返回一个新字符串,表示将原字符串重复n次。

'hello'.repeat(3) // "hellohellohello"

9、padStart(),padEnd()  字符串补全长度。

如果某个字符串不够指定长度,会在头部或尾部补全。padStart()用于头部补全,padEnd()用于尾部补全。

padStart和padEnd一共接受两个参数,第一个参数用来指定字符串的最小长度,第二个参数是用来补全的字符串。

'x'.padStart(10, 'abc') // 'abcabcabcx'
'x'.padStart(5, 'm') // 'mmmmx'
'x'.padEnd(10, 'abc') // 'xabcabcabc'
'x'.padEnd(5, 'm') // 'xmmmm'

10、模板字符串

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



如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。

模板字符串中嵌入变量,需要将变量名写在${}之中。

11、标签模板

12、String.raw() 


 

 

...

posted on 2017-09-15 00:37 bjhhh 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/qq21270/p/7524167.html

你可能感兴趣的:(javascript)