首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JavaScript 权威指南第七版(GPT 重译)(五)

关于这一点的棘手之处在于,可迭代对象迭代器方法没有传统的名称,而是使用符号Symbol.iterator作为其名称。...要使类可迭代,必须实现一个方法,其名称为符号Symbol.iterator。该方法必须返回具有next()方法的迭代对象。...对于典型的迭代器和生成器,如果value属性被定义,则done属性未定义或为false。如果done为true,则value为未定义。...可迭代对象是可以与for/of循环一起使用的对象。它定义了一个符号名称为Symbol.iterator的方法。该方法返回一个迭代对象。...如果一个属性不可配置,你就无法改变它的可配置或可枚举属性。 如果一个访问器属性不可配置,你就无法更改其 getter 或 setter 方法,也无法将其更改为数据属性

16910
您找到你想要的搜索结果了吗?
是的
没有找到

一文了解 ES6 中独一无二的 Symbol 类型

它是一种不可变且唯一的数据类型,可以用来创建独一无二的键(key)。 Symbol 的创建方式是通过调用全局的 Symbol() 函数来生成。...例如,可以使用 Symbol.iterator 创建一个自定义迭代器,通过遍历符号属性来处理对象迭代。...迭代器和可迭代对象:通过使用内置的 Symbol.iterator 属性,可以为对象创建自定义的迭代器,实现可迭代对象的遍历。...无法遍历: Symbol 作为属性名时,无法通过常规的属性遍历方法(如 for...in 循环)获取到。如果需要遍历对象属性,就不能使用 Symbol 作为属性名。 2....不可序列化: Symbol 值不能被 JSON.stringify() 序列化,也不能作为对象的键值传递给其他线程或进程。 五.

36811

《你不知道的JavaScript》:迭代器Iterator的背景梳理

ES6中规定对象Symbol.iterator属性指向该对象的默认迭代器方法,当对象进行for...of..遍历迭代时,会调用对象Symbol.iterator方法,返回该对象的默认迭代器。...Symbol.iterator属性本身是一个函数,就是当前数据结构默认的迭代器生成函数。执行这个函数,就去返回一个迭代器。...注意对象Object没有Symbol.iterator属性,也就是说没有部署迭代器接口。...从ES6开始,从一个iterable中提取迭代器的方法是:iterable必须支持一个函数,其名称是专门的ES6符号Symbol.iterator。调用这个函数时,它会返回一个迭代器。...for..of循环会自动调用它的Symbol.iterator函数来构建一个迭代器。当然也可以手工调用这个Symbol.iterator函数,然后使用它返回的迭代器。

90510

JavaScript 高级程序设计(第 4 版)- 集合引用类型

# Object 显示创建方法 使用 new 操作符和 Object 构造函数 使用对象字面量,对象定义的简写形式,目的是为了简化包含大量属性对象的创建 可以通过点语法或中括号来存取属性 # Array...,可接受第二个参数,用于指定断言函数内部this的值 迭代方法 迭代方法接收两个参数:以每一项为参数运行的函数,可选的作为函数运行上下文的作用域对象 传入每个方法的函数接受三个参数:数组元素,元素索引和数组本身...符号属性,因此可以通过for..of循环和扩展操作符来操作 # 合并、复制和修改定型数组 定型数组同样使用数组缓冲来存储数据,而数组缓冲无法调整大小,故以下方法不适用于定型数组 concat() pop...,因此这个对象键不会成为垃圾回收的目标 // 如果调用了removeReference(),就会摧毁键对象的最后一个引用,垃圾回收程序就可以吧这个键值对清理掉 # 不可迭代键 因为WeakMap中的键值对任何时候可能被销毁...# 顺序与迭代 Set会维护值插入时的顺序,因此支持按顺序迭代 集合实例提供一个迭代器,能以插入顺序生成集合内容,可以通过values()及其别名方法keys()(或者Symbol.iterator属性

