这篇文章过一下剩下的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";
}