Symbol.Iterator简单理解-程序员宅基地

技术标签: javascript  

  1. symbol 是什么?
  2. Itertor是什么?
  3. symbol的内置符号symbol.Iterator,有什么用?

  4. 为什么会出现for..of?

  5. for..of怎么用?










首先symbol是es6新增的类型,它是一个基本类型,symbol英文翻译是符号的意思。

在叙述symbol之前,推出一个概念,“以操作目标为程序本身的行为特性的编程,我们称为元编程。”

我们已知symbol是es6新增类型,按照逻辑推演:作为新增的类型,symbol一定是为了弥补了之前的不足,所以才出现的,是这样的吗?

首先我们说说它的特别之处:

  1. symbol属性值对应的值是唯一的,这解决了命名冲突的问题,类似于id的作用。
  2. symbol值不能与其他数据进行计算,包括与字符串拼接。
  3. for/in ,for/of遍历时不会遍布symbol属性

这样看是不是觉得没什么特别的?最多也就弥补了命名冲突的问题。


下面推出第二个问题:

Iterotor是什么?

Iterator是一个遍历器的接口,是部署在数据结构上的,很多数据结构原生具备Iterator接口,这就意味着,我们不需要任何处理就可以使用for/of了,拥有symbol.Iterator属性返回的对象,都会在使用for/of时被当作Iterator接口当这个对象符合Iterator接口的标准时,for/of就可以完成任务,不符合就会报错!

刨除这个问题,我们知道symbol可以作为属性值存在。并且它具有唯一的特性,举个栗子:直接let s = Symbol();测试s就是Symbol类型了。怎么说他是唯一的呢?
let s = Symbol(); let ss = Symbol(); s == ss ; 结果是false;或者
let s = Symbol('a'); let ss = Symbol('a'); s == ss ; 结果是false

有人会好奇Symbol('a')里面的参数a又是怎么回事呢?字符串a表示一种修饰,对你当前创建的Symbol类型的一种修饰,作为区分使用,否则当你创建多个Symbol数据时,容易混淆。

现在我们回过头说Iterotor是symbol的内置符号,而字符串a是自定义的符号。

symbol的内置符号symbol.Iterator,有什么用?

这个符号可以是任意对象上的一个专门属性,语言机制会自动的在这个属性上寻找一个方法,这个方法会构造一个迭代器来迭代这个对象的值,这个方法就是next方法,...展开和for/of循环会自动使用它,我们可以自定义symbol.iterator属性为任意对象值定义自己的迭代器逻辑,他将覆盖默认的迭代器。相当于是定义了一种元编程行为,提供给Javascript其他部分(也就是运算符和循环结构)在处理定义的对象时使用。

  • 在Js中迭代器对象实现了可迭代协议,迭代器对象由Symbol.iterator属性的值返回。
  • Symbol.iterator属性的值是一个函数,它返回一个迭代器对象。
  • 迭代器指的是拥有next方法的对象。
  • 该next方法必须返回一个带有value和done的对象。

为什么会出现for..of?

为了理解条件语句,我们曾想象JavaScript解释器在源代码中会经过不同路径。而循环语句则是把这些路径弯曲又折回起点,以重复执行代码中的某部分。

es6定义了一个新循环语句:for/of。这种新循环虽然使用for关键字,但它们是完全不一同的两种循环,你说和for/in像不像?为什么?

for/of循环是专门用于可迭代对象的,什么是可迭代对象呢?

我们前文提到具有symbol.iterator属性的对象就是可以迭代的。而这个对象就是可迭代对象。

对象本身默认是不可迭代的。运行时尝试对常规对象使用for/of会抛出TypeError:

let o={x:1,y:2,z:3};
for(let element of o){//抛出TypeError,因为o不是迭代的对象
    console.log(element);
}

如果你想迭代对象,可以使用for/in循环,或者基于Object.keys()方法的结果使用for/of:

