ECMAScript 2016(ES7)新特性

ECMAScript 2016(ES7)新特性:

  • 指数运算符: **
  • Array.prototype.includes()
  • 函数作用域中严格模式的变更。


指数(求幂)操作符

在之前的时候,可以通过 Math.pow() 方法来执行求幂运算,但这毕竟是一个方法,一些开发者更希望通过操作符就可以实现这个功能。所以在ES6中,使用了两个星号 ** ,来作为求幂运算符。其中:左操作数是基数,右操作数是指数。

3 ** 2 //9

效果同
Math.pow(3, 2) //9

由于是运算符,也可以 **=

var b = 3;
b **= 2;
console.log(b); //9

求幂运算符在 JavaScript 所有二进制运算符中具有最高的优先级(一元运算符的优先级高于 ** )。

let result = 2 * 5 ** 2;
console.log(result); // 50
 


Array.prototype.includes()

ES7 为 Array 添加了新的方法 includes() ,查找一个值在不在数组里,若是存在则返回 true ,不存在返回 false

Array.prototype.includes(element, start = 0)
  • element :要查找的元素。
  • start :开始查找的位置。如果 start 参数小于 0,则重置为 0,如果 start 参数大于等于数组长度,则返回 false。
const arr=['a', 'b', 'c'];
arr.includes('a') // true
arr.includes('d') // false

arr.includes('b') // true
arr.includes('b',1) // true
arr.includes('b',2) // false

该方法与 indexOf() 的区别在于, indexOf() 不会识别 NaN 和稀疏数组中的缺失元素。而 includes() 方法可以。

var array = [1,2,3];
array.length = 5;
array.push(NaN);
array; // [1, 2, 3, empty × 2, NaN]

array.includes(undefined);  // true
array.includes(NaN);        // true

array.indexOf(undefined);   // -1
array.indexOf(NaN);         // -1


函数作用域严格模式的一处改动

函数中存在 use strict 时,实现运行在严格模式下的参数非常困难,因为参数默认值也可以是函数。这个难点导致大多数 JavaScript 引擎均不实现此功能,而是将其等同于全局对象。

由于实现困难,ES2016规定在参数被解构或有默认参数的函数中,禁止使用 use strict 指令。只有参数为不包含解构或默认值的简单参数列表时,才可以在函数体中使用 use strict

//此处使用简单参数列表,可以运行
 function okay(first, second)
 {
     "use strict";
     return first;
 }
 
//抛出语法错误
 function notOkay1(first, second=first)
 {
     "use strict";
     return first;
 }
 
//抛出语法错误
 function notOkay2({ first, second })
 {
     "use strict";
     return first;
 }

 
//函数执行,先执行函数参数,再函数体
//在函数体中定义 "use strict",只有在函数体中才能知道参数是否应该严格模式。但是参数却应该先于函数体的执行

//解决方案一 设定全局严格模式
//解决方案二,将函数包在一个无参数的立即执行函数内
const fun = (
    function () {
        "use strict"
        return function (value = 100) {
            return value;
        }
    }()
)

console.log(fun(50))
<script>
'use strict';

// 1. 变量名必须先声明再使用
// num = 10;
// console.log(num);  //严格模式下报错
var num = 10;
console.log(num);
 
 
// 2.不能随意删除已经声明好的变量,会报错
// delete num;
 
 
// 3. 严格模式下全局作用域中函数中的 this 指向 undefined,不再是window
function fn() {
    console.log(this); // undefined。
 
}
fn();
 
 
// 4. 严格模式下,如果 构造函数不加 new 调用, this 指向的是 undefined 如果给他赋值则 会报错.
function Star() {
    this.sex = '男';
}
Star();
var ldh = new Star();
console.log(ldh.sex);
 
 
// 5. 定时器 this 还是指向 window 
setTimeout(function() {
    console.log(this); 
}, 2000);
a = 1;
a = 2;
 
 
6. 严格模式下函数里面的参数不允许有重名
function fn(a, a) {
    console.log(a + a);
};
fn(1, 2);
function fn() {}
</script>