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

  • this关键字
this可以用在构造函数之中,表示实例对象。除此之外,this还可以用在别的场合。但不管是什么场合,this都有一个共同点:它总是返回一个对象
简单说,this就是属性或方法“当前”所在的对象。
 
var person = {
  name: '张三',
  describe: function () {
    return '姓名:'+ this.name;
  }};
 
person.describe()// "姓名:张三"
上面代码中,this.name表示name属性所在的那个对象。由于this.name是在describe方法中调用,而describe方法所在的当前对象是person,因此this指向personthis.name就是person.name
 
     this主要有以下几个使用场合
(1)全局环境
全局环境使用this,它指的就是顶层对象window。
 
this === window // true
 
function f() {
  console.log(this === window);
}
f() // true
//注:严格模式下 普通函数内部 this 等于 undefined
 
 
(2)构造函数
构造函数中的this,指的是实例对象
 
function Person(p) {
  this.p = p;
};
var obj = new Person()
 
(3)对象的方法
如果对象的方法里面包含thisthis的指向就是方法运行时所在的对象。
 
var obj ={
  foo: function () {
    console.log(this);
  }};
 
obj.foo() // obj 
 
 

 
  • bind方法
bind方法用于将函数体内的this绑定到某个对象,然后返回一个新函数。
              var dog ={
                   name:'wangcai',
                   age:18,
                   wang:function(){
                        console.log(this)
                   }
              }
              var person = {name:'小明'}
              var func = dog.wang.bind(person)
              func();
//上面代码将person绑定到了func函数内部
 
 
 

 
  • let/const
ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
{
  let a = 10;
  var b = 1;}

a // ReferenceError: a is not defined.
b // 1

上面代码在代码块之中,分别用letvar声明了两个变量。然后在代码块之外调用这两个变量,结果let声明的变量报错,var声明的变量返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。
 
for循环的计数器,就很合适使用let命令。
 
var oLis = document.getElementsByTagName('li')
for (let i = 0; i < oLis.length; i++) {
// ...
     oLis[i].onclick = function(){
          console.log(i)// 0 1 2 3 4
     }
}

console.log(i);

// ReferenceError: i is not defined
//上面代码相当与产生了几个块级作用域
{
     var i=0;
     oLis[i].onclick = function(){
          console.log(i)
     }
}
 
{
     var i=1;
     oLis[i].onclick = function(){
          console.log(i)
     }
}
 
 
上面代码中,计数器i只在for循环体内有效,在循环体外引用就会报错。
 
 
ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景,let实际上为 JavaScript 新增了块级作用域
 

var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined。这种现象多多少少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用。

 
为了纠正这种现象,let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。
 
  • const命令
 
const声明一个只读的常量。一旦声明,常量的值就不能改变。
const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值
 
const PI = 3.1415;
PI // 3.1415

PI = 3;
// TypeError: Assignment to constant variable.

上面代码表明改变常量的值会报错。
 

 
  • 变量解构
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
 
以前,为变量赋值,只能直接指定值。
 
let a = 1;
let b = 2;
let c = 3;
ES6 允许写成下面这样。
 
let [a, b, c] = [1, 2, 3];
本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值
 
解构不仅可以用于数组,还可以用于对象
 
let { foo, bar } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值
 
let { bar, foo } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"
 
let { foo} = { foo: "aaa", bar: "bbb" };
foo // "aaa"
 

 
  • 字符串扩展
模板字符串(template string)是增强版的字符串
 
传统的 JavaScript 语言,输出模板通常是这样写的。
 
var a = 1
var b = 2;
var sum = a + b;
var res = a + '+' + b + '的和是<b>' + c+'</b>';
console.log(res)
 
box.innerHTML = res;
 
var obj=  {name:'zhangsan',age:18};
 
var str = '<b>姓名</b>:'+obj.name+'<b>年龄</b>:'+obj.age;
 
div.innerHTML = str;
 
上面这种写法(拼字符串)相当繁琐不方便,ES6 引入了模板字符串解决这个问题。
模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,可以在字符串中嵌入变量, 模板字符串中嵌入变量,需要将变量名写在${}之中。
 
var a = 1
var b = 2;
var sum = a + b;
var res = `a+b的和是<b>${c}</b>`;
console.log(res)
 
box.innerHTML = res;
 
var obj=  {name:'zhangsan',age:18};
 
var str =`<b>姓名</b>:${obj.name}<b>年龄</b>:${obj.age}`
 
