ES6新特性总结-julia

Posted julia-yuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6新特性总结-julia相关的知识,希望对你有一定的参考价值。

一: let、const 和 block 作用域   

1:let 和 const 都是块级作用域 (ES6 推荐在函数中使用 let 定义变量,而非 var:)

var a = 2;
{
  let a = 3;
  console.log(a); // 3
}
Xconsole.log(a); // 2

2:let 定义的变量不会被变量提升  

console.log(a);  // undefined
var a = ‘hello‘;

# 上面的代码相当于
var a;
console.log(a);
a = ‘hello‘;

# 而 let 就不会被变量提升
console.log(a); // a is not defined
let a = ‘hello‘;

3:const 定义的常量不能被修改    

//ES5中的常量,把常量绑定在全局对象window中
Object.defineProperty(window,"PI2",{
    value:3.1415926,
    writable:false,
})
console.log(window,PI2);

// ES6中实现常量
const PI  = 3.1415926;
console.log(PI);
PI = 4;

// 控台输出显示赋值无效并且报错时,用以下代码输出不影响下边的执行
try {
   PT=4
  } catch (e) {
    console.log(e); 
  } 

  

var name = "bai";
name = "ming";
console.log(name); // ming


const name = "bai";
name = "ming"; // Assignment to constant variable.
console.log(name);

  const 声明的常量类似于指针,它指向某个引用,也就是说这个「常量」并非一成不变的

{
  const ARR = [5,6];
  ARR.push(7);
  console.log(ARR); // [5,6,7]
  ARR = 10; // TypeError
}

4:作用域

用块 ( 花括号 ) 给代码做一个隔离:
//es5中写法比较复杂(用立即执行函数
(function(){
    var foo  = function(){
        return 1
    }
    console.log("foo()===1",foo()===1);
    (function(){
        var foo = function(){
            return 2
        }
        console.log("foo()===2",foo()===2);
    })();
})();

//es6中用一个花括号代表一个新的块级作用域保证不被干扰  
{
    function fou(){
        return 1;
    }
    console.log(‘fou()===1‘,fou()===1);
    {
        function fou(){
            return 2;
        }
        console.log(‘fou()===2‘,fou()===2);
    }
    console.log(‘fou()中fou()===1‘,fou()===1);

}

  

//ES5  6 6 6
const callbacks = [];
for(var i=0; i<=2;i++ ){
    callbacks[i] = function(){
        return i*2;
    }
}

console.table([
    callbacks[0](),
    callbacks[1](),
    callbacks[2](),
]);


//ES6  0 2 4
const callbacks2 = [];
for(let j = 0;j<=2;j++){
    callbacks2[j] = function(){
        return j*2;
    }
}

console.table([
    callbacks2[0](),
    callbacks2[1](),
    callbacks2[2](),
]);

显示结果:

所有value都是6,在for循环内使用的var声明变量,被变量提升到了for循环之外的前面了,callbacks[i]中的i=0,但是function函数中因为闭包,return中的i并没有取值为0,返回的是一个表达式。在console的时候去执行,那是i已经等于3,所以无论怎么执行,都是输出3*2。

let声明的变量,有一个块作用域,function函数中的闭包可以使用,for循环每次执行都可以生成这个作用域。

 

有几个点需要注意:

  • let 和 const 声明只在最靠近的一个块中(花括号内)有效
  • 当使用常量 const 声明时,请使用大写变量,如:CAPITAL_CASING
  • const 在声明时必须被赋值

二:箭头函数  

ES6 中,箭头函数就是函数的一种简写形式,使用括号包裹参数,跟随一个 =>,紧接着是函数体:例子

需要注意的是,上面例子中的 getPrice 箭头函数采用了简洁函数体,它不需要 return 语句,下面这个例子使用的是正常函数体:例子

 

