美文网首页
第十章 Symbol

第十章 Symbol

作者: A郑家庆 | 来源:发表于2018-12-13 23:09 被阅读0次

概述

  ES5的对象属性名都是字符串,这容易造成属性名的冲突。为了能从根本上防止属性名冲突,ES6引入Symbol基本数据类型,表示独一无二的值,它是js语言的第七种数据类型。
  Symbol值通过Symbol函数生成。对象的属性名分为两种类型:一种是原来就有的字符串,另一种是新增的Symbol类型,只要属性名属于Symbol类型就是独一无二的,可以保证不会与其他属性名产生冲突。

let s = Symbol()
typeof s  // 'symbol'

typeof运算符的结果表明变量s是symbol数据类型,而不是其他类型。
注意:Symbol函数前不能使用new命令,否则报错,因为生成的Symbol是一个基本数据类型,不是对象,它是一种类似于字符串的数据类型。
  Symbol函数接受的参数是字符串,如果不是字符串就会被转为字符串,加上参数主要是用于区分不同的Symbol数据。Symbol值不能与其他类型的值进行运算,否则会报错。

作为属性名的Symbol

let mySymbol = Symbol
let a = {}
a[mySymbol] = 'hello'
let b = {
    [mySymbol]: 'hello'
}

注意:Symbol值作为对象属性名时不能使用点运算符,因为点运算符后面跟的是字符串,而Symbol值是Symbol数据类型而不是字符串数据类型,同理,在任何地方使用Symbol值都需要加上方括号来表示值为Symbol类型。

Symbol.for()、Symbol.keyFor()

有时我们希望重新使用同一个Symbol值,Symbol.for方法可以做到这一点,它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol值。如果有就返回这个Symbol值,如果没有就新建并返回一个以该字符串为名称的Symbol值。

let s1 = Symbol.for('foo')
let s2 = Symbol.for('foo')
s1 === s2  // true

Symbol.for和Symbol这两种写法都会生成新的Symbol值,它们的区别是前者会登记在全局环境中供搜索,而后者不会,所以Symbol每次调用都会返回一个不同的值。
Symbol.keyFor方法返回一个已登记的Symbol类型值的key(参数)。

let s1 = Symbol.for('bar')
Symbol.keyFor('s1')   // 'bar'

let s2 = Symbol('foo')
Symbol.keyFor('s2')   // undefined

总结:Symbol()方法不管参数是不是一样的生成的Symbol值都是不同的,Symbol.for()方法中的参数如果一样那么生成的Symbol值也一样

相关文章

  • 第十章 Symbol

    概述   ES5的对象属性名都是字符串,这容易造成属性名的冲突。为了能从根本上防止属性名冲突,ES6引入Symbo...

  • Symbol

    Symbol 每个Symbol都是独一无二的Symbol() !== Symbol() Symbol 不能进行运算...

  • Symbol

    1、window.Symbol 2、不允许new Symbol 3、symbol() !== symbol() 4...

  • Symbol学习笔记

    一.Symbol是什么 typeof Symbol() === 'symbol',symbol是js中第7种基本类...

  • ES6补充以及Node事件轮询

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

  • 深入理解ES6六

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

  • JS-学习ES6之-Symbol数据类型[整理稿]

    为什么要有Symbol Symbol可以传参数 Symbol 作为属性名的用法 Symbol.for() 1. 为...

  • Symbol简单理解

    Symbol 概述 作为属性名的symbol 属性名的遍历 Symbol的方法 内置的symbol值 概述 Sym...

  • ES6-新增数据类型

    symbol类型 全局函数window.Symbol() typeof window.Symbol() 返回的类型...

  • ES6-Symbol

    创建Symbol实例let s1 = Symbol()let s2 = Symbol('another symbo...

网友评论

      本文标题:第十章 Symbol

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