658100

ES6--Set、Map、Symbol、Proxy及Reflect

WeakSet的成员只能是对象;WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet中对象的引用,其意味着WeakSet不可遍历、不会引发内存泄漏。...Symbol出现之前,我们会经常遇到多个不相同的库操作的DOM属性相同,导致第三方库无法正常运行。Symbol解决了“对象属性名都是字符串、数字,这容易造成属性名的冲突”的问题。...var s1 = Symbol.for("foo"); Symbol.keyFor(s1) // "foo" 常用Symbol值 (1)Symbol.iterator @@iterator用于为对象定义一个方法并返回一个属于所对应对象迭代器...Symbol.match属性,指向一个函数。...(注意,ES5无法模拟该特性)。 元编程重点在于:在一个程序的内容、运行环境、配置等都不做任何修改的情况下,可以通过其他程序对其进行读取或修改。

77731

【ES6基础】迭代器(iterator)

新的数组方法和新的集合类型(如Set集合与Map集合)都依赖迭代器的实现,这个新特性对于高效的数据处理而言是不可或缺的,在语言的其他特性中也都有迭代器的身影:新的for-of循环、展开运算符(...)...迭代器iterator是一个object,这个object有一个next函数,该函数返回一个有value和done属性的object,其中value指向迭代序列中当前next函数定义的值。...迭代器协议: iterator协议定义了产生value序列的一种标准方法。只要实现符合要求的next函数,该对象就是一个迭代器。相当遍历数据结构元素的指针,类似数据库中的游标。...对象必须实现@@iterator方法,意味着对象必须有一个带有@@iterator key的可以通过常量Symbol.iterator访问到的属性。...可迭代协议 根据可迭代协议,对象需要提供@@iterator方法; 也就是说,它必须将Symbol.iterator符号作为属性键。 @@iterator方法必须返回迭代对象

83150

揭秘ES6的迭代