1:写法比较简单:(//小括号是用来写参数的)
 
技术图片   
 
{
  // ES3,ES5
  var evens = [1, 2, 3, 4, 5];
  var odds = evens.map(function(v) {
    return v + 1
  });
  console.log(evens, odds);
}; 
{ // ES6 let evens = [1, 2, 3, 4, 5]; let odds = evens.map(v => v + 1); console.log(evens, odds);

 //  参数只有一个的时候,括号可以被省略,花括号中的表达式直接作为返回值时,也是可以被省略的 }
 
2:this指向有了新的意义
 
 {
  // ES3,ES5  this指向是该函数被调用的对象(哪个对象调用了这个function,this指向的时谁)
  var factory = function() {
    this.a = ‘a‘;
    this.b = ‘b‘;
    this.c = {
      a: ‘a+‘,
      b: function() {
        return this.a
      }
    }
  }

  console.log(new factory().c.b());   //a+
};

//ES6 箭头函数中this的指向是定义时this的指向

{
  var factory = function() {
    this.a = ‘a‘;
    this.b = ‘b‘;
    this.c = {
      a: ‘a+‘,
      b: () => {
        return this.a
      }
    }
  }
  console.log(new factory().c.b());   //a
}

 

es6中的箭头函数用来解决this指向不明确,避免this在运行的时候指向不确定(,即定义的时候指向的是哪个就是哪个)

 

三:默认参数、可变参数

// ES3、ES5中默认参数写法
{
    function f(x,y,z){
       if(y===undefined){
        y=7;
       }
       if(z===undefined){
        z=42;
       }
       return x+y+z;
    }
    console.log(f(1,3));
}
//ES6默认参数
{
    function f(x,y=7,z=42){
        return x+y+z;
    }
    console.log(f(1,3));
}
 

参数默认必选性检查:(声明一个函数,检查参数是否为空,空的话抛出异常即可)

{
    function checkParameter(){
        throw new Error(‘can‘t be empty‘);
    }
    function f(x=checkParameter(),y=7,z=42){
        return x+y+z;
    }
    console.log(f(1));
    try{
        f();
    }catch(e){
        console.log(e);
    }finally{

    }
// 检查x是否已经赋值 即对函数的必选参数进行校验
}

可变参数求和

//ES3,ES5可变参数求和
{
    function f(){
        var a =Array.prototype.slice.call(arguments);
        var sum = 0;
        a.forEach(function(item){
            sum+=item*1;
        })
        return sum;
    }
    console.log(f(1,2,3,4,6));
}
// ES6可变参数
{
    function f(...a){
        var sum=0;
        a.forEach(item=>{
            sum+=item*1;
        });
        return sum;
    }
    console.log(f(1,2,3,4,6));
} 

四:展开运算符  

第一个用途:合并数组

let color = [‘red‘, ‘yellow‘];
let colorful = [...color, ‘green‘, ‘blue‘];
console.log(colorful); // ["red", "yellow", "green", "blue"]
{
    var params=[hello,7,true];
    var other=[1,2,...params];
    console.log(other);
}

 

第二个用途:获取数组除了某几项的其他项

let num = [1, 3, 5, 7, 9];
let [first, second, ...rest] = num;
console.log(rest); // [5, 7, 9]

五:模板字符串  

解决了 ES5 在字符串功能上的痛点。

第一个用途:字符串拼接。将表达式嵌入字符串中进行拼接,用 `` 和 ${}来界定。

// es5
var name1 = "bai";
console.log(‘hello‘ + name1);

// es6
const name2 = "ming";
console.log(`hello${name2}`);

第二个用途:在ES5时我们通过反斜杠来做多行字符串拼接。ES6反引号 `` 直接搞定。

// es5
var msg = "Hi man!";

// es6
const template = `<div>
    <span>hello world</span>
</div>`;

六:import、export  

import导入模块、export导出模块

// 全部导入
import people from ‘./example‘

// 将整个模块当作单一对象进行导入,该模块的所有导出都会作为对象的属性存在
import * as example from "./example.js"
console.log(example.name)
console.log(example.getName())

// 导入部分,引入非 default 时,使用花括号
import {name, age} from ‘./example‘


// 导出默认, 有且只有一个默认
export default App

// 部分导出
export class App extend Component {};

  

七:进阶指导

技术图片

以上是关于ES6新特性总结-julia的主要内容,如果未能解决你的问题,请参考以下文章

总结常见的ES6新语法特性。

es6/es7/es8常用新特性总结(实用)文末有彩蛋

前端知识总结--ES6新特性

Atitit js es5 es6新特性 attilax总结

ES6 7 8 9 10新特性总结

ES6新特性总结let及const