ES2015之Symbol

375 阅读2分钟

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

Symbol

ES2015的标准增加了:Symbol即一种数据类型,这篇文章我们就来了解一下什么是Symbol

symbol 是一种基本数据类型 (私有数据类型)。Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法。

如何使用

判断

每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。为了更好的理解这句话,让我们看看下面的例子:

const sym = Symbol(12)

console.log(typeof sym, sym == 12, sym === 12); // symbol false false

console.log(Symbol('也笑')==Symbol('也笑')); // false

因为返回值是唯一的,所有哪怕是定义的参数相同,返回结果看着相同,但是返回结果也是不相同的。

for...in

Symbols 在 for...in 迭代中不可枚举,也就是说遍历的时候不能遍历到,如下:

var obj = {};

obj[Symbol("a")] = "a";
obj["c"] = "c";

for (var i in obj) {
   console.log(i); // c
}

上述obj虽然有两个属性,Symbol类型的属性是不能枚举的,所以只会输出:c

JSON.stringify()

当使用 JSON.stringify() 时,以 symbol 值作为键的属性会被完全忽略,使用如下:

JSON.stringify({[Symbol("foo")]: "foo"}); // {}

返回结果会把含有Symbol类型的属性忽略掉。

注意事项

我们需要注意的是:每个从Symbol()返回的symbol值都是唯一的,Symbol类型的数据作为键的属性的时候, for...in 与 JSON.stringify() 都会把这些属性忽略掉。

总结

因为Symbol的值是唯一的,所以我们在项目中可以定义一个私有的变量或者说不可更改的常量,以方便我们在项目中特定的使用。比如我们可以定义一些协商好的固定请求参数、标题名等

如果你想了解ES的其他特性,请移步到 ES2015+碎片化学习,每天都在向前走一步,这是所有文章的目录入口。