一、双冒号运算符
箭头函数可以可以绑定this对象,大大减少了显式绑定this对象的写法(call、apply、bind)。但是,箭头函数并不适用于所有场合,所以现在有一个提案,提出了“函数绑定”(function bind)运算符,用来取代call、apply、bind调用。函数绑定运算符是并排的两个冒号(::),双冒号左边是一个对象,右边是一个函数。该运算符会自动将左边的对象,作为上下文环境(即this对象),绑定到右边的函数上面。
foo::bar;
// 等同于
bar.bind(foo);
foo::bar(...arguments);
// 等同于
bar.apply(foo, arguments);
const hasOwnProperty = Object.prototype.hasOwnProperty;
function hasOwn(obj, key) {
return obj::hasOwnProperty(key);
}
如果双冒号左边为空,则等于将该方法绑定在该对象上。
var method = obj::obj.foo;
//==
var method = ::obj.foo;
let log = ::console.log;
//==
let log =console.log.bind(console)
如果扩展运算符后面是一个空数组,则不产生任何效果。
[...[], 1]
// [1]
注意,扩展运算符如果放在括号中,JavaScript 引擎就会认为这是函数调用。如果这时不是函数调用,就会报错。
(...[1, 2])
// Uncaught SyntaxError: Unexpected number)
console.log(...[1, 2])
// 1 2
二、替代函数的apply方法
由于扩展运算符可以展开数组,所以不再需要apply方法,将数组转为函数的参数了。
//es5
function f(x,y,z){
//...
}
var arr = [0,1,2];
f.apply(null,arr);
//es6
function f(x,y,z){
//.
}
let arr = [0,1,2];
f(...arr);