Symbol概述:
ES6引入了一种新的原始数据类型Symbol,表示独一无二的值,它是javaScript的第七种数据类型,是一种类似于字符串的数据类型
Symbol的特点:
- Symbol的值是唯一的,用来解决命名冲突的问题;
- Symbol值不能与其他的数据进行运算;
- Symbol定义的对象属性不能使用for...in遍历,但是可以使用Reflect.ownKeys来获取所有对象的健名;
基本使用:
创建Symbol
//创建Symbol
let s = Symbol();
console.log(s)
console.log(typeof s)
运行结果:
创建Symbol赋值:
//创建Symbol并且赋值
let s2 = Symbol("张三");
console.log(s2)
console.log(typeof s2)
运行结果:
Symbol值唯一:
//创建Symbol判断证明值唯一
let s2 = Symbol("张三");
let s3 = Symbol("张三");
console.log(s2 === s3)//false
运行结果:
Symbol.for创建:
//Symbol.for创建
let s4 = Symbol.for("张三");
let s5 = Symbol.for("张三");
console.log(s4 === s5)//true
运行结果:
不能与其他数据进行运算:
//创建Symbol
let s = Symbol();
//数据进行运算
let result1 = s + 100;
let result2 = s > 100;
let result3 = s + s;
console.log(result1);//报错
console.log(result2);//报错
// USONB you are so niubility
// u undefined
// s string symbol
// o object
// n null number
// b boolean
运行结果:
Sysbol创建对象属性:
方式一:
//向对象中添加方法
let game = {
pname: '俄罗斯方块',
up: function () { },
down: function () { }
};
//我们要往game对象里面添加方法,但是怕game已经存在
//同名方法,使用我们这使用到了Symbol
//方式一:
//声明一个对象
let methods = {
up: function () { },
down: Symbol()
}
//调用
game[methods.up] = function () {
console.log("我可以改变形状!");
}
game[methods.down] = function () {
console.log("我可以快速下降!");
}
console.log(game);
方式二:
//方式二:
let game2 = {
pname: '狼人杀',
[Symbol('say')]: function () {
console.log('我可以发言!');
},
[Symbol('commit')]: function () {
console.log('我可以自杀!');
}
}
console.log(game2);
Symbol内置值:
概述:
除了自己使用的Symbol值以外,ES6还提供了11个内置的Symbol值,指向语言内部使用的方法。
可以称这些方法为魔术方法,因为它们会在特定的场景下自动执行;
方法:
内置Symbol的值 | 调用时机 |
Symbol.hasInstance | 当其他对象使用 instanceof 运算符,判断是否为该对象的实例时,会调用这个方法 |
Symbol.isConcatSpreadable | 对象的 Symbol.isConcatSpreadable 属性等于的是一个布尔值,表示该对象用于 Array.prototype.concat()时,是否可以展开。 |
Symbol.species | 创建衍生对象时,会使用该属性 |
Symbol.match | 当该对象被 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环境排除。 |
特别的:
Symbol内置值的使用,都是作为某个对象类型的属性去使用;
代码示例:
class person {
static [Symbol.hasInstance](param) {
console.log(param);
console.log("我被用来类型检测了!");
return false;
}
}
let o = {};
console.log(o instanceof person);
console.log("-----------------------------");
const arr = [1, 2, 3];
const arr2 = [4, 5, 6];
//合并数组:false数组不可以展开,true可以展示
arr2[Symbol.isConcatSpreadable] = false;
//合并数组
console.log(arr.concat(arr2));
运行结果:
参考文章:https://blog.csdn.net/fesfsefgs/article/details/108354248