关于Symbol的思考1

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())
运行结果如下

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值