div.innerHTML = str;
上面代码中的模板字符串,都是用反引号表示。如果在模板字符串中需要使用反引号,则前面要用反斜杠转义
 
let greeting = `\`Yo\` World!`;
如果使用模板字符串表示多行字符串,所有的空格和缩进都会被保留在输出之中
 
oDiv.innerHTML = `
<ul>
  <li>first</li>
  <li>second</li>
</ul>
`
 
大括号内部可以放入任意的 JavaScript 表达式,可以进行运算,以及引用对象属性。
 
et x = 1;let y = 2;

`${x} + ${y} = ${x + y}`
// "1 + 2 = 3"

`${x} + ${y * 2} = ${x + y * 2}`
// "1 + 4 = 5"
let obj = {x: 1, y: 2};
`${obj.x + obj.y}`

模板字符串之中还能调用函数
 
function fn() {
  return "Hello World";}

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

 
 
传统上,JavaScript 只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中。ES6 又提供了三种新方法。
 
  • includes():返回布尔值,表示是否找到了参数字符串。
  • startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
  • endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。
 
let s = 'Hello world!';

s.startsWith('Hello') // true
s.endsWith('!') // true
s.includes('o') // true

repeat方法返回一个新字符串,表示将原字符串重复n
 
'x'.repeat(3) // "xxx"
'hello'.repeat(2) // "hellohello"
'na'.repeat(0) // ""
  • 数组新增方法
Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(ES6 新增的数据结构 Set 和 Map)
下面是一个类似数组的对象,Array.from将它转为真正的数组
 
let arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3};
 
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']
实际应用中,常见的类似数组的对象是 DOM 操作返回的 NodeList 集合,以及函数内部的arguments对象。Array.from都可以将它们转为真正的数组
 

 
  • 扩展运算符三个点(...)
 
扩展运算符( spread )是三个点(...)。将一个数组转为用逗号分隔的参数序列。
 
console.log(...[1, 2, 3]) 
// 1 2 3 
console.log(1, ...[2, 3, 4], 5) 
// 1 2 3 4 5 
[...document.querySelectorAll('div')] 
// [<div>, <div>, <div>]
//该运算符将一个数组,变为参数序列
 
 
function add(x, y) { 
return x + y; 
var numbers = [4, 38]; 
add(...numbers) //
 
//该运算符将一个数组,变为参数序列
 
 var arr1 = ['a', 'b'];
 
 var arr2 = ['c'];
 
 var arr3 = ['d', 'e'];
// 合并数组
 
 [...arr1, ...arr2, ...arr3]
  • 箭头函数 =>
 
 
ES6 允许使用“箭头”(=>)定义函数。
 
var f = v => v;
// 等同于
var f = function (v) {
  return v;};
 
如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分。
 
var f = () => 5;
// 等同于
var f = function () { return 5 };

var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2) {
  return num1 + num2;};

 
如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。
 
var sum = (num1, num2) => { return num1 + num2; }
箭头函数使得表达更加简洁。
const isEven = n => n % 2 == 0;
const square = n => n * n;
 
上面代码只用了两行,就定义了两个简单的工具函数。如果不用箭头函数,可能就要占用多行,而且还不如现在这样写醒目。
 
箭头函数的一个用处是简化回调函数。
 
// 正常函数写法
[1,2,3].map(function (x) {
  return x * x;});
// 箭头函数写法
[1,2,3].map(x => x * x);
 
// 正常函数写法
var result = values.sort(function (a, b) {
  return a - b;});
// 箭头函数写法
var result = values.sort((a, b) => a - b);
 
