ES6之前的数组类型
在ES6之前JS只有6种数据类型,分别是:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。

ES6引入了一种新的 原始数据类型 Symbol,表示独一无二的值,至此JS有了 7 种数据类型。

随着JS的版本更新,未来可能会出现其他新的数据类型。

Symbol 是什么
Symbol值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的Symbol类型。凡是属性名属于Symbol类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。所以,Symbol非常适合做标识符。

Symbol有静态属性,原型上也有methods,但是缺少constructor,所以不能使用 new Symbol() , 会报错(见下图)。

因为生成的Symbol是一个原始类型的值,不是对象,所以不能添加属性。

由于每一个Symbol值都是不相等的,这意味着Symbol值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。Symbol值作为对象属性名时,不能用点运算符。在对象的内部,使用Symbol值定义属性时,Symbol值必须放在方括号之中。

Symbol 的应用实例
Symbol的值
let s = Symbol();
typeof s;
// "symbol"
Symbol是独一无二的
let s1 = Symbol('abc')
let s2 = Symbol('abc')
s1 === s2
// false
Symbol的参数
let s1 = Symbol('abc');
let s2 = Symbol('efg');
s1.toString();
// "Symbol(abc)"
s2.toString();
// "Symbol(efg)";
获取symbol类型值的三种方式
通过Symbol对象,可以得到一个唯一的symbol值

let s = Symbol();
Symbol.for(string) 可以注册一个symbol,再次调用Symbol.for(string)会得到这个symbol值,区别于Symbol()是唯一的

let sym = Symbol('abc');
const sym1 = Symbol.for('abc');
console.log(sym === sym1); //false
console.log(sym1 === Symbol.for('abc')); //true
Symbol.iterator

用到对象中,被for...of遍历所用,用于每个object中,所以应该是固定的值。

console.log(Symbol.iterator === Symbol.iterator);
//true
应用场景
由于Symbol的值具有唯一的特性,可以解决变量名,属性名冲突的问题,并切Symbol提出了一些属性和方法,用于过渡以及实现一些特殊的用途,比如对象的迭代器,instanceof的拓展等等。

Symbol 在Vue中的应用
使用 vuex 时常常需要定义各种常量,以前是这样写:

// types.js
export const SHOW_CONTACT = 'SHOW_CONTACT'
使用Symbol后,可以这样写

// types.js
export const SHOW_CONTACT = Symbol('show_contact')
作为对象的key
注意: symbol作为属性名不能通过 . 的形式添加。

对象[]方括号的形式

const obj = {}
const sym = Symbol();
obj[sym] = 'syj';
对象内部定义

const sym = Symbol();
const obj = {
[sym]: 'syj'
}
通过Object.defineProperty定义

const sym = Symbol();
const obj = Object.defineProperty({}, sym, {
enumerable: true, //可枚举
writable: true, //可赋值运算符改变
configurable: true, //可改变,可删除
value: 'syj'
})
symbol类型的key的遍历

当我们用symbol设置了对象的key以后,他是不会被之前的for...in,Object.keys()遍历出来的,需要用Object.getOwnPropertySymbols()获取,得到一个所有这个对象中的symbol属性名的数组。

const sym1 = Symbol('1');
const sym2 = Symbol('2');
const obj = {
[sym1]: 'syj',
[sym2]: 'fy'
}
const ary = Object.getOwnPropertySymbols(obj);
console.log(ary); //[ Symbol(1), Symbol(2) ]

