JavaScript数据类型 - Symbol

ES5:对象的属性名只能是字符串,当给对象添加新属性时,很容易造成属性名冲突,从而覆盖了原有的属性。

ES6:所以ES6中引入了symbol数据类型,他表示独一无二的值,避免了属性名的冲突,此时对象的属性名可由字符串类型或者symbol类型来定义。

symbol是一种基本数据类型,通过Symbol()函数来返回symbol类型的值,具有唯一性。

语法:Symbol([description])

参数:description可选,字符串类型,表示对symbol的描述,调试时更容易区分。

一、作为普通变量使用

var symbol1 = Symbol();
var symbol2 = Symbol("2");
var symbol2c = Symbol("2");

console.log(typeof symbol1); // symbol
console.log(symbol2 === symbol2c); // false

注意:

1. 不可使用new Symbol()来创建实例,否则会报TypeError,围绕原始数据类型创建一个显式包装器对象从 ECMAScript 6 开始不再被支持。 然而,现有的原始包装器对象,如 new Booleannew String以及new Number,因为遗留原因仍可被创建。

2. Symbol函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的。

3. Symbol值不能与其他类型的值进行运算,除非将symbol值转换为字符串,如String(symbol2)或者symbol2.toString()。

4. Symbol值可转换为布尔值,例如Boolean(symbol2)为true,!symbol2为false,Symbol值只能转换为字符串值或者布尔值。

二、作为对象属性名使用

var sName = Symbol("name");
var obj = {
    [sName]: "lily",
    sAge: 18
}
// 另外也可这样赋值
// obj[sName] = "lily";
// Object.defineProperty(a, mySymbol, { value: ‘Hello!‘ });

console.log(obj); // {sAge: 18, Symbol(name): "lily"}
console.log(obj[sName]); // lily

注意:

1. Symbol作为对象属性名时,不能使用点运算符,使用点运算符后,这个属性名就是一个普通字符串了,而不是Symbol类型。

2. Symbol属性名具有隐藏性,是不可枚举属性,所以这个属性不能使用for...in、for...of、Object.keys()Object.getOwnPropertyNames()JSON.stringify()等方法访问到,

可以通过创建时的原始 symbol 值访问到,或者通过遍历 “Object.getOwnPropertySymbols()” 返回的数组中得到。

var sName = Symbol("name");
var obj = {
    [sName]: "lily",
    sAge: 18
}
console.log(obj[sName]); // lilyconsole.log(Object.getOwnPropertySymbols(obj)); // [Symbol(name)]

另一个新的 API,Reflect.ownKeys()方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。

var sName = Symbol("name");
var obj = {
    [sName]: "lily",
    sAge: 18
}
Reflect.ownKeys(obj);

// ["sAge", Symbol(name)]

三、获取description的属性

es2019提供了获取Symbol描述的方法

var sName = Symbol("name");
console.log(sName.description); // name

四、Symbol.for(),Symbol.keyFor()

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

let s1 = Symbol.for(‘foo‘);
let s2 = Symbol.for(‘foo‘);

s1 === s2 // true

Symbol.for()Symbol()这两种写法,都会生成新的 Symbol。

它们的区别是,前者会被登记在全局环境中供搜索,后者不会。

Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在,如果不存在才会新建一个值。

比如,如果你调用Symbol.for("cat")30 次,每次都会返回同一个 Symbol 值,但是调用Symbol("cat")30 次,会返回 30 个不同的 Symbol 值。

2. Symbol.keyFor()方法返回一个已登记的 Symbol 类型值的key

let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"

let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined

参考文献:

http://es6.ruanyifeng.com/#docs/symbol

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol

原文地址:https://www.cnblogs.com/lqw007/p/12162657.html

时间: 2024-10-31 21:37:18

JavaScript数据类型 - Symbol的相关文章

JavaScript数据类型检测

一.JavaScript 数据类型 1.基本数据类型(6种) Undefined Null Boolean Number String Symbol (ES6新增) 2.引用数据类型: Object 二.数据类型检测 1. typeof 可以检测除null 外的基本类型.null 和所有对象的typeof都是"object", 不能用于检测用户自定义类型. 比如Date, RegExp, Array, DOM Element的类型都是"object". var s

