javaScript的数据类型:number,string,boolean,undefined,null,object

ES6带来了一个新的数据类型:symbol

目的是:解决对象的属性名冲突的问题。

let sm1=Symbol();

let sm2=Symbol();

console.log(sm1);   //Symbol()

console.log(sm2);   //Symbol()

console.log(typeof sm1)    //symbol

console.log(sm1===sm2)   //false

从测试可以发现 虽然sm1和sm2看起来很一样,但他们其实是不相等的。为了让不同的Symbol看起来不一样,我们可以通过参数来实现:

let sm1=Symbol('sm1');

let sm2=Symbol('sm2');

console.log(sm1);   //Symbol(sm1)

console.log(sm2);   //Symbol(sm2)

参数就像是Symbol的描述,用来区分看起来相同,实则不同的Symbol,但要注意,即使描述相同,sm1和sm2也不同,毕竟他们本来就是不同的东西。

下面我们来看用Symbol解决对象属性命名冲突的注意问题:

(1)当symbol值作为对象的属性名时,不能用点号来取得对应的属性值。

let name=Symbol();

let person={

  [name]:'Lily'     //以Symbol作为属性名name

};

console.log(person[name])  //Lily

console.log(person.name)    //undefined  不能用点号来取得对应的属性值

(2)当symbol值作为对象的属性名时,也不能用点号来设置对应的属性值

let name=Symbol();

let person={}

paseon.name='Lily'     //以Symbol作为属性名name,以点号赋值。

console.log(person[name])  //undefined 不能用点号来设置对应的属性值

console.log(person['name'])  //Lily

console.log(person.name)    //Lily

可以看出,当用点号赋值时,其实javascript就不会把点号后的值理解为symbol类型,而是字符串类型,就相当于没有使用symbol

(3)如何遍历symbol类型的属性名:Object.getOwnPropertySymbols()

let name=Symbol();

let person={

  [name]:'Lily' ,    //symbol类型

  'age':12   //string类型

};

Object.keys(person)   //['age']

for(let key in person){

  console.log(key)   // age

}

我们发现使用Object.keys()和for...in都无法遍历出symbol类型的属性。

我们可以用Object.getOwnPropertySymbols()来获取symbol类型的属性:

Object.getOwnPropertySymbols(person) //  [Symbol(name)]

(4)获取对象上的所有属性名:Reflect.ownKeys()

Reflect.ownKeys(person)  // ['age',Symbol(name)]

(5)用Symbol.for()创建全局变量

let sm1=Symbol.for('name');

let sm2=Symbol.for('name');

