Symbol数据类型 
作用 
- ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 Javascript 的第七种数据类型,是一种类似于字符串的数据类型。
 
特点 
- 1、Symbol的值是唯一的,用来解决命名冲突的问题
 
js
// 创建 Symbol 
let s = Symbol();
console.log(s); //Symbol()
console.log(typeof s); //symbol
let s1 = Symbol('squid-Xu');
let s2 = Symbol('squid-Xu');
console.log(s1); //Symbol(squid-Xu)
console.log(typeof s1); //symbol
console.log(s2); //SSymbol(squid-Xu)
console.log(typeof s2); //symbol
console.log(s1 === s2); // falsejs
// Symbol.for 创建 
let s4 = Symbol.for('squid-Xu');
let s5 = Symbol.for('squid-Xu');
console.log(s4 === s5); //true- 2、Symbol值不能与其他数据进行运算
 
js
let s = Symbol();
let result = s + 100; // error; Cannot convert a Symbol value to a number
let result = s > 100; // error; Cannot convert a Symbol value to a number
let result = s + s; // error; Cannot convert a Symbol value to a number- 3、Symbol定义的对象属性不能使用for…in循环遍历,但是可以使用Reflect.ownkeys来获取对象的所有键名
 
给对象添加 Symbol 类型的属性 
js
// 向对象中添加方法 up、down
let game = {
    name: '1',
    up: function () {
        console.log('up');
    },
    down: function () {
        console.log('down');
    },
};
// 声明一个对象
let methods = {
    up: Symbol(),
    down: Symbol(),
};
game[methods.up] = function () {
    console.log('up');
};
game[methods.down] = function () {
    console.log('down');
};
console.log(game); //{name: '1', up: ƒ, down: ƒ, Symbol(): ƒ, Symbol(): ƒ}
let youxi = {
    name: '狼人杀',
    [Symbol('say')]: function () {
        console.log('say');
    },
    [Symbol('zibao')]: function () {
        console.log('zibao');
    },
};
console.log(youxi); //{name: '狼人杀', Symbol(say): ƒ, Symbol(zibao): ƒ}Symbol内置值 
- 除了定义自己使用的Symbol值以外,ES6还提供了11个内置的symbol值, 指向语言内部使用的方法。可以称这些方法为魔术方法,因为它们会在特定的场景下自动执行。
 
| 方法 | 作用 | 
|---|---|
| Symbol.hasInstance | 当其他对象使用 instanceof 运算符,判断是否为该对象的实例时,会调用这个方法 | 
| Symbol.isConcatSpreadable | 对象的 Symbol.isConcatSpreadable 属性等于的是一个布尔值,表示该对象用于 Array.prototype.concat()时,是否可以展开。 | 
| Symbol.species | 创建衍生对象时,会使用该属性 | 
| Symbol.match | 当执行 str.match(myObject) 时,如果该属性存在,会调用它,返回该方法的返回值。 | 
| Symbol.replace | 当该对象被 str.replace(myObject)方法调用时,会返回该方法的返回值。 | 
| Symbol.search | 当该对象被 str. search (myObject)方法调用时,会返回该方法的返回值。 | 
| Symbol.split | 当该对象被 str. split (myObject)方法调用时,会返回该方法的返回值。 | 
| Symbol.iterator | 对象进行 for…of 循环时,会调用 Symbol.iterator 方法,返回该对象的默认遍历器 | 
| Symbol.toPrimitive | 该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。 | 
| Symbol.toStringTag | 在该对象上面调用 toString 方法时,返回该方法的返回值 | 
| Symbol.unscopables | 该对象指定了使用 with 关键字时,哪些属性会被 with环境排除。 | 
1、Symbol.hasInstance 
js
class Person {
    static [Symbol.hasInstance](param) {
        console.log(param); //{a: 1}
        console.log('我用来检测类型了'); //我用来检测类型了
        return false;
    }
}
let obj = { a: 1 };
console.log(obj instanceof Person); //false2、Symbol.isConcatSpreadable 
js
const arr = [1, 2, 3];
const arr2 = [4, 5, 6];
console.log(arr.concat(arr2)); //[1, 2, 3, 4, 5, 6]
arr2[Symbol.isConcatSpreadable] = false;
console.log(arr.concat(arr2)); //[1, 2, 3, Array(3)]