箭头函数有几个使用注意点。
(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
(3)不可以使用arguments对象,该对象在函数体内不存在。
 
 
var handler = {
  id: '123456',

  init: function() {
     //在事件执行函数内部,this本该是document本身,现在变成了 handler对象
    document.addEventListener('click',
      event => this.doSomething(event.type), false);
  },

doSomething: function(type) {
    console.log('Handling ' + type  + ' for ' + this.id);
  }};

上面代码的init方法中,使用了箭头函数,这导致这个箭头函数里面的this,总是指向handler对象
 

 
 
  • 函数参数默认值
 
ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法。
 
function log(x, y) {
  y = y || 'World';
  console.log(x, y);}

log('Hello') // Hello World

log('Hello', 'China') // Hello China
 
 //这种写法的缺点在于,如果参数y赋值了,但是对应的布尔值为false,则该赋值不起作用。
ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面。
 
 
function log(x, y = 'World') {
  console.log(x, y);}

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

可以看到,ES6 的写法比 ES5 简洁许多,而且非常自然。

ES6常用语法(上)的更多相关文章

  1. ES6常用语法

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. ...

  2. ES6常用语法简介import export

    ES6常用语法简介import export let与var用法区别 //var var a = []; for (var i = 0; i < 10; i++) { a[i] = functi ...

  3. ES5与ES6常用语法教程之 ②解构语法糖、声明变量异同

    js常用语法系列教程如下 es5与es6常用语法教程(1) es5与es6常用语法教程(2) es5与es6常用语法教程(3) es5与es6常用语法教程(4) es5与es6常用语法教程(5) es ...

  4. vue学习(一)ES6常用语法

    1 ES6常用语法 1.1 变量提升 例① # 变量提升 <div id="app"> </div> <script> console.log( ...

  5. ES6 常用语法知识汇总

    ES6模块化如何使用,开发环境如何打包? 1.模块化的基本语法 /* export 语法 */ // 默认导出 export default { a: '我是默认导出的', } // 单独导出 exp ...

  6. ES6常用语法总结

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015.也就是说,ES6就是ES2015.虽 ...

  7. ES5与ES6常用语法教程之 ③模板字符串、判断字符串是否包含其它字符串

    这部分教程我们主要讲解以下几个常用语法 模板字符串 带标签的模板字符串 判断字符串中是否包含其他字符串 给函数设置默认值 模板字符串 老式的拼接字符串方法 let dessert = '

  8. ES6常用语法,面试应急专用!

    常用的ES6语法 注:该文章为转载,原地址为https://www.jianshu.com/p/fb019d7e8b15   什么是ES6? ECMAScript 6(以下简称ES6)是JavaScr ...

  9. ES6常用语法(下)

    Symbol类型      ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法,新方法的名字就有可能与现有方法产生冲突.如果有一种机 ...

随机推荐

  1. [daily] emacs显示file name buffer的全路径

    在用emacs看代码的时候,在文件间跳来跳去,如果工程太大的话,很可能会有重名文件,这个时候, 你就不知道自己在什么的地方了.需要一个查看当前正在编辑区的文件的名字的方法. emacs在这个地方,存储 ...

  2. Express全系列教程之(九):将session上传至mysql数据库

    一.简介 实际引用中,有些公司在不同地区会设置不同服务器,因此就需要用到nginx以实现负载均衡,这时,将session数据保存至数据库就成为了需要面对的问题,我们以MySQL数据库为例,看看他是如何 ...

  3. 多线程之Lock的基本介绍

    基本介绍 java.util.concurrent.locks是java1.5之后出现的一种锁实现方式,是一个接口.但是在这之前已经有一个同步机制的实现就是synchronized关键字,那为什么还要 ...

  4. CF653F Paper task

    题目链接:洛谷 首先我们不考虑本质不同这个限制. 既然不能直接用栈乱搞,我们就可以用一个前缀和的套路了. 我们将(设为1,将)设为-1,记前缀和为$s_i$,则$[i,j]$这一段是回文子串当且仅当 ...

  5. pkg-config 详解

    转载自:https://blog.csdn.net/newchenxf/article/details/51750239 1 什么是pkg-config pkg-config是一个linux下的命令, ...

  6. Hadoop集群测试wordcount程序

    一.集群环境搭好了,我们来测试一下吧 1.在java下创建一个wordcount文件夹:mkdir wordcount 2.在此文件夹下创建两个文件,比如file1.txt和file2.txt 在fi ...

  7. mysql distinct()用法

    在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所 ...

  8. 白话skynet第一篇

    当你走过一个坐在自己店门前的杂货商面前.走过一个吸着烟斗的守门人面前,走过一个马车夫面前时,请你给我描绘一下这个杂货商.守门人和马车夫,他们的姿态,他们的外貌,要用画家那样的细节描绘出他们的精神本质, ...

  9. JavaScript 当前URL取参返回字典

    getParam : function(){ return (key, strURL = window.location.search) => new RegExp("(^|\\?|& ...

  10. Spring增强代理模式

    1. 依赖注入;(掌握) 2. XML自动注入;(掌握) 3. 全注解配置;(掌握) 4. 代理模式;(掌握,难点) 依赖注入 构造参数注入 constructor-arg:构造器注入: index: ...