美文网首页
ES6 Symbol

ES6 Symbol

作者: Mr君 | 来源:发表于2019-05-08 13:22 被阅读0次

基本内容

  • 基本数据类型有6种:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。在ES6中引入一种新的数据类型--Symbol。
  • Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象。它由全局 Symbol() 函数创建,每次调用 Symbol()函数,都会返回一个唯一的 Symbol
  • Symbol函数可以接受任何可以被转型成字符串的值,如:字符串、数字、对象、数组等,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分,但不能访问Symbol 自身。
let symbol1 = Symbol();
let symbol2 = Symbol();
 
// 因为每个 Symbol 值都是唯一的,因此该值不与其它任何值相等。
console.log( symbol1 === symbol2 );  // false

console.log( typeof symbol1 ); //  "symbol"

var s1 = Symbol("foo");
var s2 = Symbol("foo");

console.log( s1 === s2 ) // false
  • Symbol值不能与其他类型的值进行运算
    1. 不可以采用如下方式进行强制转换
let uid = Symbol.for('uid')
let desc = uid + ""//报错 Uncaught TypeError: Cannot convert a Symbol value to a string

let uid = Symbol.for('uid')
let desc = uid / 1//报错  Uncaught TypeError: Cannot convert a Symbol value to a number
  1. 采用如下方式强制转换
let uid = Symbol.for('uid')
let desc = String(uid)
console.log(desc)//Symbol(uid)
  • Symbol.for()
    创建一个共享的Symbol:首先会在全局搜索被登记的 Symbol 中是否有该字符串参数作为名称的 Symbol 值,如果有即返回该 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。
let yellow = Symbol("Yellow");
let yellow1 = Symbol.for("Yellow");
yellow === yellow1;      // false
 
let yellow2 = Symbol.for("Yellow");
yellow1 === yellow2;     // true
  • Symbol.keyFor()
    在Symbol全局注册表中检索与Symbol有关的键
let yellow1 = Symbol.for("Yellow");
Symbol.keyFor(yellow1);    // "Yellow"

应用场景

  • Symbol 充当属性名


    Symbol 充当唯一的对象键.png

    这里需要注意:Symbol类型的key是不能通过Object.keys()或者for...in来枚举的,它未被包含在对象自身的属性名集合(property names)之中。所以,利用该特性,我们可以把一些不需要对外操作和访问的属性使用Symbol来定义。因此当使用JSON.stringify()将对象转换成JSON字符串的时候,Symbol属性也会被排除在输出内容之外。

let obj = {
   [Symbol('name')]: 'name',
   age: 18,
   title: 'Engineer'
}

Object.keys(obj)   // ['age', 'title']

for (let p in obj) {
   console.log(p)   // 分别会输出:'age' 和 'title'
}

Object.getOwnPropertyNames(obj)   // ['age', 'title']

JSON.stringify(obj)  // {"age":18,"title":"Engineer"}

我们可以利用这一特点来更好的设计我们的数据对象,让“对内操作”和“对外选择性输出”变得更加优雅。
获取Symbol方式定义的对象属性:

// 使用Object的API
Object.getOwnPropertySymbols(obj) // [Symbol(name)]

// 使用新增的反射API
Reflect.ownKeys(obj) // [Symbol(name), 'age', 'title']

相关文章

  • ES6补充以及Node事件轮询

    Symbol es6中新增了symbol类型,symbol类型的值是通过symbol函数生成的,相同symbol函...

  • 深入理解ES6六

    Symbol ES6新增的数据类型Symbol 创建Symbol:通过去全局的Symbol函数创建一个Symbol...

  • es6中的数据类型之symbol

    1. symbol es6中的数据类型有:number, boolean, string, symbol, nul...

  • 2018-08-06 第一天课 ES6前奏

    1.Symbol ES6新增的 数据类型 -基本类型 值是由Symbol 函数 调用产生的 相同的Symbol 函...

  • JavaSctipt基础归纳,以及隐式转换的规则

    原始类型: "symbol" 是ES6,新扩展的原始类型;Symbol,表示独一无二的值。Symbol 值通过Sy...

  • Symbol

    es6新增数据类型 -- 基本类型 值是由symbol函数调用产生的 Symbol的基本用法 Symbol的使用属...

  • ES6 中的 Symbol

    JavaScript 之 Symbol Symbol是什么 Symbol是ES6中新引入的一种基本数据类型。Sym...

  • Symbol

    Symbol ES6引入了一种新的原始数据类型Symbol,表示独一无二的值.Symbol值通过Symbol函数生...

  • Symbol And Iterator

    Symbol Symbol是es6新引入的一种数据类型,表示一个独一无二的值,Symbol 值通过Symbol函数...

  • Symbol《understanding ECMAScipt6》

    什么是Symbol ES6 新增的类型 原始类型 如何创建Symbol 可以通过new Object( Symbo...

网友评论

      本文标题:ES6 Symbol

      本文链接:https://www.haomeiwen.com/subject/pfproqtx.html