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

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

关于这一点的棘手之处在于,可迭代对象的迭代器方法没有传统的名称,而是使用符号Symbol.iterator作为其名称。...要使类可迭代,必须实现一个方法,其名称为符号Symbol.iterator。该方法必须返回具有next()方法的迭代器对象。...如果一个属性不可配置,你就无法改变它的可配置或可枚举属性。 如果一个访问器属性不可配置,你就无法更改其 getter 或 setter 方法,也无法将其更改为数据属性。...如果一个数据属性不可配置,你就无法将其更改为访问器属性。 如果一个数据属性不可配置,你就无法将其可写属性从false更改为true,但你可以将其从true更改为false。...当代码尝试从对象中读取值时,这些读取会正常转发到目标对象。但如果任何代码尝试修改对象或其属性,处理程序对象的方法会抛出 TypeError

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

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

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

78500

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

push、pop、shift、unshift push/pop 方法运行的比较快,而 shift/unshift 比较慢。 这个有点像是堆栈,push和pop都是操作栈顶的元素,所以快。...技术上来说,可迭代对象必须实现 Symbol.iterator 方法。 obj[Symbol.iterator]() 的结果被称为 迭代器(iterator)。由它处理进一步的迭代过程。...Symbol.iterator 方法会被 for..of 自动调用,但我们也可以直接调用它。 内置的可迭代对象例如字符串和数组,都实现了 Symbol.iterator。...字符串迭代器能够识别代理对(surrogate pair)。(译注:代理对也就是 UTF-16 扩展字符。) 有索引属性和 length 属性的对象被称为 类数组对象。...跟 Set 一样,WeakSet 支持 add,has 和 delete 方法,但不支持 size 和 keys(),并且不可迭代

88410

ES6 迭代器简述

迭代过程 迭代的过程如下: 通过 Symbol.iterator 创建一个迭代器,指向当前数据结构的起始位置 随后通过 next 方法进行向下迭代指向下一个位置, next 方法会返回当前位置的对象,对象包含了...value 和 done 两个属性, value 是当前属性的值, done 用于判断是否遍历结束 当 done 为 true 时则遍历结束 下面通过一个简单的例子进行说明: const items...方法创建一个迭代器,之后不断地调用 next 方法对数组内部项进行访问,当属性 done 为 true 时访问结束。...普通对象是由 object 创建的,不可迭代: // TypeError for (let item of {}) { console.log(item); } // Uncaught...of 操作数必须是可迭代,这意味着如果是普通对象则无法进行迭代

50840

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

Symbol出现之前,我们会经常遇到多个不相同的库操作的DOM属性相同,导致第三方库无法正常运行。Symbol解决了“对象属性名都是字符串、数字,这容易造成属性名的冲突”的问题。...var s1 = Symbol.for("foo"); Symbol.keyFor(s1) // "foo" 常用Symbol值 (1)Symbol.iterator @@iterator用于为对象定义一个方法并返回一个属于所对应对象的迭代器...,该迭代器会被for-of语句使用。...(注意,ES5无法模拟该特性)。 元编程重点在于:在一个程序的内容、运行环境、配置等都不做任何修改的情况下,可以通过其他程序对其进行读取或修改。...比如,Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj, name, desc)则会返回

77931

迭代器总结

迭代过程 迭代的过程如下: 通过 Symbol.iterator 创建一个迭代器,指向当前数据结构的起始位置 随后通过 next 方法进行向下迭代指向下一个位置, next 方法会返回当前位置的对象,对象包含了...value 和 done 两个属性, value 是当前属性的值, done 用于判断是否遍历结束 当 done 为 true 时则遍历结束 下面通过一个简单的例子进行说明: const items...方法创建一个迭代器,之后不断的调用 next 方法对数组内部项进行访问,当属性 done 为 true 时访问结束。...普通对象是由 object 创建的,不可迭代: // TypeError for (let item of {}) { console.log(item); } for...of循环 for...of 操作数必须是可迭代,这意味着如果是普通对象则无法进行迭代

50600

JavaScript异步编程

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

1K20

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