理解ES6的新数据类型:Symbol的更多相关文章

  1. ES6中的新数据类型——Symbol

    今天小编和大家来聊一聊es6中新增的一个原始数据类型Symbol.在es5中原始数据类型(基本数据类型)有以下六种:Undefind.Null.Bool. String.Number.Object.今 ...

  2. ES6 新增基本数据类型Symbol

    ES6 增加了一个新的基本数据类型 symbol. 不过,和其他基本数据类型相比,它有点与众不同,因为它没有字面量的表现形式,而且创建的方式也有点奇怪,只能通过调用全局函数Symbol()来完成. l ...

  3. 【读书笔记】【深入理解ES6】#6-Symbol和Symbol属性

    在ES5及早期版本中,JS语言包含5中原始类型: 字符串型 数字型 布尔型 null undefined ES6引入了第六种原始类型: Symbol 创建Symbol let firstName = ...

  4. es6学习笔记--新数据类型Symbol

    学习了es6语法的symbol类型,整理笔记,闲时复习. Symbol 是es6新增的第七种原始数据类型(null,string,number,undefined,boolean,object),是为 ...

  5. ES6新数据类型Symbol

    Symbol 需计算字面量属性时使用 const benz = Symbol('benz'); const car = { [benz]: 'benz car' }; const info = Sym ...

  6. es6总结(六)--新数据类型-Symbol

  7. ES6的新增数据类型:Symbol

    简介:Symbol类型是es6新增的一个数据类型,Es5的基本数据类型(undefined,null,Object,function,Number,string) Symbol值通过Symbol函数生 ...

  8. ES6的新特性(13)——Symbol

    Symbol 概述 ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突. ...

  9. 理解ES6中的Symbol

    一.为什么ES6引入Symbol 有时候我们在项目开发的过程中可能会遇到这样的问题,我写了一个对象,而另外的同时则在这个对象里面添加了一个属性或是方法,倘若添加的这个属性或是方法是原本的对象中本来就有 ...

随机推荐

  1. Spring源码学习笔记之bean标签属性介绍及作用

    传统的Spring项目, xml 配置bean在代码中是经常遇到, 那么在配置bean的时候,这些属性的作用是什么呢? 虽然说现在boot项目兴起,基于xml配置的少了很多, 但是如果能够了解这些标签 ...

  2. unrecognized selector sent to class 0x10a4ce490 我躺过的坑

    错误现象:unrecognized selector sent to class 0x102265ad8’ 错误原因: Other Linker Flags 链接设置错误导致类扩展不知道如何正确读取, ...

  3. POJ1743 Musical Theme (后缀数组 & 后缀自动机)最大不重叠相似子串

    A musical melody is represented as a sequence of N (1<=N<=20000)notes that are integers in the ...

  4. UESTC1977-图书馆(AC自动机应用)

    M - 图书馆 Time Limit: 2000 MS     Memory Limit: 256 MB Submit Status 电子科技太学图书馆创建于1956年,馆舍总面积66974平方米,各 ...

  5. springboot搭建一个简单的websocket的实时推送应用

    说一下实用springboot搭建一个简单的websocket 的实时推送应用 websocket是什么 WebSocket是一种在单个TCP连接上进行全双工通信的协议 我们以前用的http协议只能单 ...

  6. java之单例设计模式

    什么是设计模式? 设计模式是在大量的实践中总结和理论化之后优选的代码结构.编程风格.以及解决问题的思考方式.设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和探索. 所谓单例 ...

  7. Java构造器浅析

    Java构造器 问题引出 1.先看一段简单创建对象的例子: public class constructTest { public static void main(String[] args) { ...

  8. 【玩转SpringBoot】用好条件相关注解,开启自动配置之门

    自动配置隐含两层含义,要搞清楚 上帝让程序员的发量减少,是为了让他变得更聪明,如果有一天聪明到了极点,那就是绝顶聪明. 据说在大脑高速运转下,这样更有利于散热,不至于核心温度过高而产生告警. 聪明的大 ...

  9. HTML5变化

    HTML5变化 新的语义化元素 header footer nav main article section 删除了一些纯样式的标签 表单增强 新API 离线 (applicationCache ) ...

  10. Spring Boot 如何自定义返回错误码错误信息

    说明 在实际的开发过程中,很多时候要定义符合自己业务的错误码和错误信息,而不是统一的而不是统一的下面这种格式返回到调用端 INTERNAL_SERVER_ERROR(500, "Intern ...