• ES5-ES6-ES7_Symbol数据类型


    Symbol数据类型简介

    ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。

    Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。

    凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。

    Symbol函数前不能使用new命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。

    也就是说,由于 Symbol 值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型

    let s = Symbol();
    
    //变量s就是一个独一无二的值。typeof运算符的结果,表明变量s是 Symbol 数据类型,而不是字符串之类的其他类型
    console.log(typeof s);  //symbol
    console.log(s); //Symbol()
    
    
    // Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,
    // 主要是为了在控制台显示,或者转为字符串时,比较容易区分
    let s1 = Symbol('foo');
    let s2 = Symbol('bar');
    console.log(s1,s2);  //Symbol(foo) Symbol(bar)
    console.log(s1.toString(),s2.toString());  //Symbol(foo) Symbol(bar)

    Symbol数据类型的简单使用

    //如果 Symbol 的参数是一个对象,就会调用该对象的toString方法,将其转为字符串,然后才生成一个 Symbol 值
    const obj = {
        toString() {
            return 'abc';
        }
    };
    const sym = Symbol(obj);
    console.log(sym); // Symbol(abc)
    
    
    //Symbol函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的。
    // 没有参数的情况
    let s3 = Symbol();
    let s4 = Symbol();
    console.log(s3 === s4);// false
    
    // 有参数的情况
    let s5 = Symbol('foo');
    let s6 = Symbol('foo');
    console.log(s5 === s6); // false
    
    
    // Symbol 值不能与其他类型的值进行运算,会报错
    // 但是,Symbol 值可以显式转为字符串
    // Symbol 值也可以转为布尔值,但是不能转为数值
    let symb = Symbol('My symbol');
    //console.log("your symbol is " + symb); // TypeError: can't convert symbol to string
    console.log(String(symb));   //Symbol(My symbol)
    console.log(symb.toString());  //Symbol(My symbol)
    console.log(Boolean(symb)); // true
    console.log(!symb ); //false
    //console.log(Number(symb)); // TypeError: Cannot convert a Symbol value to a number
    //console.log(symb + 2); // TypeError: Cannot convert a Symbol value to a number

    作为对象属性名的 Symbol

    由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。

    这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖,下面有两种写法

    var mySymbol = Symbol('mySymbol');
    
    const obj = {};
    obj[mySymbol] = 'hello';
    console.log(obj);   //{ mySymbol: 'hello' }
    console.log(obj[mySymbol]);  //hello
    var mySymbol = Symbol('mySymbol');
    
    const obj = {
        [mySymbol] : 'hello'
    }
    console.log(obj);   //{ mySymbol: 'hello' }
    console.log(obj[mySymbol]) //hello

    属性名的遍历
    Symbol 作为属性名,该属性不会出现在for...in、for...of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。

    var mySymbol = Symbol('mySymbol');
    
      const obj = {userName: 'huang'};
      obj[mySymbol] = 'hello';
    
      console.log(obj[mySymbol]) // hello
      for (let i in obj){
        console.log(i) //mySymbol属性没有遍历出来
      }

    但是,它也不是私有属性,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名

    var obj = {};
    var a = Symbol('a');
    var b = Symbol('b');
    
    obj[a] = 'Hello';
    obj[b] = 'World';
    
    //Object.getOwnPropertySymbols方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。
    var objectSymbols = Object.getOwnPropertySymbols(obj);
    
    console.log(objectSymbols);  //[ Symbol(a), Symbol(b) ]

    内置Symbol值

    除了定义自己使用的Symbol值以外,ES6还提供了11个内置的Symbol值,指向语言内部使用的方法。

    Symbol.iterator——对象的Symbol.iterator属性,指向该对象的默认遍历器方法

    // 等同于在指定的数据结构内部署了iterator接口
      // 当使用for of遍历某个一个数据结构的时候,首先去找Symbol.iterator,找到了就去遍历,没有找到就不能遍历并且报错obj is not iterator
      const obj = {
        [Symbol.iterator]: function () {
          let index = 0;
          return {
            next: function () {
              return index < this.length ? {value: this[index++],done: false} : {value: undefined, done: true};
            }
          }
        }
      };
  • 相关阅读:
    【转】linux之fsck命令
    【转】linux之mkfs/mke2fs格式化
    【转】linux_fdisk命令详解
    【转】linux之ln命令
    [转]linux的du和df命令
    [转]Linux之type命令
    [转]Linux下which、whereis、locate、find 命令的区别
    [转]Linux的chattr与lsattr命令详解
    get 与post 的接收传值方式
    在asp.net前台页面中引入命名空间 和连接数据库
  • 原文地址:https://www.cnblogs.com/LO-ME/p/10593505.html
Copyright © 2020-2023  润新知