CSDN话题挑战赛第2期
参赛话题:学习笔记
目录
Symbol 基本使用 ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。
它是 JavaScript 语言的第七种数据类型,是一种类似于字符串的数据类型。
(ES6 数据类型除了 Number 、 String 、 Boolean 、 Object、 null 和 undefined ,还新增了 Symbol 。——USONB)
Symbol 特点
- Symbol 的值是唯一的,用来解决命名冲突的问题
- Symbol 值不能与其他数据进行运算
- Symbol 定义的对象属性不能使用 for…in 循环遍 历 ,但是可以使用 Reflect.ownKeys 来获取对象的所有键名
1. 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的值都不一样,在后续的使用中这一点极大的便利了我们。
2. Symbol.for()创建
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
3. Symbol.keyFor()
Symbol.keyFor() 返回一个 已登记 的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。
let s6 = Symbol.for('尚硅谷');
let key = Symbol.keyFor(s6);
console.log(key);// 尚硅谷
4. Symbol给对象添加属性和方法
方法一:
创建一个对象,里面包含 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);
5. Symbol作为对象属性名
Symbol 作为对象属性名时不能用 . 运算符,要用方括号 [ ]。因为 . 运算符后面是字符串,所以取到的是字符串属性,而不是 Symbol 值属性。
let stu = {};
let s = Symbol('key1');
stu[s] = 'kk';
console.log(stu[s]); //kk
console.log(stu.s); //undefined
6. 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 环境排除。 |