symbol是一种基本的数据类型。Symbol()函数会返回symbol类型的值,该类型具有静态和静态方法。
它的静态属性会暴露几个内建的成员对象;它的静态方法会暴漏全局的symbol注册,且类似于内建对象类,但作为构造函数来说是不完整的 因为它不支持语法 " new Symbol()"
每个从Symbol返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。
symbol参数是可选的,可以用于调试 但是不能访问symbol本身
描述
var sym1 = Symbol();
var sym2 = Symbol("foo")
var sym3 = Symbol("foo")
上面的代码创建了三个新得symbol。Symbol(“foo”)不会强制将字符串"foo"转换成symbol类型。它每次都会创建一个新的symbol类型。
Symbol("foo") === Symbol("foo"); //false
下面带有new运算符的语法将抛出TypeError错误
var sym = new Symbol(); //TyoeError
这会阻止创建一个显示的Symbol包装器对象而不是一个Symbol值。围绕原始数据创建类型创建一个显示包装器对象对ECMAScript6 开始不再支持,然而 现有的原始包装对象,比如 new Function new String 因为遗留原因仍可以创建。
如果非要创建一个Symbol包装器对象 可以使用Object()函数
var sym = Symbol("foo");
typeof sym; //"Symbol"
var symObj = Object(sym);
typeof symObj;
众所周知的symbol
除了自己创建的symbol JavaScript还内建了一些在ecmascript5之前没有暴漏给开发者的symbol 他们代表了内部语言的行为。他们可以使用一些属性访问
比如
但是object没有实现Symbol.iterator方法,下面补充;
迭代symbol
Symbol.iterator
一个返回对象默认迭代器的方法。被for…of…使用
补充
如上图所示,Object没有实现Symbol.iterator方法 那就不能用for of循环对象,但是如果我们要用for of 来循环Object呢,那么先要实现Symbol.iterator方法在object上
var obj = {
0: 'arthur',
1: '5',
length: 2,
[Symbol.iterator]: Array.prototype[Symbol.iterator]
}
for (const item of obj) {
console.log(item);
}
或者是
var obj = {
name: "arthur",
age: 18,
sex: "Man"
}
Object.defineProperty(obj, Symbol.iterator, {
value: function() {
var that = this;
var index = -1;
var lists = Object.keys(that);
var len = lists.length;
return {
next: function () {
index++;
return {
value: that[lists[index]],
done: index+1 > len
}
}
}
}
});
for (const item of obj) {
console.log("item", item);
};
这样使得对象也可以是使用for of 来循环。上面有说 什么是Symbol.itrerator,那么不得不说一个概念
迭代器:个人理解这玩意器就是一个具有next方法的对象,再每次调用next的时候都会返回结果对象,在结果对象中具备2个属性。value和done. value是当前的值,done表示遍历是否结束,true表示结束,false表示未结束,
ES5实现一个基本的迭代器
function makeNewInterator (item) {
let i = 0;
return {
next: function() {
var value = done ? undefined : item[i++];
var done = i >= item.length;
return {
value: value,
done: done
}
}
}
}
var newIterator = makeNewInterator ([1,2,3]);
console.log("newIterator ", newIterator.next())
console.log("newIterator ", newIterator.next())
console.log("newIterator ", newIterator.next())
console.log("newIterator ", newIterator.next())
运行结果如下