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

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

要使类可迭代,必须实现一个方法,其名称为符号Symbol.iterator。该方法必须返回具有next()方法迭代器对象。...如果一个数据属性不可配置且不可写,你就无法改变它。但是,如果一个属性是可配置但不可,你可以改变它(因为这与使其可写,然后改变,然后将其转换回不可写是一样)。...粗略地说,对于期望或偏好字符串转换,JavaScript 首先调用对象toString()方法,如果未定义返回原始,则回退到valueOf()方法。...对于偏好数值转换,JavaScript 首先尝试valueOf()方法,如果未定义返回原始,则回退到toString()。最后,在没有偏好情况下,它让类决定如何进行转换。...TypeError:get()返回与目标不匹配 代理强制执行许多附加不变性,几乎所有这些不变性都与不可扩展目标对象和目标对象上不可配置属性有关。

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

揭秘ES6迭代

当一个对象需要被迭代时候(比如开始用于一个for..of循环中),它@@iterator方法被调用并且无参数,然后返回一个用于在迭代中获得迭代器。...说云山雾罩,简单总结: 1、迭代器就是满足迭代器协议对象 2、迭代器对象原型上必须有一个@@iterator 方法。 3、这个方法可以被对象上Symbol.iterator属性访问到。...5、能被for of 循环就是迭代器。 可迭代对象必须存在[Symbol.iterator]方法,该方法一个无参函数返回迭代器协议对象。...迭代器对象包含一个next()函数,该函数返回有两种: 如果迭代未结束,返回如下 return { value: 'item', // item是本次迭代,可以为任意对象 done: false...} 如果迭代已结束,返回如下 return { done: true } 下面是提供迭代示例。

38451

ES6 中 Symbol 是什么?

[头发证会掉完] 概念 symbol 是一种基本数据类型。Symbol() 函数返回 symbol 类型,该类型具有静态属性和静态方法。...拥有 Symbol.iterator 函数对象被称为 可迭代对象 ,就是说你可以在对象上使用 for/of 循环。...假设不用 Symbol.iterator ,可迭代对象需要有一个字符串属性名 'iterator',就像下面这个可迭代对象类: class MyClass { constructor (obj...由于 sysmbol 无法在 JSON 里表示,因此不用担心给 Express API 传入带有不合适 Symbol.iterator 属性数据。...symbol` 不会出现在 Object.keys() 结果中,因此除非你明确地 export 一个 symbol,或者用 Object.getOwnPropertySymbols() 函数获取,否则其他代码无法访问这个属性

79610

JavaScrip最容易犯十大错误及其避免方法()

Uncaught TypeError: Cannot read property 如果你是一个javascript开发者,你肯定看到过此错误 读取属性或调用方法对象未定义 这可能由于许多原因而发生,...反过来,这意味着ItemList将项目定义为未定义,并且您在控制台中收到错误 - “Uncaught TypeError无法读取未定义属性’map’”。 这很容易解决。...最简单方法:在构造函数中使用合理默认初始化状态。...Uncaught TypeError: Cannot set property 当我们尝试访问未定义变量时,它总是返回undefined,我们无法获取或设置undefined任何属性。...在这种情况下,应用程序将抛出“Uncaught TypeError无法设置未定义属性”。 10.

11810

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

表示该是否为Set成员 keys()/values() 返回一个新迭代器对象,该对象包含Set对象中按插入顺序排列所有元素 entries() 返回一个新迭代器对象,该对象包含Set对象中按插入顺序排列所有元素...Symbol出现之前,我们会经常遇到多个不相同库操作DOM属性相同,导致第三方库无法正常运行。Symbol解决了“对象属性名都是字符串、数字,这容易造成属性冲突”问题。...var s1 = Symbol.for("foo"); Symbol.keyFor(s1) // "foo" 常用Symbol (1)Symbol.iterator @@iterator用于为对象定义一个方法并返回一个属于所对应对象迭代器...(注意,ES5无法模拟该特性)。 元编程重点在于:在一个程序内容、运行环境、配置等都不做任何修改情况下,可以通过其他程序对其进行读取或修改。...configurable和writable属性为false时,监听方法最后返回必须与目标对象属性一直。

77931

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

无论返回是什么类型,每次访问对象属性就是属性访问,如果属性访问返回是一个函数,那它也并不是一个“方法”。属性访问返回函数和其他函数没有任何区别(除了可能发生隐式绑定this)。...即使在对象文字形式中声明一个函数表达式,这个函数也不会“属于”这个对象,它们只是对于相同函数对象多个引用。...//undefined console.log(myObject.b);//undefined 仅通过返回无法判断一个属性是存在并且持有一个undefined,还是变量不存在,所以[[Get]]无法返回某个特定返回默认...还是 defineProperty(...)中显示定义,二者都会在对象中创建一个不包含属性,对于这个属性访问会自动调用一个隐藏函数,它返回会被当作属性访问返回。...,而是一个返回迭代器对象函数,调用迭代next()方法会返回形式为 {value: ... , done: ...},value是当前遍历,done是一个布尔,表示是否还是可以遍历

63420

迭代器与 for of使用和原理

; i++) { console.log(colors[i]);} 看着很简单,但是再回顾这段代码,实际上我们仅仅是需要数组中元素,但是却需要提前获取数组长度,声明索引变量等,尤其当多个循环嵌套时候...迭代器 所谓迭代器,其实就是一个具有 next() 方法对象,每次调用 next() 都会返回一个结果对象,该结果对象有两个属性,value 表示当前,done 表示遍历是否结束。...,但有的时候不仅需要使用还需要使用索引,ES6 为数组、Map、Set 集合内建了以下三种迭代器: entries() 返回一个遍历器对象,用来遍历[键名, 键值]组成数组。...,仅仅是在有 return 函数时候执行了 return 函数而已,return 函数返回其实并不生效…… 但是你不返回或者返回一个基本类型的话,结果又会报错…… TypeError: Iterator...函数返回其实并不生效 T^T

1.4K30

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

; i++) { console.log(colors[i]); } 看着很简单,但是再回顾这段代码,实际上我们仅仅是需要数组中元素,但是却需要提前获取数组长度,声明索引变量等,尤其当多个循环嵌套时候...迭代器 所谓迭代器,其实就是一个具有 next() 方法对象,每次调用 next() 都会返回一个结果对象,该结果对象有两个属性,value 表示当前,done 表示遍历是否结束。...,比如有的时候我们仅需要数组中,但有的时候不仅需要使用还需要使用索引,ES6 为数组、Map、Set 集合内建了以下三种迭代器: entries() 返回一个遍历器对象,用来遍历[键名, 键值]组成数组...,仅仅是在有 return 函数时候执行了 return 函数而已,return 函数返回其实并不生效…… 但是你不返回或者返回一个基本类型的话,结果又会报错…… TypeError: Iterator...函数返回其实并不生效 T^T

87841

ES6 系列之迭代器与 for of

; i++) { console.log(colors[i]); } 看着很简单,但是再回顾这段代码,实际上我们仅仅是需要数组中元素,但是却需要提前获取数组长度,声明索引变量等,尤其当多个循环嵌套时候...迭代器 所谓迭代器,其实就是一个具有 next() 方法对象,每次调用 next() 都会返回一个结果对象,该结果对象有两个属性,value 表示当前,done 表示遍历是否结束。...,比如有的时候我们仅需要数组中,但有的时候不仅需要使用还需要使用索引,ES6 为数组、Map、Set 集合内建了以下三种迭代器: entries() 返回一个遍历器对象,用来遍历[键名, 键值]组成数组...,仅仅是在有 return 函数时候执行了 return 函数而已,return 函数返回其实并不生效…… 但是你不返回或者返回一个基本类型的话,结果又会报错…… TypeError: Iterator...函数返回其实并不生效 T^T 作者:冴羽 https://github.com/mqyqingfeng/Blog/issues/98

48610

JavaScript异步编程

为了变成可迭代对象,一个对象必须实现@@iterator方法,意思是这个对象(或者它原型链prototype chain上某个对象)必须有一个名字是Symbol.iterator属性属性 [...Symbol.iterator] 返回一个对象无参函数,被返回对象符合迭代器协议 当一个对象需要被迭代时候(比如开始用于一个for...of循环中),它@@iterator方法被调用并且无参数,...然后返回一个用于在迭代中获得迭代器。...当一个对象被认为是一个迭代器时,它实现了一个next()方法并且拥有以下含义: 属性 next 返回一个对象无参函数,被返回对象拥有两个属性: 1. done(boolean) - 如果迭代器已经经过了被迭代序列时为...这时value可能描述了该迭代返回 - 如果迭代器可以产生序列中下一个,则为false。这等效于连同done属性也不指定。 2. value - 迭代返回任何JavaScript

1K20

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

,从数组最小索引开始,前者返回第一个匹配元素,后者匹配第一个匹配元素索引,可接受第二个参数,用于指定断言函数内部this 迭代方法 迭代方法接收两个参数:以每一项为参数运行函数,可选作为函数运行上下文作用域对象...定型数组有一个Symbol.iterator符号属性,因此可以通过for..of循环和扩展操作符来操作 # 合并、复制和修改定型数组 定型数组同样使用数组缓冲来存储数据,而数组缓冲无法调整大小,故以下方法不适用于定型数组...values()及其别名方法keys()(或者Symbol.iterator属性)取得这个迭代器 values()是默认迭代器,可以直接对集合实例使用扩展操作,把集合转换为数组 集合entries()...可迭代对象中每个都会按照迭代顺序插入到新实例中 初始化之后可以使用 add()再添加新,可以使用 has()查询,还可以使用 delete()删除 add()方法返回弱集合实例,因此可以把多个操作连缀起来...# 不可迭代 WeakSet 中任何时候都可能被销毁,所以没必要提供迭代能力 也用不着像 clear()这样一次性销毁所有方法 WeakSet 之所以限制只能用对象作为,是为了保证只有通过对象引用才能取得

660100

1000多个项目中十大JavaScript错误以及如何避免

当你读取一个属性或调用一个未定义对象方法时,Chrome 中就会报出这样错误。 ? 导致这个错误发生原因有很多,常见一种情况是在渲染 UI 组件时,不正确地初始化状态。...这是在 Safari 中读取属性或调用未定义对象上方法时发生错误,这与 Chrome 上述错误基本相同,只是 Safari 使用不同错误消息。 ? 3....如果将传递给超出范围函数,也可能会发生这种情况。许多函数只接受特定范围内数字输入。...TypeError: Cannot Read Property ‘length’ 这是 Chrome 中发生错误,因为读取未定义长度属性变量。 ?...Uncaught TypeError: Cannot Set Property 当尝试访问未定义变量时,总会返回 undefined。我们也无法获取或设置 undefined 任何属性

8.2K40

1000多个项目中十大JavaScript错误以及如何避免

当你读取一个属性或调用一个未定义对象方法时,Chrome 中就会报出这样错误。 [image.png] 导致这个错误发生原因有很多,常见一种情况是在渲染 UI 组件时,不正确地初始化状态。...这是在 Safari 中读取属性或调用未定义对象上方法时发生错误,这与 Chrome 上述错误基本相同,只是 Safari 使用不同错误消息。...[image.png] TypeError: Null Is Not an Object (evaluating...) 这是在 Safari 中读取属性或调用空对象上方法时发生错误。...TypeError: Cannot Read Property ‘length’ 这是 Chrome 中发生错误,因为读取未定义长度属性变量。...我们也无法获取或设置 undefined 任何属性。在这种情况下,应用程序将抛出“Uncaught TypeError cannot set property of undefined”。

6.2K30

10 种 JavaScript 最常见错误

当你读取一个未定义对象属性或调用其方法时,这个错误会在 Chrome 中出现。 您可以很容易在 Chrome 开发者控制台中进行测试。 ?...2、 TypeError: ‘undefined’ is not an object 这是在 Safari 中读取属性或调用未定义对象上方法时发生错误。...此外,如果您将传递给超出范围函数,也可能会发生这种情况。 许多函数只接受其输入特定范围数字。...8、 TypeError: Cannot read property ‘length’ 这是因为读取未定义变量长度属性而发生错误。 您可以在 Chrome 开发者控制台中进行测试。 ?...: Cannot set property 当我们尝试访问一个未定义变量时,它总是返回 undefined,我们不能获取或设置任何未定义属性

8.5K20

ES6中Iterator 和for of循环

以上数据类型,都有 Symbol.iterator 属性属性是一个函数,执行这个函数就会返回一个迭代器。这个迭代器就有 next 方法可顺序迭代子元素。...其中,value 属性是当前成员,done 属性是一个布尔,表示遍历是否结束。 下面是模拟 next 方法返回例子。...Symbol.iterator 属性本身是一个函数,这个函数是当前数据结构默认遍历器生成函数。执行这个函数,就会返回一个遍历器。...方法返回不是一个对象 for (let item of obj) { console.log(item); } // 测试 2 // 下面我们让Symbol.iterator方法返回是一个对象...Symbol.iterator属性对应一个函数,执行后返回当前对象遍历器对象。 下面是另一个为对象添加 Iterator 接口例子。

80420

ES6 迭代器简述

迭代过程 迭代过程如下: 通过 Symbol.iterator 创建一个迭代器,指向当前数据结构起始位置 随后通过 next 方法进行向下迭代指向下一个位置, next 方法会返回当前位置对象,对象包含了...value 和 done 两个属性, value 是当前属性, done 用于判断是否遍历结束 当 done 为 true 时则遍历结束 下面通过一个简单例子进行说明: const items...迭代器是协议(使用它们规则)一部分,用于迭代。该协议一个关键特性就是它是顺序迭代器一次返回一个。这意味着如果可迭代数据结构是非线性(例如树),迭代将会使其线性化。...} } args("zero", "one"); // zero // one 普通对象不可迭代 普通对象是由 object 创建不可迭代: // TypeError for (let item...of 操作数必须是可迭代,这意味着如果是普通对象则无法进行迭代

50940
领券