ES6 Symbol 数据类型
ES6-Symbol 类型
ES5 除类数组对象(类数组对象名可以为数字,对象必须有 length 属性,可以用数组下标的方式访问对象属性,但不能通过点的方式访问)外,对象属性名都是字符串,这很容易造成属性名的冲突。而且 JavaScript 是弱类型语言,属性名冲突不会报错,处于代码执行顺序后面的属性值会覆盖前面的属性值(属性值容易被篡改),这样对象的属性就不能保证是我们想要的。
ES6 引入了Symbol数据类型很好地解决了对象属性名冲突的问题。
Symbol表示 独一无二的值 ,它是原始数据类型,不能用 new
ES6之后JavaScript就有了7种数据类型,分别是:Number 、String 、Boolean 、null 、undefined 、Object 、Symbol
基本用法
Symbol 函数栈不能用 new 命令,因为 Symbol 是原始数据类型,不是对象。可以接受一个字符串作为参数,为新创建的 Symbol 提供描述,用来显示控制台或者作为字符串的时候使用,便于区分。
let name = Symbol('name'); console.log(name); // Symbol(name); console.log(typeof name); // "symbol"特点
Symbol 函数栈不能用 new 命令,因为 Symbol 是原始数据类型,不是对象;
Symbol 表示独一无二的值,因此带有相同参数的两个 Symbol 值也不相等;
Symbol 应用场景
用 Symbol 声明的对象名不能用 key.value 的形式获取对象的属性值,要用 [ ],原因:
1. ES5中对象 .(点) 运算符获取的属性名是字符串, 用 key.value 的形式会将属性名识别为字符串,新建一个属性名给对象,无法和 Symbol 属性区别
2. 方括号中带双引号的属性名表示字符串属性,不带双引号的属性名表示 Symbol 属性,一次区别二者
Symbol的方法
作用:用于将描述相同的 Symbol 变量指向同一个 Symbol 值
let a1 = Symbol.for('a');let a2 = Symbol.for('a');a1 === a2 // truetypeof a1 // "symbol"typeof a2 // "symbol"let a3 = Symbol('a');a1 === a3 // false- Symbol() 和 Symbol.for() 的相同点:
- 它们定义的值类型都为 “Symbol”;
- Symbol() 和 Symbol.for() 的不同点:
- Symbol() 定义的值每次都是新建,即使描述相同值也不相等;
- Symbol() 定义的值会先检查给定的描述是否已经存在,如果不存在才会新建一个值,并把这个值登记在全局环境中供搜索,Symbol.for() 定义相同描述的值时会被搜索到,描述相同则他们就是一个值。
作用:用来检测该字符串参数作为名称的 Symbol 值是否已被登记,返回一个已登记的 Symbol 类型值的 key
let a1 = Symbol.for('a'); Symbol.keyFor(a1); // "a" let a2 = Symbol('a'); Symbol.keyFor(a2); // undefined// a1已经用Symbol.for()登记过,因此返回的key为"a",而a2没有被登记,因此返回undefinedSymbol的属性
description用于返回 Symbol 数据的描述
// Symbol() 定义的数据 let a = Symbol('acc'); console.log(a.description); // "acc" Symbol.keyFor(a); // undefined// Symbol.for() 定义的数据 let a1 = Symbol.for('acc'); console.log(a1.description); // "acc" Symbol.keyFor(a1); // "acc"// 未指定描述的数据 let a2 = Symbol.(); console.log(a1.description); // undefineddescription属性和Symbol.keyFor()方法的区别是:description 能返回所有 Symbol 数据类型的描述,而 Symbol.keyFor() 只能返回 Symbol.for() 在全局注册过的描述。
总结
以上是生活随笔为你收集整理的ES6 Symbol 数据类型的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 如何突破JAVA程序员的分水岭
- 下一篇: %d 跟%i 的区别以及scanf和ss