(五) ES6 新特性 —— Symbol

CSDN话题挑战赛第2期
参赛话题:学习笔记

目录

1. symbol的创建

2. Symbol.for()创建

3. Symbol.keyFor()

4. Symbol给对象添加属性和方法

5. Symbol作为对象属性名

6. symbol的内置属性


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 环境排除。

猜你喜欢

转载自blog.csdn.net/a45667/article/details/127088937