Symbol.hasInstance
obj instanceof A
等效於 A[Symbol.hasInstance](obj)
可以改變 obj instanceof A 的輸出結果
function A () {
}
const obj = new A();
conole.log(obj instanceof A); // true
console.log(A[Symbol.hasInstance](obj); // true
Object.defineProperty(A, Symbol.hasIntance,{
value: function(obj) {
return false;
}
});
conole.log(obj instanceof A); // false
console.log(A[Symbol.hasInstance](obj); // false
Symbol.isConcatSpreadable
用於改變數組的concat的結果。
const arr = [12, 465];
const obj = { 0: 4, 1: 45, length: 2}
console.log(arr.concat(obj) //[12,456,obj]
obj[Symbol.isConcatSpreadable] = true;
console.log(arr.concat(obj) //[12,456,4,45];
當Symbol.isConcatSpreadable 爲 false 時,concat不會展開傳入得參數。
Symbol.toPrimitive
用於改變類型轉換的結果。
const obj = {};
console.log(obj.valueOf());
console.log(obj.toString());
console.log(obj * 123); //NaN
Symbol.toStringTag
class Person {
}
const p = new Peron();
const arr = [1,2];
console.log(Object.prototype.toString.apply(arr)); // [Object Array]
console.log(Object.prototype.toString.apply(p));//[Object Object]
若是想讓Object.prototype.toString.apply(p)的結果爲[Object Person],則需要用到Symbol.toStringTag.
class Person{
[Symbo.toStringTag] = 'Person'
}
console.log(Object.prototype.toString.apply(p)); [Objrct Person]