ES6学习——新的语法:其它Well-Known Symbols

这篇文章过一下剩下的well-known symbols,就不在详细写例子了。


Symbol.isConcatSpreadable:

数组的concat方法会把参数中的数组给扁平化,这个symbol就是控制是否允许这样做。

let arr1 = ['c', 'd'];
['a', 'b'].concat(arr1, 'e');// ['a', 'b', 'c', 'd', 'e']

let arr2 = ['c', 'd'];
arr2[Symbol.isConcatSpreadable] = false;
['a', 'b'].concat(arr2, 'e');// ['a', 'b', ['c','d'], 'e']


Symbol.match:

和String.prototype.match方法相关

var O = {};
O[Symbol.match] = function(){
    return 42;
};
return ''.match(O) === 42;
看规范中match方法是如何定义的:

1. Let O be RequireObjectCoercible(this value).
2. ReturnIfAbrupt(O).
3. If regexp is neither undefined nor null, then
    a. Let matcher be GetMethod(regexp, @@match).
    b. ReturnIfAbrupt(matcher).
    c. If matcher is not undefined, then
       
i. Return Call(matcher, regexp, «O»).
4. Let S be ToString(O).
5. ReturnIfAbrupt(S).
6. Let rx be RegExpCreate(regexp, undefined) (see 21.2.3.2.3).
7. ReturnIfAbrupt(rx).
8. Return Invoke(rx, @@match, «S»).

这个symbol还可以控制String.prototype.startsWith,String.prototype.endsWith,String.prototype.includes方法的一些逻辑,不介绍了



Symbol.replace:

和String.prototype.replace方法相关

var O = {};
O[Symbol.replace] = function(){
    return 42;
};
return ''.replace(O) === 42;


Symbol.split:

和String.prototype.split方法相关

var O = {};
O[Symbol.split] = function(){
  return 42;
};
return ''.split(O) === 42;


Symbol.search:

和String.prototype.search方法相关

var O = {};
O[Symbol.search] = function(){
    return 42;
};
return ''.search(O) === 42;



Symbol.unscopables:

和with的用法相关,在strict模式下,with已经被禁用了,所以这个symbol用处很小

var a = { foo: 1, bar: 2 };
a[Symbol.unscopables] = { bar: true };
with (a) {
  return foo === 1 && typeof bar === "undefined";
}


*以上代码没有在任何环境下测试过

你可能感兴趣的:(ES6,ES6)