let o={x:1;y:2,z:3};
let keys="";
for(let k of Object .keys(o)){
    keys+=k;
}
console.log(keys) //x y z
/*这是因为Object.keys()返回一个对象属性名的数组,而数组是通过for/of来迭代的。也要注意,这种对象的键的迭代并不是实时的,在循环体内修改o不会影响迭代。如果你不在乎对象的属性,也可以像下面这样迭代每个键对应的值:
*/
let o={x:1;y:2,z:3};
let sum=0;
for(let v of Object .values(0)){
    sum+=v;
}
console.log(sum)
//6
如果你即想要对象的属性还想要属性的值,可以基于Object.entries()和解构赋值来使用for/of:
let pairs="";
for(let [k , v] of Object .entries(o)){
    pairs+=k + v;
}
console.log(pairs)//x 1 y 2 z 3
Object .entries()返回一个数组的数组,其中每个内部数组表示对象的一个属性的键值对。这里使用解构赋值把这些内部数组分开并且分别把它们的元素赋值给两个变量。

不知大家有没有学会使用for/of 循环。这里请注意字符串按照Unicode码点而不是UTF-16字符迭代的
for...of语法借鉴自C++、Java、C# 和 Python,作为用来遍历所有数据结构的统一方法。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_46525076/article/details/118632890

智能推荐

GBase8cGDCA认证模拟题题库(三)_如果需要打开delete语句的审计功能,需要开启下面哪个参数-程序员宅基地

文章浏览阅读720次,点赞20次,收藏6次。B 选项,在创建模式时,可以不指定模式名。C 选项,兼容模式可选值为 AB、C、PG.安装GBase 8c分布式集群时所需的配置文件gbase.yml,在解压GBase8cV5 S3.0.0BXX CentOS x86 64.tar.bz2压缩包生成的目录中得到。真值的有效文本值是: TRUE、t、"true'、y、yes'、"1'TRUE'、true、整数范围内1~2^63-1、整数范围内-1~-2^63。GBase 8c 使用create table 创建表时,不指定参数,默认是astore,行存表。_如果需要打开delete语句的审计功能,需要开启下面哪个参数

xml文件中几个名词_xml文件里面的名词-程序员宅基地

文章浏览阅读334次。1 xmlns是XML Namespaces的缩写,中文名称是XML(标准通用标记语言的子集)命名空间。 web-app是web.xml的根节点标签名称 version是版本的意思 xmlns是web.xml文件用到的命名空间 xmlns:xsi是指web.xml遵守xml规范 xsi:schemaLocation是指具体用到的schema资源_xml文件里面的名词

【OpenGL】中点圆、椭圆生成算法_用setpixel函数中点画圆算法代码c++-程序员宅基地

文章浏览阅读1.6w次,点赞12次,收藏69次。OpenGL 中点圆、椭圆生成算法_用setpixel函数中点画圆算法代码c++

HTML-CSS实现背景图片出现不同的位置_css背景图高度占据一半另一半有别的背景色-程序员宅基地

文章浏览阅读2.1k次。首先在HTML中写入div,命名为img,在这个div中加入一个span标签并命名为img-bg和img50(5星为50).<div class="img"> <span class="img-bg img50"></span> <span class="img-bg img45"></span> <span class="img-bg img40"></span> </div> 在css代码._css背景图高度占据一半另一半有别的背景色

altera CPLD通过nios在线升级_altera cpld 怎么在线升级-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏10次。一,生成hex文件逻辑工程的qsys编译好以后会生成sopcinfo文件,software里面首先generate bsp,然后编译software,编译完成后右键software->make targets build,选择mem_init_generate->build,然后就会生成hex文件二,生成sof文件重新编译整个逻辑工程,或者如果逻辑工程已经编译过了,仅仅更新nios,为了节省时间可以采用如下步骤:1,在quartus里面processing->update mem_altera cpld 怎么在线升级

interface详解_interface类中的方法定义-程序员宅基地

