JavaScript < ES5、ES6、ES7、… >ECMAScript 6

ES6(八)Symbol类型

2019-01-13  本文已影响34人  CodeMT

前面的话


ES5中包含5种原始类型:字符串、数字、布尔值、null和undefined。ES6引入了第6种原始类型——Symbol

创建

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

 //Uncaught TypeError: Symbol is not a constructorlet firstName = newSymbol();

【类型检测】

使用

[注意]Symbol值作为对象属性名时,不能用点运算符

 var mySymbol = Symbol();vara ={};
 a.mySymbol = 'Hello!';
 a[mySymbol] // undefineda['mySymbol']// "Hello!"

共享体系

【Symbol.for()】

如果想创建一个可共享的Symbol,要使用Symbol.for()方法。它只接受一个参数,也就是即将创建的Symbol的字符串标识符,这个参数同样也被用作Symbol的描述

 let uid = Symbol.for("uid");
 let object ={};
 object[uid] = "12345";
 console.log(object[uid]); // "12345"console.log(uid);// "Symbol(uid)"

【Symbol.keyFor()】

[注意]Symbol.for为Symbol值登记的名字,是全局环境的,可以在不同的iframe 或service worker 中取到同一个值

 let iframe = document.createElement('iframe');
 iframe.src =String(window.location);
 document.body.appendChild(iframe);
 console.log(iframe.contentWindow.Symbol.for('foo') === Symbol.for('foo'));// true

类型转换

[注意]布尔值除外,因为Symbol与JS中的非空值类似,其等价布尔值为true

 let uid = Symbol.for("uid");
 console.log(uid);//'Symbol(uid)'console.log(!uid);//falseconsole.log(Boolean(uid));
 //true

属性检索

内置Symbol

1、Symbol.haslnstance
  一个在执行instanceof时调用的内部方法,用于检测对象的继承信息
2、Symbol.isConcatSpreadable
  一个布尔值,用于表示当传递一个集合作为Array.prototype.concat()方法的参数时,是否应该将集合内的元素规整到同一层级
3、Symbol.iterator
  一个返回迭代器的方法
4、Symbol.match
  一个在调用String.prototype.match()方法时调用的方法,用于比较字符串
5、Symbol.replace
  一个在调用String.prototype.replace()方法时调用的方法,用于替换字符串的子串
6、Symbol.search
  一个在调用String.prototype.search()方法时调用的方法,用于在字符串中定位子串
7、Symbol.species
  用于创建派生类的构造函数
8、Symbol.split
  一个在调用String.prototype.split()方法时调用的方法,用于分割字符串
9、Symbol.toprimitive
  一个返回对象原始值的方法
10、Symbol.ToStringTag
  一个在调用Object.prototype.toString()方法时使用的字符串,用于创建对象描述
11、Symbol.unscopables
  一个定义了一些不可被with语句引用的对象属性名称的对象集合

【Symbol.haslnstance】

以上这行代码等价于下面这行

   Array[Symbol.hasInstance](obj);

【Symbol.isConcatSpreadable】

【Symbol.species】

下面是一个例子

  class MyArray extends Array {
   static get [Symbol.species]() {
      returnArray; 
    }
   }
  var a =newMyArray(1,2,3);
  var mapped = a.map(x => x *x);
   mapped instanceofMyArray// falsemappedinstanceofArray// true

【Symbol.match】

【Symbol.replace】

下面是一个例子

 const x ={};
 x[Symbol.replace] = (...s) => console.log(s);'Hello'.replace(x, 'World')// ["Hello",  "World"]

【Symbol.search】

【Symbol.split】

下面是一个例子

  class MySplitter {
     constructor(value) { 
       this.value =value;
     }
   [Symbol.split](string) {
   var index = string.indexOf(this.value);  
     if(index === -1) { 
       return string;
     } 
    return[
      string.substr(0, index),
      string.substr(index +this.value.length)
    ];
   }
  }'foobar'.split(newMySplitter('foo'))// ['', 'bar']'foobar'.split(newMySplitter('bar'))// 
  ['foo', '']'foobar'.split(newMySplitter('baz'))// 'foobar'

【Symbol.iterator】

【Symbol.toPrimitive】

1、Number:该场合需要转成数值
2、String:该场合需要转成字符串
3、Default:该场合可以转成数值,也可以转成字符串

let obj ={
[Symbol.toPrimitive](hint) { 
switch (hint) { 
    case'number': return123;      
    case'string':return'str';
    case'default':return'default';
    default:thrownewError();
     }
   }
};2 * obj// 2463 + obj// '3default'obj == 'default'// trueString(obj)// 'str'

【String.toStringTag】

【Symbol.unscopables】

上一篇 下一篇

猜你喜欢

热点阅读