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

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

关于这一点的棘手之处在于,可迭代对象迭代器方法没有传统的名称,而是使用符号Symbol.iterator作为其名称。...它异步读取指定的文件,然后调用回调。如果文件成功读取,它将文件内容作为第二个回调参数传递。如果出现错误,它将错误作为第一个回调参数传递。...可迭代对象是可以与for/of循环一起使用对象。它定义了一个符号名称为Symbol.iterator的方法。该方法返回一个迭代对象。...Reflect.deleteProperty(o, name) 函数从对象o中删除具有指定字符串或符号名称的属性,如果成功(或不存在此属性),则返回true,如果无法删除属性,则返回false。...Reflect.ownKeys(o) 函数返回对象o的属性名称的数组,如果o不是对象则抛出 TypeError。返回的数组中的名称将是字符串和/或符号

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

ES6 中的 Symbol 是什么?

想想吧,我们为了起一个漂亮的、符合语义规则的属性名而绞尽脑汁的痛苦,还要承受属性名可能冲突的折磨,那是一段不堪回首的往事!...下面带有 new 运算符的语法将抛出 TypeError 运算符的语法将抛出错误: var sym = new Symbol(); // TypeError 特性 正如歌词“每个人都有他的脾气”所说,Symbol...拥有 Symbol.iterator 函数的对象被称为 可迭代对象 ,就是说你可以在对象使用 for/of 循环。...假设不用 Symbol.iterator ,可迭代对象需要有一个字符串属性名 'iterator',就像下面这个可迭代对象的类: class MyClass { constructor (obj...由于 sysmbol 无法在 JSON 里表示,因此不用担心给 Express API 传入带有不合适的 Symbol.iterator 属性的数据。

80110

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

Error对象很少在代码中显示创建,一般是在抛出异常被自动创建,也可以使用new Error(...)这种构造形式来创建。...在创建普通属性属性描述符会使用默认值,也可以使用Object.defineProperty(..)来添加一个新属性或者修改一个已有属性并对特性进行设置: var myObject = {}; Object.defineProperty...= 3; console.log(myObject.b);//undefined 在非严格模式下,创建属性b会静默失败;在严格模式下,将会抛出TypeError错误。...在ES5中可以使用getter和setter部分改写默认操作,但是只能应用在单个属性上,无法应用在整个对象上。...,也可以直接在定义对象进行声明: var myObject = { a: 2, b: 3, [Symbol.iterator]: function(){ //.

63620

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

# Object 显示创建方法 使用 new 操作符和 Object 构造函数 使用对象字面量,对象定义的简写形式,目的是为了简化包含大量属性对象的创建 可以通过点语法或中括号来存取属性 # Array...如果无法转换,则抛出错误 # 定型数组 定型数组是另一种形式的ArrayBuffer视图。...符号属性,因此可以通过for..of循环和扩展操作符来操作 # 合并、复制和修改定型数组 定型数组同样使用数组缓冲来存储数据,而数组缓冲无法调整大小,故以下方法不适用于定型数组 concat() pop...Object的类型,尝试使用对象设置会抛出TypeError。...()及其别名方法keys()(或者Symbol.iterator属性)取得这个迭代器 values()是默认迭代器,可以直接对集合实例使用扩展操作,把集合转换为数组 集合的entries()方法返回一个迭代

661100

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

; for...of 不考虑构造函数原型上的不可枚举属性(或者说for...of语句遍历可迭代对象定义要迭代的数据。)...for of 迭代 前面我们有提到一个词叫“可迭代”数据结构,当用for of迭代普通对象,也会报一个“not iterable”的错误。...实际上,任何具有 Symbol.iterator 属性的元素都是可迭代的。我们可以简单查看几个可被for of迭代对象,看看和普通对象有何不同: ? ? ?...简单来说,for of 语句创建一个循环来迭代迭代对象,可迭代对象内部实现了Symbol.iterator方法,而普通对象没有实现这一方法,所以普通对象不可迭代的。...而 iterator 的遍历过程,则是类似 Generator 的方式,迭代不断调用next方法,返回一个包含value(值)和done属性(标识是否遍历结束)的对象

1.1K30

迭代器与 for of的使用和原理

