ES6--Symbol类型

r囧r小猫 2021-08-14 00:17 443阅读 0赞

概述

ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。
ES6 数据类型除了 Number 、 String 、 Boolean 、 Objec t、 null 和 undefined ,还新增了 Symbol 。

基本用法

Symbol 函数栈不能用 new 命令,因为 Symbol 是原始数据类型,不是对象。可以接受一个字符串作为参数,为新创建的 Symbol 提供描述,用来显示在控制台或者作为字符串的时候使用,便于区分。

  1. let s1 = Symbol("mySymbol");
  2. let s2 = Symbol("mySymbol");
  3. console.log(typeof s1);//symbol
  4. console.log(s1.toString());//Symbol(mySymbol)
  5. // 相同参数 Symbol() 返回的值不相等
  6. console.log(s1 == s2);//false
  7. console.log(s1 === s2);//false

作为属性

由于每一个 Symbol 的值都是不相等的,所以 Symbol 作为对象的属性名,可以保证属性不重名。

  1. //作为属性
  2. let s1 = Symbol("mySymbol");
  3. let s2 = Symbol("mySymbol");
  4. var obj = { };
  5. obj[s1] = "hello";
  6. obj[s2] = "world";
  7. console.log(obj);// { [Symbol(mySymbol)]: 'hello', [Symbol(mySymbol)]: 'world' }
  8. console.log(obj[s1]);//hello
  9. console.log(obj[s2]);//world

三种写法:

  1. let sy = Symbol("key1");
  2. // 写法1
  3. let syObject = { };
  4. syObject[sy] = "kk";
  5. console.log(syObject); // {Symbol(key1): "kk"}
  6. // 写法2
  7. let syObject = {
  8. [sy]: "kk"
  9. };
  10. console.log(syObject); // {Symbol(key1): "kk"}
  11. // 写法3
  12. let syObject = { };
  13. Object.defineProperty(syObject, sy, { value: "kk"});
  14. console.log(syObject); // {Symbol(key1): "kk"}

Symbol 作为对象属性名时不能用.运算符,要用方括号。因为.运算符后面是字符串,所以取到的是字符串 sy 属性,而不是 Symbol 值 sy 属性。

  1. let syObject = { };
  2. syObject[sy] = "kk";
  3. syObject[sy]; // "kk"
  4. syObject.sy; // undefined

注意: Symbol 值作为属性名时,该属性是公有属性不是私有属性,可以在类的外部访问。但是不会出现在 for…in 、 for…of 的循环中,也不会被 Object.keys() 、 Object.getOwnPropertyNames() 返回。如果要读取到一个对象的 Symbol 属性,可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。

  1. let syObject = { };
  2. syObject[sy] = "kk";
  3. console.log(syObject);
  4. for (let i in syObject) {
  5. console.log(i);
  6. } // 无输出
  7. Object.keys(syObject); // []
  8. Object.getOwnPropertySymbols(syObject); // [Symbol(key1)]
  9. Reflect.ownKeys(syObject); // [Symbol(key1)]
  10. /****************************************************************/
  11. //半隐藏属性
  12. const MYKEY = Symbol();
  13. class User{
  14. constructor(key, name, age){
  15. this[MYKEY] = key;
  16. this.name = name;
  17. this.age = age;
  18. }
  19. checkKEY(key){
  20. return this[MYKEY] === key;
  21. }
  22. }
  23. let user = new User(123, 'Tom', 18);
  24. console.log(user.name, user.age, user[MYKEY]);// Tom 18 123
  25. console.log(user.checkKEY(123));// true
  26. console.log(user.checkKEY(456));// false
  27. console.log(Object.keys(user));// [ 'name', 'age' ]
  28. console.log(JSON.stringify(user));// {"name":"Tom","age":18}

定义常量

  1. //作为常量
  2. const Java = Symbol();
  3. const Ruby = Symbol();
  4. const Perl = Symbol();
  5. const Php = Symbol();
  6. const VB = Symbol();
  7. var lang = Java;
  8. if(lang === Java){ //true
  9. console.log("Java未来在哪里?");
  10. }
  11. if(lang === Ruby){ //false
  12. console.log("学习Ruby on Rails");
  13. }

Symbol.for()

Symbol.for() 类似单例模式,首先会在全局搜索被登记的 Symbol 中是否有该字符串参数作为名称的 Symbol 值,如果有即返回该 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。

  1. let yellow = Symbol("Yellow");
  2. let yellow1 = Symbol.for("Yellow");
  3. yellow === yellow1; // false
  4. let yellow2 = Symbol.for("Yellow");
  5. yellow1 === yellow2; // true

Symbol.keyFor()

Symbol.keyFor() 返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。

  1. let yellow1 = Symbol.for("Yellow");
  2. Symbol.keyFor(yellow1); // "Yellow"

发表评论

表情:
评论列表 (有 0 条评论,443人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ES6--Symbol类型

    概述 ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。 ES6 数据类型除了 Number 、 Strin