为了变成可迭代对象, 一个对象必须实现 @@iterator 方法, 意思是这个对象(或者它原型链 prototype chain 上的某个对象)必须有一个名字是 Symbol.iterator属性...说的云山雾罩的,简单总结: 1、迭代器就是满足迭代器协议的对象 2、迭代对象的原型上必须有一个@@iterator 方法。 3、这个方法可以被对象上的Symbol.iterator属性访问到。...4、被迭代时,@@iterator方法被调用并且无参数,返回一个迭代器,这个迭代器上有一个next方法 5、next方法执行会便利其属性,返回一个对象对象属性有value,done为false一直遍历,...5、能被for of 循环的就是迭代器。 可迭代对象的必须存在[Symbol.iterator]方法,该方法一个无参函数,返回迭代器协议的对象。...迭代对象包含一个next()函数,该函数返回值有两种: 如果迭代未结束,返回如下 return { value: 'item', // item是本次迭代值,可以为任意对象 done: false

38251

Symbol.iterator和Symbol.asyncIterator

注:Symbol 函数不允许通过 new 的方式调用Symbol的作用是什么?因为每一个 symbol 的值都是唯一的,所以不会出现重复的现象,所以symbol 类型的值可以作为对象属性标识符使用。...Symbol.iteratorSymbol.iterator 为每一个对象定义了默认的迭代器。该迭代器可以被 for...of 循环使用,当我们需要遍历一个对象的时候,iterator函数就会被调用。...那什么是迭代器呢?迭代器就是为实现对不同集合进行统一遍历操作的一种机制,在es6中有三类结构生来就具有Iterator属性:数组、类数组对象、Map和Set结构。...Symbol.iterator是如何实现遍历的呢?...Symbol.asyncIteratorSymbol.asyncIterator 符号用于标识一个异步迭代器,作用与 Symbol.iterator 相同,但产生的值期待为 Promise 实例,该异步迭代器被

14420

《你不知道的JavaScript》-- 对象(笔记)

无论返回值是什么类型,每次访问对象属性就是属性访问,如果属性访问返回的是一个函数,那它也并不是一个“方法”。属性访问返回的函数和其他函数没有任何区别(除了可能发生的隐式绑定this)。...这个方法是应用在对象上的级别最高的不可变性,它会禁止对对象本身以及任意直接属性的修改(这个对象引用的其他对象不受影响)。...在ES5中可以使用getter和setter部分改写默认操作,但是只能应用在单个属性上,无法应用在整个对象上。...ES6增加了一种用来遍历数组的for...of方法,可以直接遍历值,首选会向被访问对象请求一个迭代对象,然后通过调用迭代对象的next()方法来遍历所有返回值。...,而是一个返回迭代对象函数,调用迭代器的next()方法会返回形式为 {value: ... , done: ...}的值,value是当前的遍历值,done是一个布尔值,表示是否还是可以遍历的值。

62420

ES6之Iterator

主要提供for of 循环 其实Iterator迭代对象本质就是可以使不可迭代对象变成可迭代对象。...通俗的讲,迭代器协议要求符合以下条件: 首先,它是一个对象 其次,这个对象包含一个无参函数 next 最后,next 返回一个对象对象包含 done 和 value 属性。...: 属性 值 必选 [Symbol.iterator] 返回一个对象的无参函数,被返回对象符合迭代器协议 Y 如果让一个对象是可遍历的,就要遵守可迭代协议,该协议要求对象要部署一个以 Symbol.iterator...自定义可迭代 满足可迭代协议。 存在[Symbol.iterator]属性。 满足迭代器协议。 [Symbol.iterator]属性要求返回一个可迭代对象。...(函数内部闭包) 使用Generator实现[Symbol.iterator],天然配合Generator和yield关键字进行生成可迭代对象

21220

可以迭代大部分数据类型的 for…of 为什么不能遍历普通对象

for...of语句在可迭代对象上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句。...// iterable:一个具有可枚举属性并且可以迭代对象。...; for...of 不考虑构造函数原型上的不可枚举属性(或者说for...of语句遍历可迭代对象定义要迭代的数据。)...实际上,任何具有 Symbol.iterator 属性的元素都是可迭代的。我们可以简单查看几个可被for of迭代对象,看看和普通对象有何不同: ? ? ?...简单来说,for of 语句创建一个循环来迭代迭代对象,可迭代对象内部实现了Symbol.iterator方法,而普通对象没有实现这一方法,所以普通对象不可迭代的。

1.1K30

JavaScript 编程精解 中文第三版 六、对象的秘密

当我声称属性名称是字符串时,这并不完全准确。 他们通常是,但他们也可以是符号(symbol)。 符号是使用Symbol函数创建的值。...这意味着它有一个以Symbol.iterator符号命名的方法(由语言定义的符号值,存储为Symbol符号的一个属性)。...只有Symbol.iterator是一个实际的符号,它可能被添加到不同的大量对象中。 我们可以直接使用这个接口。...如果你不清楚接口的确切形式,请参阅本章前面迭代器接口的章节。 如果你使用数组来表示分组的成员,则不要仅仅通过调用数组中的Symbol.iterator方法来返回迭代器。...你将无法再调用该方法,因为对象属性隐藏了方法值。 你能想到一种方法,对拥有自己的同名属性对象,调用hasOwnProperty吗?

1.7K60

对象解构与迭代器的猫腻?

直接报错:{(intermediate value)(intermediate value)} is not iterable翻译过来就是值是不可迭代的,这是为什么呢?...因为右边的值是不可迭代对象迭代对象什么是可迭代对象?可迭代对象就是满足 可迭代协议 的对象。...可迭代协议 中必须有这么一个属性Symbol.iterator,一个无参数的函数,其返回值为一个符合 可迭代协议 的对象,即迭代器。数组解构数组可以解构,因为数组是一个可迭代对象。...因为对象的解构过程是这样的:创建对象 -> 枚举属性(OwnPropertyKeys) -> 复制属性,跟迭代器没关系。...,问题就好解决了,我们只需要在对象的原型上也添加一个 Symbol.iterator 属性就可以了:Object.prototype[Symbol.iterator] = function () { return

8810

再看JavaScript,那些遗漏或易混淆的知识点(2)

使用 for...of 进行迭代 Symbol.iterator 使用 Symbol.iterator对象添加可迭代功能 let range = { from: 1, to: 5 };...相反,是通过调用 range[Symbol.iterator]() 创建了另一个对象,即所谓的“迭代器”对象,并且它的 next 会为迭代生成值。...技术上来说,可迭代对象必须实现 Symbol.iterator 方法。 obj[Symbol.iterator]() 的结果被称为 迭代器(iterator)。由它处理进一步的迭代过程。...字符串迭代器能够识别代理对(surrogate pair)。(译注:代理对也就是 UTF-16 扩展字符。) 有索引属性和 length 属性对象被称为 类数组对象。...跟 Set 一样,WeakSet 支持 add,has 和 delete 方法,但不支持 size 和 keys(),并且不可迭代

88310

【云+社区年度征文】再看JavaScript,那些遗漏或易混淆的知识点(2)

使用 for...of 进行迭代 Symbol.iterator 使用 Symbol.iterator对象添加可迭代功能 let range = { from: 1, to: 5 };...相反,是通过调用 range[Symbol.iterator]() 创建了另一个对象,即所谓的“迭代器”对象,并且它的 next 会为迭代生成值。...技术上来说,可迭代对象必须实现 Symbol.iterator 方法。 obj[Symbol.iterator]() 的结果被称为 迭代器(iterator)。由它处理进一步的迭代过程。...字符串迭代器能够识别代理对(surrogate pair)。(译注:代理对也就是 UTF-16 扩展字符。) 有索引属性和 length 属性对象被称为 类数组对象。...跟 Set 一样,WeakSet 支持 add,has 和 delete 方法,但不支持 size 和 keys(),并且不可迭代

78400

Vue开发中常用的ES6新特性

for..in将获得数组/对象中的属性,而for..of将获得实际想要迭代的数据。 Iterable 可迭代对象是实现可迭代协议的任何对象。...为了创建一个可迭代对象,实际上实现了两个协议,iterable协议和iterator协议。 为了满足作为可迭代对象的要求,需要一个名为[Symbol.iterator]的方法。...首先,Symbol.iterator 一个内置的符号值,而Symbol是ES6中用于创建唯一标签/标识符的基本类型。 其次,包装属性键的方括号使它成为一个动态计算的键。这里的关键是表达式符号。...现在仍然需要处理迭代器协议来创建可迭代对象,因为必须从 [Symbol.iterator] 函数返回一个迭代迭代器协议更简单。...如果没有其他的对WeakSet中对象的引用,那么这些对象会被当成垃圾回收掉。这也意味着WeakSet中没有存储当前对象的列表。正因为这样,WeakSet 是不可枚举的。

1.3K10

Node.js 中的异步生成器和异步迭代

乍一看,似乎使生成器函数异步也意味着它生成的生成器是不可迭代的。这有点令人困惑,因为生成器的目的是生成“以编程方式”可迭代对象。 接下来搞清楚到底发生了什么。...当对象具有 next 方法时,该对象将实现迭代器协议,并且该 next 方法返回带有 value 属性,done 属性之一或同时带有 value 和 done 属性对象。...,next 方法需要返回带有 value 和 done 属性对象。...这种行为使得 async 函数的生成器无法实现 javascript 迭代协议。 异步迭代 幸运的是有办法解决这个矛盾。...一个 AsyncGenerator 对象满足所有这些条件。 这就留下了一个问题——我们怎样才能遍历一个不可迭代但可以异步迭代对象

1.7K30
领券