(比如错误使用其他循环中的变量),ES6 提供了迭代器和 for of 循环共同解决这个问题。...迭代器 所谓迭代器,其实就是一个具有 next() 方法的对象,每次调用 next() 都会返回一个结果对象,该结果对象有两个属性,value 表示当前的值,done 表示遍历是否结束。...其实模拟实现 for of 也比较简单,基本就是通过 Symbol.iterator 属性获取迭代对象,然后使用 while 遍历一下: function forOf(obj, cb) { let...,但有的时候不仅需要使用值还需要使用索引,ES6 为数组、Map、Set 集合内建了以下三种迭代器: entries() 返回一个遍历器对象,用来遍历[键名, 键值]组成的数组。...,如果没有正常的迭代完成,并且迭代器有 return 方法,就会执行该方法。

1.4K30

JavaScript 异步编程

catch方法作为错误的回调,不推荐使用then方法的第二个参数作为错误回调,原因如下: 当我们在收到正确的回调又返回一个Promise对象但是在执行过程中出现错误,而这时无法收到错误回调的。...//promise => 出现异常的Promise对象 }) 一般不推荐使用,应该在代码中明确捕获每一个可能的异常,而不是丢给全局处理 Promise 的静态方法 //一个成功状态的Promise...「迭代器」 ❝for...in : 以原始插入的顺序迭代对象的可枚举属性for...of : 根据迭代对象迭代器具体实现迭代对象数据 可迭代对象 - 实现了[Symbol.iterator]方法数组结构有...//for...in : 以原始插入的顺序迭代对象的可枚举属性 //for...of : 根据迭代对象迭代器具体实现迭代对象数据 可迭代对象 - 实现了[Symbol.iterator...): ƒ values() console.dir(obj);//没有Symbol.iterator方法 //如果要对象使用for of需要加一个属性 自定义迭代器 obj

1.2K10

【JS】230-迭代器与 for of的使用和原理

(比如错误使用其他循环中的变量),ES6 提供了迭代器和 for of 循环共同解决这个问题。...迭代器 所谓迭代器,其实就是一个具有 next() 方法的对象,每次调用 next() 都会返回一个结果对象,该结果对象有两个属性,value 表示当前的值,done 表示遍历是否结束。...is not iterable 我们直接 for of 遍历一个对象,会报错,然而如果我们给该对象添加 Symbol.iterator 属性: const obj = { value: 1 }...其实模拟实现 for of 也比较简单,基本就是通过 Symbol.iterator 属性获取迭代对象,然后使用 while 遍历一下: function forOf(obj, cb) { let...,如果没有正常的迭代完成,并且迭代器有 return 方法,就会执行该方法。

88041

ES6 系列之迭代器与 for of

(比如错误使用其他循环中的变量),ES6 提供了迭代器和 for of 循环共同解决这个问题。...迭代器 所谓迭代器,其实就是一个具有 next() 方法的对象,每次调用 next() 都会返回一个结果对象,该结果对象有两个属性,value 表示当前的值,done 表示遍历是否结束。...is not iterable 我们直接 for of 遍历一个对象,会报错,然而如果我们给该对象添加 Symbol.iterator 属性: const obj = { value: 1 }...for of 也比较简单,基本就是通过 Symbol.iterator 属性获取迭代对象,然后使用 while 遍历一下: function forOf(obj, cb) { let iterable...,如果没有正常的迭代完成,并且迭代器有 return 方法,就会执行该方法。

48810

前端异步代码解决方案实践(二)

但还存在一处细节,如果 Promise 完成后调用 onResolved 查看结果出现异常错误会怎么样呢?...接续上文,篇文章主要阐述 迭代器相关、Generator Function 语法、yield操作符、异步场景使用、常用自动执行器、Babel转译等。...对比迭代器,循环语句语法简单,但是如果要处理多个循环嵌套则需要设置跟踪多个索引变量,代码复杂度会大大增加。迭代器的出现一定程度能消除这种复杂性,减少循环中的错误。...为了变成可迭代对象,一个对象必须实现 @@iterator 方法, 可以在这个对象(或者原型链上的某个对象)设置 Symbol.iterator 属性,其属性值为返回一个符合迭代器协议对象的无参函数。...简而言之,可迭代对象必须满足可迭代协议有 Symbol.iterator 方法, Symbol.iterator 方法返回符合迭代器协议对象,包含 next 方法。

3.3K60

揭秘ES6的迭代

为了变成可迭代对象, 一个对象必须实现 @@iterator 方法, 意思是这个对象(或者它原型链 prototype chain 上的某个对象)必须有一个名字是 Symbol.iterator属性...说的云山雾罩的,简单总结: 1、迭代器就是满足迭代器协议的对象 2、迭代对象的原型上必须有一个@@iterator 方法。 3、这个方法可以被对象上的Symbol.iterator属性访问到。...4、被迭代,@@iterator方法被调用并且无参数,返回一个迭代器,这个迭代器上有一个next方法 5、next方法执行会便利其属性,返回一个对象对象属性有value,done为false一直遍历,...} 下面是提供迭代器的示例: const obj = { name: 'xialei', id: 1, [Symbol.iterator]: function () { // 迭代属性...obj也可以使用for...of遍历。

38551

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

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

1.7K30

【ES6基础】Symbol介绍:独一无二的值

这种情况下就很有可能会出现两个第三方库都无法正常运行的现象,而使用这些第三方库的开发者却难以进行定位和修复。 针对上述问题, Symbol可以提供一种良好的解决方案。...Symbol作为对象的Key值,具有私有性,我们无法通过枚举获取Key值,如下段代码所示: let obj = { weChatName:'前端达人', regYear: 2014,...1、Symbol.iterator 我们可以使用Symbol.iterator来自定义一个可以迭代对象,我们可以使用Symbol.iterator作为方法名的方法属性,该方法返回一个迭代器(Iterator...,该迭代状态有两个属性,如表格所示: 定义项 描述 含义 done Boolean 该迭代器是否已经迭代结束 value Any 当前迭代状态值 以下是我们使用Symbol.iterator迭代的方法...虽然我们可以重写toString()方法来自定义对象在隐式转换成字符串的处理,但是如果出现需要转换成数字变得无从入手。

54410

【ES6基础】Symbol介绍:独一无二的值

这种情况下就很有可能会出现两个第三方库都无法正常运行的现象,而使用这些第三方库的开发者却难以进行定位和修复。 针对上述问题, Symbol可以提供一种良好的解决方案。...Symbol作为对象的Key值,具有私有性,我们无法通过枚举获取Key值,如下段代码所示: let obj = { weChatName:'前端达人', regYear: 2014,...1、Symbol.iterator 我们可以使用Symbol.iterator来自定义一个可以迭代对象,我们可以使用Symbol.iterator作为方法名的方法属性,该方法返回一个迭代器(Iterator...,该迭代状态有两个属性,如表格所示: 定义项 描述 含义 done Boolean 该迭代器是否已经迭代结束 value Any 当前迭代状态值 以下是我们使用Symbol.iterator迭代的方法...虽然我们可以重写toString()方法来自定义对象在隐式转换成字符串的处理,但是如果出现需要转换成数字变得无从入手。

87870

8个问题看你是否真的懂 JS

6、我们能否以某种方式为下面的语句使用展开运算而不导致类型错误 var obj = { x: 1, y: 2, z: 3 }; [...obj]; // TypeError 答案:会导致TypeError...Array 或Map 是具有默认迭代行为的内置迭代器。对象不是可迭代的,但是可以通过使用iterable和iterator协议使它们可迭代。...在Mozilla文档中,如果一个对象实现了@@iterator方法,那么它就是可迭代的,这意味着这个对象(或者它原型链上的一个对象)必须有一个带有@@iterator键的属性,这个键可以通过常量Symbol.iterator...函数来定制对象迭代行为: var obj = {x:1, y:2, z: 3} obj[Symbol.iterator] = function*() { yield 1; yield 2;...答案:10 解析:在全局范围内初始化x,它成为window对象属性(不是严格的模式)。

1.3K30

Vue开发中常用的ES6新特性

如果在上面的例子中使用var(就像在传统的Javascript代码中那样)而不是let,就不会出现错误。 const是另一个用于声明变量的ES6关键字。...首先,Symbol.iterator 一个内置的符号值,而Symbol是ES6中用于创建唯一标签/标识符的基本类型。 其次,包装属性键的方括号使它成为一个动态计算的键。这里的关键是表达式符号。...现在仍然需要处理迭代器协议来创建可迭代对象,因为必须从 [Symbol.iterator] 函数返回一个迭代迭代器协议更简单。...,如果我们返回的是对象字面量,则无法使用,会报错: const getObj = () => { a: 1, b: 2 } // error 这将产生语法错误,因为解析器将假定花括号用于函数块,而不是对象字面量...它不会出现错误;相反,它只会从周围的范围提供相同的this引用。

1.4K10
领券