js Symbols类型

1.Symbols 是ECMAScript 2015新增的基本数据类型, (其他的基本数据类型是Undefined、Null、Boolean、Number 和 String)
let a = Symbol("1");
通过调用函数Symbol,传入字符串为参数,会返回一个Symbol类型的值
console.dir(typeof Symbols)  //function
console.dir(typeof a)        //symbol
console.dir(a)                 //Symbol(1)

2.可以理解为他是一种特殊的字符串,每一个Symbol变量的值是不同的,即使传入的字符串是一样的
let a = Symbol("1");
let b = Symbol("1");
a===b //false  (===类型相同,且值相同,但是同类型的Symbol变量值不同,它是唯一的)

3.现在我不想调用Symbol函数时,传的参数是字符串,我们测试一下
let a = Symbol(1);
console.dir(a);              //Symbol(1)
let a = Symbol([1,2,3]);
console.dir(a);              //Symbol(1,2,3)
let a = Symbol({a:1});
console.dir(a);              //Symbol([object Object])
所以可以看出来,参数如果不是字符串,他会被强制转化成字符串

3.他跟Number() 这些一样,可以理解为强制转化字符串为Symbols 类型

4.他不能被new ,虽然它是一个函数,但是按道理什么函数都可以被new,但是mdn上有一段话
围绕原始数据类型创建一个显式包装器对象从 ECMAScript 6 开始不再被支持。 然而,现有的原始包装器对象,如 new Boolean、new String以及new Number,因为遗留原因仍可被创建。
也就是说es6开始,不能用原始类型来new,但是前面的那些可以new出一个对象,是历史遗留问题

5.像字符串一样,symbol也可以被用做对象属性的键
也就是现在对象的属性名可以有两种了,一种是字符串,一种是symbols
let sym = Symbol();
let obj = { [sym]: "value" };
console.log(obj[sym]); // "value"
这里初始化对象,用中括号[] 扩住了一个变量,这是es6的对象扩展,详情见es6,大致说明一下,
中括号中的变量除了Symbol类型外,都会被强转成字符串,那就有一点就要注意,如果中括号中的变量是对象,
let a = {a:1};
let b = {b:1};
let c = {[a]:1,[b]:2};
console.log(c);     //[object Object]:2
你会发现对象中只有一个属性[object Object]值为2,因为无论什么对象被转成字符串时,都是[object Object],所以初始化c时,
被覆盖咯

6.我们来试一下,相同字符串创建的symbol和字符串作为key创建的对象会覆盖么
let a = Symbol("1");
let b = Symbol("1");
let c = "Symbol(1)";
let d = {
  [a]:1,
  [b]:2,
  [c]:3
};
console.log(d);        //Symbol(1):3Symbol(1):1Symbol(1):2
我们发现三个属性同名,但是都在,说明是不同的属性

7.关键是事情来了,我为什么要去查Symbol这个东西呢,是因为我在看map set 这些类型时,它说:
遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型。
具有iterable类型的集合可以通过新的for ... of循环来遍历。
那么我就问了,怎么看一个对象他是属于iterable类型呢,然后我就发现了Symbol.iterator,我打印出map,array找它的属性,我发现他们都有Symbol.iterator这个属性,Symbol.iterator这个东西干嘛用的呢,他是一个属性名,属性名类型是Symbol。
当一个对象实现了 Symbol.iterator 属性时,我们认为它是可迭代的。 一些内置 的类型 如 Array , Map , Set , String , Int32Array , Uint32Array 等都已 经实现了各自的 Symbol.iterator 。 对象上的 Symbol.iterator 函数负责返 回供迭代的值
for..of 会遍历可迭代的对象,调用对象上的 Symbol.iterator 方法。
(顺便讲一句,那为什么js要加入map这个东西呢)
JavaScript的对象有个小问题,就是键必须是字符串。但实际上Number或者其他数据类型作为键也是非常合理的。
为了解决这个问题,最新的ES6规范引入了新的数据类型Map

8.for in 无法遍历出symbol属性
for...in循环:只遍历对象自身的和继承的可枚举的属性。
Object.keys():返回对象自身的所有可枚举的属性的键名。
详情查看es6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值