: Cannot redefine property: a 不管是不是处于严格模式,尝试修改一个不可配置的属性描述符都会出错,即把configurable修改成false是单向操作,无法撤销。...b会静默失败;在严格模式下,将会抛出TypeError错误。...这个方法是应用在对象上的级别最高的不可变性,它会禁止对对象本身以及任意直接属性的修改(这个对象引用的其他对象不受影响)。...如果是,在非严格模式下静默失败,在严格模式下抛出TypeError异常; 3)如果都不是,将该值设置为属性的值。 如果对象中不存在这个属性,[[Put]]操作会更复杂。...undefined, done: true} //用for...of遍历myObject for(var v of myObject){ console.log(v);//2 3 } 我们把符号当作可计算属性

63220

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

如果无法转换,则抛出错误 # 定型数组 定型数组是另一种形式的ArrayBuffer视图。...创建定型数组的方式包括读取已有的缓冲、使用自有缓冲、填充可迭代结构,以及填充基于任意类型的定型数组。...符号属性,因此可以通过for..of循环和扩展操作符来操作 # 合并、复制和修改定型数组 定型数组同样使用数组缓冲来存储数据,而数组缓冲无法调整大小,故以下方法不适用于定型数组 concat() pop...Set会维护值插入时的顺序,因此支持按顺序迭代 集合实例提供一个迭代器,能以插入顺序生成集合内容,可以通过values()及其别名方法keys()(或者Symbol.iterator属性)取得这个迭代器...removeReference() { container.val = null; } // 执行removeReference()后会摧毁值对象的最后一个引用,垃圾回收程序就可以把这个值清理掉 # 不可迭代

658100

常用ES6语法

console.log(a); // 3 } console.log(a); // 2 # const 声明的常量类似于指针,它指向某个引用,并非一成不变 { const Arr = [5,6]; Arr.push...,那么这个属性会是不可枚举的 var o = { val: 10, [ Symbol("random") ]: "I'm a symbol", }; console.log(Object.getOwnPropertyNames...(o)); // val 获取对象 symbol 属性,需要使用 Object.getOwnPropertySymbols(o) # 迭代器(Iterators) 迭代器允许每次访问数据集合的一个元素,...ES6 中可以通过 Symbol.iterator 给对象设置默认的遍历器,无论什么时候对象需要被遍历,执行它的 @@iterator 方法便可以返回一个用于获取值的迭代器。...数组默认就是一个迭代器 var arr = [11,12,13]; var itr = arr[Symbol.iterator](); itr.next(); // { value: 11, done

50740

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

function foo() { return Promise.resolve().then(foo); }; 每次调用'foo'都会继续在微任务队列上添加另一个'foo'回调,因此事件循环无法继续处理其他事件...6、我们能否以某种方式为下面的语句使用展开运算而不导致类型错误 var obj = { x: 1, y: 2, z: 3 }; [...obj]; // TypeError 答案:会导致TypeError...Array 或Map 是具有默认迭代行为的内置迭代器。对象不是可迭代的,但是可以通过使用iterable和iterator协议使它们可迭代。...在Mozilla文档中,如果一个对象实现了@@iterator方法,那么它就是可迭代的,这意味着这个对象(或者它原型链上的一个对象)必须有一个带有@@iterator键的属性,这个键可以通过常量Symbol.iterator...var obj = { a: 1, b: 2 }; //a,b 都是 enumerables 属性 // 将{c:3}设置为'obj'的原型,并且我们知道 // for-in 循环也迭代 obj 继承的属性

1.3K30

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

function foo() { return Promise.resolve().then(foo); }; 每次调用' foo'都会继续在微任务队列上添加另一个' foo'回调,因此事件循环无法继续处理其他事件...---- 问题6 : 会导致TypeError错误 解析: 展开语法 和 for-of 语句遍历 iterable对象定义要遍历的数据。 Array 或 Map 是具有默认迭代行为的内置迭代器。...对象不是可迭代的,但是可以通过使用iterable和iterator协议使它们可迭代。...在Mozilla文档中,如果一个对象实现了 @@iterator方法,那么它就是可迭代的,这意味着这个对象(或者它原型链上的一个对象)必须有一个带有 @@iterator键的属性,这个键可以通过常量 Symbol.iterator...var obj = { a: 1, b: 2 }; //a,b 都是 enumerables 属性 // 将{c:3}设置为'obj'的原型,并且我们知道 // for-in 循环也迭代 obj 继承的属性

1.4K10
领券