文章浏览阅读8.2k次,点赞13次,收藏68次。interface的定义:public interface 接口名{}interface的抽象方法:interface的默认方法:interface的静态方法:interface的常量定义和使用:interface之间的多继承:继承父类并实现多接口:_interface类中的方法定义

随便推点

Hadoop2.7.3下Mysql8.0下Hive2.3.8的安装_hive2.3.8安装-程序员宅基地

文章浏览阅读927次。hive安装前提:1.基于hadoop2.7的完全分布式集群搭建完成hadoop2.7集群搭建2.MySQL8.0安装完成 安装centos7上MySQL8.0Hive2.3.8的安装下载链接:https://mirrors.tuna.tsinghua.edu.cn/apache/下滑找到hive点击进去点击hive2.3.9(hive2.3.9和hive2.3.8差别不大)下载画红线的也就是bin.tar.gz后缀的hive解压安装下载完成后通过xftp传到虚拟机上(基操不在赘述)_hive2.3.8安装

The‘grub-efi-amd64-signed‘ package failed to install into /target/. Without the GRUB boot loader,_the grub-efiamd64-signed' package failed to instal-程序员宅基地

文章浏览阅读430次,点赞8次,收藏4次。在进行安装的时候有一个是否联网的选择,选择链接网络,则在安装的时候,可以看到在安装过程中,它会主动下载grub-efi-amd64-signed' package,确确实实,我在安装详情里看到了它有这个的download过程以及update过程。_the grub-efiamd64-signed' package failed to install intotarget without the g

从零开始用 Python 构建一个简单的神经网络_从零开始搭建神经网络-程序员宅基地

文章浏览阅读451次。n_learn_data = int ( n_samples * 0.8 ) # 80% 的可用数据点 learn_data , test_data = samples [: n_learn_data ], samples [ - n_learn_data :] learn_labels , test_labels = labels [: n_learn_data ], labels [ - n_learn_data :]_从零开始搭建神经网络

PAT乙级-题解(Java)_找工作pat乙级-程序员宅基地

文章浏览阅读1.4k次。我的题解放在github仓库了(喜欢的话,记得star哈)下面是汇总导航,如果你只想看其中某个题的话,点击题解直达。乙级的题目每个题都是一个有趣的故事,引导你去思考解决问题的能力,不是单纯的刷题。然后只涉及数组,循环,判断,字符串等基础编程语言语法的知识,不会设计复杂的算法与数据结构。一开始可能会有点吃力,正常,但是如果你全部刷完,leetcode上部分简单题对你来说是小case了。甲级主要是算法与数据结构,乙级刷完了,也可刷甲级, 甲级的题目特别好,测试用例丰富如果是急需找工作,面试的话刷lee_找工作pat乙级

XML语言和html区别,XML和HTML区别详解-程序员宅基地

文章浏览阅读5.8k次,点赞5次,收藏23次。2.xml不是HTML的替代品,xml和html是两种不同用途的语言。XML和HTML的目标不同HTML的设计目标是显示数据并集中于数据外观,而XML的设计目标是描述数据并集中于数据的内容。HTML(HyperTextMark-upLanguage)即超文本标记语言,是WWW的描述语言,1989年,HTML诞生,它抛弃了SGML复杂庞大的缺点,继承了SGML的很多优点。4.对于XML最好的形容可能是XML是一种跨平台的,与软、硬件无关的,处理与传输信息的工具。而xml没有固有的标记。..._xml和html

生活程序作为一个程序猿怎么缓解现实的压力-程序员宅基地

文章浏览阅读72次。查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧! 生活中,压力无处不在。工作压力、失业压力、心理压力、精神压力……解一种压力无不困扰肴我们的排一根神经。谁都逃走不掉,谁也躲避不了。 压力就像小提琴的一根弦.没有压力、就不会发生音乐。但足如果弦绷得太紧就会断掉。你需要将球力控制在适当的水平—使压力的强度能够与你的...

推荐文章

热门文章

相关标签