js--Symbol 符号基本数据类型

前言
ECMAScript 6 中新增了 Symbol 符号这一基本数据类型,那么Symbol 是用来干什么的,对开发又有什么帮助呢?本文来总结记录一下 Symbol 的相关知识点。
正文
Symbol (符号)是 ECMAScript 6 新增的一种基本数据类型。符号是原始值,且符号实例是唯一、不可变的。符号的用途是确保对象属性使用唯一的标识符,不会发生属性冲突的危险,符号就是用来创建唯一记号,进而用作非字符串形式的对象属性。
1、符号的创建
var firstSymbol = Symbol()
console.log(firstSymbol); //Symbol()
上面的代码直接调用Symbol()方法创建了一个符号类型的变量,也可以在Symbol方法中传入一个参数对符号变量进行描述,将来可以通过这个字符串来调试代码。但是,这个字符串参数与符号定义或标识完全无关。如下:
var secondSymbol = Symbol("foo")
console.log(secondSymbol); //Symbol("foo")
var thirdSymbol = Symbol("foo")
console.log(secondSymbol == thirdSymbol); //false
Symbol 符号类型不像其他数据类型一样可以通过 new 来创建原始值的包装对象。若强行使用 new 会报语法错误。如果你确实想使用符号包装对象,可以借用 Object() 函数。如下:
var myStr = new String("name")
console.log(typeof myStr);//object
// var mySymbol = new Symbol()//Symbol is not a constructor at new Symbol (<anonymous>)
var mySym = Symbol()
var myWrapSym = Object(mySym)
console.log(typeof myWrapSym);//object
2、从全局的 Symbol 注册表设置和取得 Symbol
var fooGlobalSymbol = Symbol.for('foo'); // 创建新符号
var otherFooGlobalSymbol = Symbol.for('foo'); // 重用已有符号
console.log(fooGlobalSymbol === otherFooGlobalSymbol); // true
// 即使采用相同的符号描述,在全局注册表中定义的符号跟使用 Symbol() 定义的符号也并不等同:
var localSymbol = Symbol('foo');
var globalSymbol = Symbol.for('foo');
console.log(localSymbol === globalSymbol); // false
//此外,注册表中使用的键同时也会被用作符号描述。
console.log(localSymbol);//Symbol(foo)
var emptyGlobalSymbol = Symbol.for();
console.log(emptyGlobalSymbol); // Symbol(undefined)
(2)Symbol.keyFor()
var s = Symbol.for('foo');
console.log(Symbol.keyFor(s)); // foo
// 创建普通符号
var ss = Symbol('bar');
console.log(Symbol.keyFor(ss)); // undefined
//如果传给 Symbol.keyFor() 的不是符号,则该方法抛出 TypeError :
// Symbol.keyFor(123); // TypeError: 123 is not a symbol
3、使用符号作为属性
var s1 = Symbol("s1");
var s2 = Symbol("s2");
var s3 = Symbol("s3");
var s4 = Symbol("s4");
var obj = { [s1]: "s1 val" }
console.log(obj);//{Symbol(s1): "s1 val"}
Object.defineProperty(obj, s2, { value: "s2 val" });
console.log(obj);//{Symbol(s1): 's1 val', Symbol(s2): 's2 val'}
Object.defineProperties(obj, { [s3]: { value: "s3 val" }, [s4]: { value: "s4 val" } })
console.log(obj);//{Symbol(s1): "s1 val",Symbol(s2): "s2 val",Symbol(s3): "s3 val",Symbol(s4):"s4 val"}
var ss1 = Symbol('foo')
var info = { name: 123, age: 1232 }
console.log(Object.getOwnPropertyNames(info));//['name', 'age']
Object.defineProperty(info, ss1, { value: "ss1 val" })
console.log(Object.getOwnPropertySymbols(info));//[Symbol(foo)]
console.log(typeof Object.getOwnPropertySymbols(info)[0]);//'symbol'
console.log(Object.getOwnPropertyDescriptors(info));//{name: {…}, age: {…}, Symbol(foo): {…}}
console.log(Reflect.ownKeys(info));// ['name', 'age', Symbol(foo)]
console.log(info[ss1]);//'ss1 val'
Symbol 作为属性名,该属性不会出现在 for...in、for...of 循环中,也不会被 Object.keys()、Object.getOwnPropertyNames()、JSON.stringify() 返回。
var person = { name: "personName", age: 18 }
var sym = Symbol("sex")
Object.defineProperty(person, sym, { value: "sexValue" })
for (const key in person) {
console.log(key);
}// name age
console.log(Object.keys(person));//["name","age"]
写在最后
以上就是本文的全部内容,希望给读者带来些许的帮助和进步,方便的话点个关注,小白的成长踩坑之路会持续更新一些工作中常见的问题和技术点。最后,祝各位coder,节日快乐。

