ES6引入了一种新的原始数据类型,表示独一无二的值,最大的用处是作为对象属性的唯一标识符。至此,Javascript拥有6种基本数据类型和一种复杂数据类型。
基本类型
复杂类型
Symbol([description])
description 可选的描述,一般用在调试的时候作为区分,但是 不能用来访问Symbol。
该方法返回一个symbol值
let s = Symbol('test');
let s2 = Symbol('test');
let s3 = new Symbol('test'); // TypeError
console.log(s === s2); // false
console.log(typeof s); // symbol
console.log(s.description); // test
每次调用Symbol()返回的值都是独一无二的,不管描述是否一致。
Symbol不支持new调用
通过description属性可以获取到传入Symbol的描述性字符串
使用Symbol.for()可以创建全局单例的symbol值,语法如下:
Symbol.for([name])
name 可选的描述,建议传入,否则name会作为undefined传入
类似于单例模式,执行环境(一般是浏览器)内部维护了一个全局Symbol注册表,记录name和Symbol(name)关系
尝试通过name在该注册表查找对应symbol值,如果找到,则返回这个symbol值
如果没找到,则使用Symbol(name)创建一个symbol值,并记录该symbol值与name的关联关系,之后返回该symbol
const name = Symbol('name');
const name2 = Symbol.for('name');
const name3 = Symbol.for('name');
console.log(name === name2); // false
console.log(name2 === name3); // true
全局Symbol映射关系中name是作为字符串来使用的,结构类似下面的代码:
const globalSymbols = {
name: Symbol('name')
};
使用同样的字符串描述调用Symbol()和Symbol.for()获取到的symbol值不相等
使用Symbol.keyFor()可以检测给定的symbol值是否是全局单例的symbol(简单来说就是检测是否是Symbol.for()创建的),语法如下:
Symbol.keyFor(symbol)
const s = Symbol('s1');
const s2 = Symbol.for('s2');
console.log(Symbol.keyFor(s)); // undefined
console.log(Symbol.keyFor(s2)); // s2
Symbol类型的属性不会参与JSON的序列化
const name = Symbol('name');
const obj = {
[name]: 'xialei',
data: 1
};
console.log(JSON.stringify(obj)); // {"data": 1}
Symbol类型的属性不会出现在for ... in和for ... of循环中
const name = Symbol('name');
const user = {
[name]: 'xialei',
data: 1
};
for(let i in user) {
console.log(i, user[i]);
}
// 上述循环输出 data 1
for(let i of user) {
console.log(i, user[i]);
}
// TypeError: user不是可迭代对象
Symbol类型的属性不会出现在Object.keys()和Object.getOwnPropertyNames()返回结果中
const name = Symbol('name');
const user = {
[name]: 'xialei',
data: 1
};
console.log(Object.keys(user)); // ["data"]
console.log(Object.getOwnPropertyNames(user)); // ["data"]
Symbol类型的属性会出现在Object.Object.getOwnPropertySymbols()
const name = Symbol('name');
const user = {
[name]: 'xialei',
data: 1
};
console.log(Object.Object.getOwnPropertySymbols(user)); // [Symbol(name)]
const name = Symbol('1');
console.log(name + 1); // TypeError
console.log(Number(name)); // 创建包装对象
console.log(name + '1'); // TypeError
console.log(String(name)); // Symbol(1)
console.log(!!name); // true
console.log(Boolean(name)); // true
保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因,ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型
symbol是es6出的一种类型,他也是属于原始类型的范畴(string, number, boolean, null, undefined, symbol),symbol for这个东西是可共享,在创建的时候会检查全局是否寻在这个key的symbol.如果存在就直接返回这个symbol,如果不存在就会创建,并且在全局注册。
Symbols 是 JavaScript 最新推出的一种基本类型,它被当做对象属性时特别有用,但是有什么是它能做而 String 不能做的呢?在我们开始探索 Symbols 功能之前,我们先来看一下被很多开发者忽略 JavaScript 的特性。
Symbol是由ES6规范引入的一项新特性,它的功能类似于一种标识唯一性的ID。Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对
这是一种在ES6 中新添加的数据类型,Symbol 本质上是一种唯一标识符,可用作对象的唯一属性名,这样其他人就不会改写或覆盖你设置的属性值。
JavaScript标准中规定对象的key只能是 String 或 Symbol 类型,区别在于 String 类型的key可以重复而 Symbol 类型的key是唯一的。Symbol 的本质是表示一个唯一标识。每次创建一个Symbol,它所代表的值都不可能重复
记得刚找工作那会,几种数据类型是必问题,当时的答案一般都是七种——字符串(String)、数字(Number)、布尔(Boolean)、数组(Array)、对象(Object)、空(Null)、未定义(Undefined),时至今日,某些网络教程上还是这样的分类
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!