ES6-Symbol的介绍与创建
ES6引入一种新的原始数据类型Symbol,表示独一无二的值。是JS语言的第七种数据类型,类似于字符串
Symbol特点
1、Symbol值是唯一的,用来解决命名冲突的问题
2、Symbol值不能与其他数据进行运算
let r1 = s + 100;
let r2 = s > 100;
let r3 = s + "100";
let r4 = s + s;
// 结果:均报错
3、Symbol定义的对象属性不能使用for…in循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名
JS的数据类型
1、undefined
2、String
3、Symbol
4、Object
5、null
6、Number
7、Boolean
ES6-对象添加Symbol类型的属性的两种方式
方法一
let game = {};
// 声明一个对象
let methods = {
up: Symbol(),
down: Symbol(),
};
// 给game对象扩展方法
game[methods.up] = function () {
console.log("改变形状");
};
game[methods.down] = function () {
console.log("快速下降");
};
console.log(game);
//结果:{Symbol(): ƒ, Symbol(): ƒ}
方式二
注: 不能直接在对象内将symbol作为关键字
let games = {
name: "狼人杀",
[Symbol("say")]: function () {
console.log("我可以发言");
},
[Symbol("boom")]: function () {
console.log("我可以自爆");
},
};
console.log(games);
//结果:{name: '狼人杀', Symbol(say): ƒ, Symbol(boom): ƒ}
ES6-Symbol的内置属性
除了定义自己使用的Symbol值以外。ES6还提供了11个内置的Symbol值(Symbol的内置属性),指向语言内部使用的方法,用于扩展对象功能
**Symbol.hasInstance: **当其他对象使用instance运算符判断是否为该对象的实例时,调用该方法
class Person {
static Symbol.hasInstance {
console.log("Person params", param);
console.log("我被用来检测类型了");
}
}
let o = {};
console.log(o instanceof Person);
// 结果:Person params {}
// 我被用来检测类型了
// false
**Symbol.isConcatSpreadable: **对象的Symbol.isConcatSpreadable属性结果为一个布尔值,表示该对象用于Array.prototype.concat()进行数组合并时,结果是否可以展开
const arr = [1, 2, 3, 4];
const arr1 = [5, 6, 7, 8];
arr1[Symbol.isConcatSpreadable] = false;
console.log(arr.concat(arr1));
// 结果:(5) [1, 2, 3, 4, Array(4)]
Symbol.unscopables: 该对象指定了使用with关键字时,哪些属性会被with环境排除
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.toPrimitive: 该对象被转换为原始数据类型时会调用该方法,返回该对象对应的原始数据类型
Symbol.toStringTag: 在该对象上调用toString方法时,返回该方法的返回值
Symbol.species: 创建衍生对象时,会调用该方法