zoukankan      html  css  js  c++  java
  • ES6随笔--Symbol

    基础

    Symbol是ES6引入的一种新的原始数据类型,表示独一无二的值。在此之前JavaScript中有六种数据类型(Number, String, Boolean, undefined, null, Object),这是第七种;

    创建方式:let sym = Symbol(), 可以接收参数作为描述,一般为字符串;即使是传入相同的字符串,Symbol值本身都是独一无二的;

          let s = Symbol("name");
          let s1 = Symbol(3);
          alert(typeof s); // symbol
          alert(s); // trysomething.html:11 Uncaught TypeError: Cannot convert a Symbol value to a string
          console.log(s); // Symbol(name)
          console.log(s1); //  Symbol(3)
    

    可以通过String()/toString()/Boolean()方法对其转换类型,但是不能直接将Symbol值用于运算(如字符拼接、数学计算等),也不能用Number()转换为数值,会报错;

          console.log(s1+2); //Uncaught TypeError: Cannot convert a Symbol value to a number
          console.log(Number(s1)+2); //Uncaught TypeError: Cannot convert a Symbol value to a number
          console.log(String(s1)+2); //Symbol(3)2
          console.log(Boolean(s1)+2); //3
    

    只要被创建且为更改为其他类型,所有Symbol值转换为Boolean值都是true;

    Symbol值作为对象的属性名,必须放在方括号之中,不能用点操作符;该属性是公开属性;

    Symbol属性名的遍历

    Object.getOwnPropertySymbols()方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。
    Reflect.ownKeys()方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。

    Symbol.for(), Symbol.keyFor()

    Symbol.for()接受一个字符串作为参数,如果已经有以该字符串命名的Symbol值就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。只有Symbol.for()创建的值可以被登记于全局并供之后的Symbol.for()搜索,而Symbol()创建的值一定是独一无二的值;

        let a = Symbol("time");
        let b = Symbol.for("time");
        let c = Symbol.for("time");
        console.log(a === b); // false
        console.log(c === b); // true
    

    Symbol.keyFor()方法返回一个已登记的 Symbol 类型值的key

    内置的Symbol值

    (感觉这部分需要用起来才能理解和记忆,先保留大概印象,需要时再去教程中复习)
    ES6定义了11个内置的Symbol值,指向语言内部使用的方法;

    1. 对象的Symbol.hasInstance属性,指向一个内部方法,当其他对象调用instanceof运算符,判断是否为该对象的实例时,会调用这个方法;
    2. 对象的Symbol.isConcatSpreadable属性等于一个布尔值,表示该对象用于Array.prototype.concat()时,是否可以展开。
    3. 对象的Symbol.species属性,指向一个构造函数。创建衍生对象时,会使用该属性。
    4. 对象的Symbol.match属性,指向一个函数。当执行str.match(myObject)时,如果该属性存在,会调用它,返回该方法的返回值。
    5. 对象的Symbol.replace属性,指向一个方法,当该对象被String.prototype.replace方法调用时,会返回该方法的返回值。
    6. 对象的Symbol.search属性,指向一个方法,当该对象被String.prototype.search方法调用时,会返回该方法的返回值。
    7. 对象的Symbol.split属性,指向一个方法,当该对象被String.prototype.split方法调用时,会返回该方法的返回值。
    8. 对象的Symbol.iterator属性,指向该对象的默认遍历器方法。
    9. 对象的Symbol.toPrimitive属性,指向一个方法。该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。
    10. 对象的Symbol.toStringTag属性,指向一个方法。在该对象上面调用Object.prototype.toString方法时,如果这个属性存在,它的返回值会出现在toString方法返回的字符串之中,表示对象的类型。也就是说,这个属性可以用来定制[object Object][object Array]object后面的那个字符串。
    11. 对象的Symbol.unscopables属性,指向一个对象。该对象指定了使用with关键字时,哪些属性会被with环境排除。

    生如夏花般绚烂,死如秋叶般静美
  • 相关阅读:
    [20210908]Reverse Shell with Bash.txt
    [20210831]bbed读取数据块6.txt
    自主学习 之 用Python玩转数据
    简单四则运算(PSP)
    永久免费云服务器搭建国内Moon服务加速ZeroTier
    INDEX
    openjdk 8 的 hotspot 源码目录结构
    CentOS 7 编译 openjdk 8
    23
    22
  • 原文地址:https://www.cnblogs.com/muTing/p/9191624.html
Copyright © 2011-2022 走看看