js--Symbol 符号基本数据类型的更多相关文章
- 【面试题】JS第七种数据类型Symbol详解
JS第七种数据类型Symbol详解 点击打开视频讲解更加详细 一.什么是Symbol? Symbol是ES6中引入的一种新的基本数据类型,用于表示一个独一无二的值.它是JavaScript中的第 七种 ...
- JS 01 变量_数据类型_分支循环_数组
点击直通车↓↓↓ 数据类型及数据类型的手动转换 数组 一.概念 JavaScript(JS)是一种基于对象和事件驱动.且可以与HTML标记语言混合使用的脚本语言,其编写的程序可以直接在浏览器中解释执 ...
- js经典试题之数据类型
js经典试题之数据类型 1:输出"B" + "a" + + "B" + "a"的值: 答案:BaNaNa. 分析:因为+ ...
- JS中的七大数据类型
js中有7种数据类型,包括五种基本数据类型(Number,String,Boolean,Undefined,Null),和一种复杂数据类型(Object)以及es6语法新增的Symbol数据类型 es ...
- 符号化Symbol(符号)体系
http://apps.hi.baidu.com/share/detail/23143648# 符号化Symbol(符号)体系 ArcGIS Engine9.3为开发人员提供了32种符号,主要分为三大 ...
- JS中都有哪些数据类型呢?
js中有5种数据类型:Undefined.Null.Boolean.Number和String.还有一种复杂的数据类型Object,Object本质是一组无序的名值对组成的.
- JS分两种数据类型,你都知道吗?
大牛请无视此篇! JS主要分基本数据类型和引用数据类型,这两者区别可大了,此篇看完必有长进,下面进入正题 首先我们看下什么是基本数据类型(概念我就不说了,直接上代码): var i = 10: var ...
- 安装与配置windbg的symbol(符号)
http://msdn.microsoft.com/en-us/windows/hardware/gg463028.aspx windows symbols下载地址 本篇是新手自己写的一点心得.建议 ...
- JS 引入方式 基本数据类型 运算符 控制语句 循环 异常
一.JS引入方式 什么是JavaScript? JavaScript是运行在浏览器端的脚步语言,JavaScript主要解决的是前端与用户交互的问题,包括使用交互与数据交互,JavaScript是浏览 ...
随机推荐
- Mybatis(一)——HelloWorld
本人的博客一向保持"傻瓜式"的风格. 循序渐进学Mybatis,先konw how,再konw why.先整体,再细节! 本文不讲难懂的概念,先通过一个案例,希望读者跟着本文一步一 ...
- Java并发知识总结,超详细!
首先给大家分享一个github仓库,上面放了200多本经典的计算机书籍,包括C语言.C++.Java.Python.前端.数据库.操作系统.计算机网络.数据结构和算法.机器学习.编程人生等,可以sta ...
- adb 常用命令大全(3)- 查看手机设备信息
查看手机型号 adb shell getprop ro.product.model 查看电池状况 adb shell dumpsys battery 其中 scale 代表最大电量,level 代表当 ...
- Spring AOP Aspect的简单实现(基于XML)
第一步:导包 第二步:实现类和切面类 Service("userService")public class IUserviceImpl implements IUserServic ...
- Request请求对象
一.Request对象由服务器创建,我们使用 浏览器访问服务器资源原理: 二.Request体系结构 其中,servlet 的service()方法参数列表是 servletRequest对象, Ht ...
- RIAD配置
一.RIAD 磁盘阵列介绍 二.阵列卡介绍 三.案例举例 一.RAID磁盘阵列介绍 是Redundant Array of Independent Disks的缩写,中文简称为独立冗余磁盘阵列 把 ...
- Tars | 第2篇 TarsJava SpingBoot启动与负载均衡源码初探
目录 前言 1. Tars客户端启动 @EnableTarsServer 2. Communicator通信器 3. 客户端的负载均衡调用器LoadBalance 最后 前言 通过源码分析可以得出这样 ...
- 30天自制操作系统(二)汇编语言学习和Makefile入门
我们继续学习操作系统的相关内容. ; hello-os ; TAB=4 ORG 0x7c00 ; このプログラムがどこに読み込まれるのか ; 以下は標準的なFAT12フォーマットフロッピーディスクのた ...
- mybatis if else if 条件判断SQL片段表达式取值和拼接
前言 最近在开发项目的时候涉及到复杂的动态条件查询,但是mybaits本身不支持if elseif类似的判断但是我们可以间接通过 chose when otherwise 去实现其中choose为一个 ...
- c++ 的学习笔记 第一集cim cout
1. 你要用这个东西,所以得有包含它得头文件,就像java 你要用某个模块,你得包含这个模块 模块化??单片机里面学的模块化(可以在vs里面实现) 2. 当我把注册表regedit 程序删除之后成功了 ...