javascript数据类型及判断

javascript数据类型: 基础数据类型 js数据分为两种类型:原始数据类型和引用数据类型. 原始数据类型有:string.number.boolean.undefined null Symbol(ES6新增) 引用数据类型有:Function.Object.Date.RegExp.Number.String.Boolean和自定义类等 基础数据类型判断 1.typeof()函数 对于原始数据类型,我们可以使用typeof()函数来判断他的数据类型: typeof(1) //number t

JavaScript 数据类型

JavaScript 语?的每?个值,都属于某?种数据类型. 在 ES5 ??,数据类型?共分为六种:五种原始数据类型,?种引?数据类型. 在原始数据类型?,分为了五个?类: number(数字)类型:包含整数和浮点数(即?数): boolean(布尔)类型:只有 true 和 false 两个值: string(字符串)类型:字符串值必须?引号括起来,引号可以是单引号,也可以是双引号: null 类型:?于表示某个变量值为空: undefined 类型:?来确定?个已经创建但是没有初始值的变量

JavaScript之基础-3 JavaScript 数据类型、数据类型转换

一.数据类型 数据类型 基本类型 - 数字类型 - 既可以表示32位整数,也可以表示64位的浮点数 - 整数 - 十进制:逢十进一的整数,如1234567890 - 八进制:逢八进一的整数,如01235670 - 十六进制: - 浮点数 - 使用小数点记录数据,如 95.5,3.1415926 - 使用指数记录数据,如 4.3e23, 4.3E-23 string 类型 - 字符串类型 - 表示一系列的文本字符数据,如性别.姓名.住址等 - 由Unicode字符,数字,标点组成的序列 - Jav

Javascript数据类型和类型转换

Javascript数据类型 Boolean(布尔).Number(数字).String(字符串).Undefined(未定义).Null(空对象).Object(对象类型).Function 引用类型:对象.数组.函数. 原始数据类型:数值.布尔值 .null .字符串 原始类型的变量不能动态添加成员: <script type="text/javascript"> var n='我好帅'; n.Age=100; alert(n.Age);//结果是undefined &

javascript数据类型(上)

Javascript数据类型有6种: 数值型数据类型(Number): 字符串(String): 布尔型数据(Boolean): 对象(Object): 空(Null): 未定义(Undefined). (一).Number var a = 12; alert(a); 弹出a的值是12. var a = 12; alert(typeof a); [typeof 是查看变量的类型.]弹出的是number,说明a的返回参数为number,类型是Number类型[大写字母是数据类型,小写字母是返回参数

JavaScript筑基篇(二)-&gt;JavaScript数据类型

说明 介绍JavaScript数据类型 目录 前言 参考来源 前置技术要求 JavaScript的6种数据类型 哪6种数据类型 undefined 类型 null 类型 boolean 类型 number 类型 string 类型 复杂 类型 基本型和引用型的不同 关于数据类型的一些常见疑问 为什么typeof null === 'object' string,String,object,Object,function,Function的关系 关于String类型与string类型的疑问 fun

数据的分类-JavaScript数据类型

JavaScript数据类型 1.数据类型是什么? 我们接触的绝大多数程序语言来说,把数据都进行了分类,包括数字.字符.逻辑真假:int,long,string,boolean....等等:我们都知道计算机对数据处理时是采用二进制的方式.将数据加载到内存中,并且通过CPU调度进行计算得到最终结果,那么,难道内存存储数据时会记录所以数据的类型吗?我认为答案是否定的,内存中的数据应该会根据所占内存的大小来进行区分和计算的,两种不同类型数据的计算,对于CPU来说只是调度了两个所占内存大小不一的数据来进

ArcGIS API for JavaScript中Symbol符号篇

ArcGIS API for JavaScript中Symbol简介: Symbol定义了arcgis中graphics图层内几何图形(geometry)的显示样式 ArcGIS API for JavaScript中Symbol分为四大类:继承关系如下图所示: 1.点符号(MarkerSymbol):点符号(point)的显示样式 2.线符号(LineSymbol):线符号(line)的显示样式 3.面符号(FillSymbol):面符号(polygon)的显示样式 4.文本符号(TextSy