zoukankan      html  css  js  c++  java
  • 【JavaScript】Symbol 静态属性(二)

    以下内容为学习记录,可以参考 MDN 原文。

    环境

    • node v12.18.1
    • npm 6.14.5
    • vscode 1.46
    • Microsoft Edge 83

    概念

    symbol 是一种基本数据类型 (primitive data type)。Symbol()函数会返回 symbol 类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的 symbol 注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:"new Symbol()"。

    每个从 Symbol() 返回的 symbol 值都是唯一的。一个 symbol 值能作为对象属性的标识符;这是该数据类型仅有的目的。

    const symbol1 = Symbol();
    const symbol2 = Symbol(42);
    const symbol3 = Symbol('foo');
    
    console.log(typeof symbol1);
    // expected output: "symbol"
    
    console.log(symbol2 === 42);
    // expected output: false
    
    console.log(symbol3.toString());
    // expected output: "Symbol(foo)"
    
    console.log(Symbol('foo') === Symbol('foo'));
    // expected output: false
    

    构造函数

    Symbol() 创建一个新的 Symbol 对象。作为构造函数,它不完整,因为它不支持语法 “new Symbol()”。

    let sym = new Symbol()  // TypeError
    

    静态属性

    replace

    Symbol.replace 这个属性指定了当一个字符串替换所匹配字符串时所调用的方法。String.prototype.replace() 方法会调用此方法。

    class Replace1 {
      constructor(value) {
        this.value = value;
      }
      [Symbol.replace](string) {
        return `s/${string}/${this.value}/g`;
      }
    }
    
    console.log('foo'.replace(new Replace1('bar')));
    // expected output: "s/foo/bar/g"
    

    Symbol.search 指定了一个搜索方法,这个方法接受用户输入的正则表达式,返回该正则表达式在字符串中匹配到的下标,这个方法由以下的方法来调用 String.prototype.search()。

    class Search1 {
      constructor(value) {
        this.value = value;
      }
      [Symbol.search](string) {
        return string.indexOf(this.value);
      }
    }
    
    console.log('foobar'.search(new Search1('bar')));
    // expected output: 3
    

    split

    Symbol.split 指向一个正则表达式的索引处分割字符串的方法。这个方法通过 String.prototype.split() 调用。

    class Split1 {
      constructor(value) {
        this.value = value;
      }
      [Symbol.split](string) {
        const index = string.indexOf(this.value);
        return `${this.value}${string.substr(0, index)}/${string.substr(index + this.value.length)}`;
      }
    }
    
    console.log('foobar'.split(new Split1('foo')));
    // expected output: "foo/bar"
    

    species

    Symbol.species 是个函数值属性,其被构造函数用以创建派生对象。

    class Array1 extends Array {
      static get [Symbol.species]() { return Array; }
    }
    
    const a = new Array1(1, 2, 3);
    const mapped = a.map(x => x * x);
    
    console.log(mapped instanceof Array1);
    // expected output: false
    
    console.log(mapped instanceof Array);
    // expected output: true
    

    toPrimitive

    Symbol.toPrimitive 是一个内置的 Symbol 值,它是作为对象的函数值属性存在的,当一个对象转换为对应的原始值时,会调用此函数。

    const object1 = {
      [Symbol.toPrimitive](hint) {
        if (hint === 'number') {
          return 42;
        }
        return null;
      }
    };
    
    console.log(+object1);
    // expected output: 42
    

    toStringTag

    Symbol.toStringTag 是一个内置 symbol,它通常作为对象的属性键使用,对应的属性值应该为字符串类型,这个字符串用来表示该对象的自定义类型标签,通常只有内置的 Object.prototype.toString() 方法会去读取这个标签并把它包含在自己的返回值里。

    class ValidatorClass {
      get [Symbol.toStringTag]() {
        return 'Validator';
      }
    }
    
    console.log(Object.prototype.toString.call(new ValidatorClass()));
    // expected output: "[object Validator]"
    

    unscopables

    Symbol.unscopables 指用于指定对象值,其对象自身和继承的从关联对象的 with 环境绑定中排除的属性名称。

    const object1 = {
      property1: 42
    };
    
    object1[Symbol.unscopables] = {
      property1: true
    };
    
    with (object1) {
      console.log(property1);
      // expected output: Error: property1 is not defined
    }
    
  • 相关阅读:
    hibernate理解
    struts理解
    网上书城项目
    编码过程中遇到的问题
    JS回调函数
    requirejs 一个拆分js项目的类库
    jq插件开发总结
    转载-- 魔兽哈希算法封装和测试
    转载--C# PLINQ 内存列表查询优化历程
    Oracle删除死锁进程的方法
  • 原文地址:https://www.cnblogs.com/jiangbo44/p/13551562.html
Copyright © 2011-2022 走看看