之前我们说过,在用Symbol创建变量时,即使描述相同,两个变量实际也是不同的(console.log(sm1===sm2)   //false  )。

但这里,我们用Symbol.for()来创建得到的结果是:

console.log(sm1===sm2)   //true

原因是:使用Symbol.for()来创建的symbol值被登记在全局环境中,以便用Symbol.for()来搜索。也就是使用Symbol创建的symbol值是无法用Symbol.for()来搜索的。

let sm1=Symbol('name');

let sm2=Symbol.for('name');

console.log(sm1===sm2)   //false

(6)Symbol.keyFor()  返回一个被登记在全局环境中的symbol值的key,没有返回undefined

let sm1=Symbol.for('name');

Symbol.keyFor('sm1')   //name

let sm1=Symbol('name');

Symbol.keyFor('sm1')   // undefined

ES6-Symbol的更多相关文章

  1. es6 Symbol类型

    es6 新增了一个原始类型Symbol,代表独一无二的数据 javascript 原来有6中基本类型, Boolean ,String ,Object,Number, null , undefined ...

  2. ES6 Symbol数据类型和set-map 数据结构

    Symbol数据类型 ES6新加的数据类型,提供一个独一无二的值 { let a1 = Symbol() ;let a2 = Symbol() } //声明 { let a3 = Symbol.for ...

  3. ES6 Symbol的应用场景

    一.简介 具体使用请参考:API ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值.它是 JavaScript 语言的第七种数据类型,前六种是:undefined.null.布尔值(B ...

  4. ES6 symbol 以及symbol的简单应用

    前置 1.ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值. 2.Symbol 值通过Symbol函数生成. 3.Symbol 函数可以接受一个字符串作为参数,表示对 Symbol 实 ...

  5. Es6 Symbol.iterator

    Symbol.iterator 为每一个对象定义了默认的迭代器.该迭代器可以被 for...of 循环结构使用. --描述 当需要迭代一个对象的时候(比如在 for...of 循环的开始时),它的 @ ...

  6. ES6——Symbol数据类型

    什么是 Symbol ? Symbol 表示独一无二的值,他是js中的 第七种数据类型. 基本的数据类型:null, undefined number boolean string symbol 引用 ...

  7. JavaScript ES6 Symbol.hasInstance的理解。

    Symbol.hasInstance 本案例是结合阮一峰老师的ECMAScript 6 入门丛书进一步的详细介绍,和对Symbol.hasInstance的理解.本着互联网的精神,分享给大家. 对象的 ...

  8. ES6 Symbol类型 附带:Proxy和Set

    七种数据类型 ·Symbol ·undefined ·null ·Boolean ·String ·Number ·Object let a = Symbol('this is a symbol'); ...

  9. 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】

    原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...

  10. 深入浅出ES6(八):Symbols

    作者 Jason Orendorff  github主页  https://github.com/jorendorff 你是否知道ES6中的Symbols是什么,它有什么作用呢?我相信你很可能不知道, ...

随机推荐

  1. IT公司100题-19-求Fibonacci数列

    问题描述: 定义Fibonacci数列的定义如下:          /    0                           n=0f(n)=      1                  ...

  2. IT公司100题-1-二叉树转换为双链表

    问题描述: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 10   /   \  6      14/  \    /   \4   8 1 ...

  3. io函数

    io函数一般分为两大类: 系统(不带缓存)调用: 如read.write.open 标准(带缓存)调用: fread.fwrite.fopen 上面说的带缓存/不带缓存是针对用户态的,内核态本身都是带 ...

  4. java的动态绑定和静态绑定

    首先是方法的参数是父类对象,传入子类对象是否可行然后引出Parent p = new Children();这句代码不是很理解,google的过程中引出向上转型要理解向上转型又引出了动态绑定从动态绑定 ...

  5. 在VS中使用类模板出现出现LNK2019: 无法解析的外部符号错误。

    在VS中使用类模板出现出现LNK2019: 无法解析的外部符号错误,应在一个.h文件中完成方法的声明与实现,不要将实现放在cpp文件里,VS貌似不支持类模板分离

  6. RPI学习--WebCam_mplayer

    1,安装mplayer $ sudo apt-get install mplayer 2,运行 $ sudo mplayer tv:// 有时会秀逗,绿屏,多试几下就好了,情况未知

  7. SharePoint 2013 开发——SharePoint Designer 2013工作流

    博客地址:http://blog.csdn.net/FoxDave SharePoint Designer 2013为开发者和高级用户提供了两种创建定制工作流的模式: 基于文本的设计器--即我们一直 ...

  8. ASP.NET MVC4 & Entity Framework 6.0 IIS 部署出错解决方案

    博客地址 http://blog.csdn.net/foxdave 近期了解MVC4的时候弄了一个简单的小工程,使用Entity Framework作为Model,F5启动调试运行的时候没有问题,但是 ...

  9. Mac运行exe的几种方法,欢迎补充!

    1. 用wine直接运行exe.安装wine后有个放exe的文件夹,双击后会自动包装运行.看起来挺方便的,就怕暂用资源比较大: http://www.youtube.com/watch?v=eYISV ...

  10. 练手CF3-C - Wormhouse

    深搜,亮点在那个剪枝,flag代表是否搜索数组从开始到当前一直等于原始数组同位置的数,如果是真,就从原始数组的当前位置的书开始搜,否则就从0开始搜. 见代码. #include <iostrea ...