CSDN话题挑战赛第2期
参赛话题:学习笔记
目录
Symbol 基本使用 ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。
它是 JavaScript 语言的第七种数据类型,是一种类似于字符串的数据类型。
(ES6 数据类型除了 Number 、 String 、 Boolean 、 Object、 null 和 undefined ,还新增了 Symbol 。——USONB)
Symbol 特点
Symbol 函数栈不能用 new 命令,因为 Symbol 是原始数据类型,不是对象。可以接受一个字符串作为参数,为新创建的 Symbol 提供描述,用来显示在控制台或者作为字符串的时候使用,便于区分。
- let s = Symbol();
- let s1 = Symbol();
- console.log(s === s1); //false
- console.log(s, typeof s); //Symbol() 'symbol'
-
- let s2 = Symbol('尚硅谷');
- let s3 = Symbol('尚硅谷');
- console.log(s2, typeof s2); //Symbol(尚硅谷) 'symbol'
- console.log(s2 === s3); //false
每一个symbol的值都不一样,在后续的使用中这一点极大的便利了我们。
Symbol.for() 类似单例模式,首先会在全局搜索被登记的 Symbol 中是否有该字符串参数作为名称的 Symbol 值,如果有即返回该 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。
- let s2 = Symbol('尚硅谷');
- let s4 = Symbol.for('尚硅谷');
- let s5 = Symbol.for('尚硅谷');
- console.log(s4 === s2); //false
- console.log(s4 === s5); //true
Symbol.keyFor() 返回一个 已登记 的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。
- let s6 = Symbol.for('尚硅谷');
- let key = Symbol.keyFor(s6);
- console.log(key);// 尚硅谷
方法一:
创建一个对象,里面包含 up、down方法
- //向对象中添加方法 up down
- let game = {
- name: '俄罗斯方块',
- up: function () {},
- down: function () {},
- };
如果我们此时想给game这个对象再添加方法的话,就必须考虑要设置新的方法名来保证代码的正确性。但其实还有一个方法可以使用,那就是使用symbol类型的方法:
-
- // 声明一个对象;
- let methods = {
- // 对象里面有两个属性,对应的都是symbol类型的值
- up: Symbol('shape'),
- down: Symbol('downn'),
- };
-
- // 给game扩展方法:
- game[methods.up] = function () {
- console.log('我可以改变形状');
- };
-
- game[methods.down] = function () {
- console.log('我可以快速下降!!');
- };
- // symbol:快速安全的把 up 和 down 方法加入到game中,也不会破坏其原有的一些属性
- // 原有的up与down不受影响
-
-
- console.log(game);
安全的给game对象新增了方法,不用进入game去考虑方法名重复的问题。
方法二:
- let youxi = {
- name: '狼人杀',
- // 为这个对象添加独一无二的方法:
- [Symbol('say')]: function () {
- console.log('我可以发言');
- },
- [Symbol('zibao')]: function () {
- console.log('我可以自爆');
- },
-
- // 直接写symbol是不可以的,因为symbol是一个动态的值.而不是一个固定的属性
- // Symbol(): function(){
-
- // }
- };
-
- console.log(youxi);
Symbol 作为对象属性名时不能用 . 运算符,要用方括号 [ ]。因为 . 运算符后面是字符串,所以取到的是字符串属性,而不是 Symbol 值属性。
- let stu = {};
- let s = Symbol('key1');
- stu[s] = 'kk';
- console.log(stu[s]); //kk
- console.log(stu.s); //undefined
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 环境排除。 |