JavaScript 知识碎片[四] for ···in 和 for ···of 的区别与基本使用
业精于勤 荒于嬉
for...in
语句
for...in
语句以任意顺序遍历一个对象的除Symbol以外的可枚举属性。
语法
for (variable in object)statement
variable
在每次迭代时,variable会被赋值为不同的属性名。
object
非Symbol类型的可枚举属性被迭代的对象。
数组迭代和
for...in
提示:
for...in
不应该用于迭代一个关注索引顺序的Array
。仅迭代自身的属性
如果你只要考虑对象本身的属性,而不是它的原型,那么使用
getOwnPropertyNames()
或执行hasOwnProperty()
来确定某属性是否是对象本身的属性(也能使用propertyIsEnumerable
)。或者,如果你知道不会有任何外部代码干扰,您可以使用检查方法扩展内置原型。为什么用for ... in?
for ... in
是为遍历对象属性而构建的,不建议与数组一起使用,数组可以用Array.prototype.forEach()
和for ... of
,那么for ... in
的到底有什么用呢?它最常用的地方应该是用于调试,可以更方便的去检查对象属性(通过输出到控制台或其他方式)。尽管对于处理存储数据,数组更实用些,但是你在处理有
key-value
数据(比如属性用作“键”),需要检查其中的任何键是否为某值的情况时,还是推荐用for ... in
。
示例
下面的函数接受一个对象作为参数。被调用时迭代传入对象的所有可枚举属性然后返回一个所有属性名和其对应值的字符串。
//下面的函数接受一个对象作为参数。被调用时迭代传入对象的所有可枚举属性然后返回一个所有属性名和其对应值的字符串。
var obj = {a:1, b:2, c:3};for (var prop in obj) {console.log("obj." + prop + " = " + obj[prop]);
}// Output:
// "obj.a = 1"
// "obj.b = 2"
// "obj.c = 3"
下面的函数说明了hasOwnProperty()
的用法:继承的属性不显示。
//下面的函数说明了hasOwnProperty()的用法:继承的属性不显示。 var triangle = {a: 1,b: 2,c: 3};function ColoredTriangle() {this.color = 'red';}ColoredTriangle.prototype = triangle;var obj = new ColoredTriangle();for (var prop in obj) {console.log(prop) // 此处 a b c red 都会打印if (obj.hasOwnProperty(prop)) {console.log(`obj.${prop} = ${obj[prop]}`);}}// Output:// "obj.color = red"
for...of
语句
for...of
语句在可迭代对象(包括 Array
,Map
,Set
,String
,TypedArray
,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句
基本使用
const array1 = ['a', 'b', 'c'];for (const element of array1) {console.log(element);
}// expected output: "a"
// expected output: "b"
// expected output: "c"
语法
for (variable of iterable) {//statements }
variable
在每次迭代中,将不同属性的值分配给变量。
iterable
被迭代枚举其属性的对象。
示例
迭代Array
let iterable = [10, 20, 30];for (let value of iterable) {value += 1;console.log(value);
}
// 11
// 21
// 31//如果你不想修改语句块中的变量 , 也可以使用const代替let。let iterable2 = [10, 20, 30];for (const value of iterable2) {console.log(value);
}
// 10
// 20
// 30
迭代String
let iterable = "boo";for (let value of iterable) {console.log(value);
}
// "b"
// "o"
// "o"
迭代 TypedArray [我比较少用]
let iterable = new Uint8Array([0x00, 0xff]);for (let value of iterable) {console.log(value);
}
// 0
// 255
迭代Map
let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]);for (let entry of iterable) {console.log(entry);
}
// ["a", 1]
// ["b", 2]
// ["c", 3]for (let [key, value] of iterable) {console.log(value);
}
// 1
// 2
// 3
迭代 Set
let iterable = new Set([1, 1, 2, 2, 3, 3]);for (let value of iterable) {console.log(value);
}
// 1
// 2
// 3
迭代 arguments
对象
(function() {for (let argument of arguments) {console.log(argument);}
})(1, 2, 3);// 1
// 2
// 3
迭代 DOM 集合
迭代 DOM 元素集合,比如一个NodeList
对象:下面的例子演示给每一个 article 标签内的 p 标签添加一个 "read
" 类。
/注意:这只能在实现了NodeList.prototype[Symbol.iterator]的平台上运行
let articleParagraphs = document.querySelectorAll("article > p");for (let paragraph of articleParagraphs) {paragraph.classList.add("read");
for...of
与for...in
的区别
无论是for...in
还是for...of
语句都是迭代一些东西。它们之间的主要区别在于它们的迭代方式。
for...in
语句以任意顺序迭代对象的可枚举属性。
for...of
语句遍历可迭代对象定义要迭代的数据。
Object.prototype.objCustom = function() {};
Array.prototype.arrCustom = function() {};let iterable = [3, 5, 7];
iterable.foo = 'hello';for (let i in iterable) {console.log(i); // logs 0, 1, 2, "foo", "arrCustom", "objCustom"
}for (let i in iterable) {if (iterable.hasOwnProperty(i)) {console.log(i); // logs 0, 1, 2, "foo"}
}for (let i of iterable) {console.log(i); // logs 3, 5, 7
}
简单总结
遍历对象的属性 我选 for...in,因为使用for...of 遍历数组是无序的,for...in 可以遍历到原型的属性.
遍历其他科迭代对象我选择 for...of 如 Array、String、Map、Set、arguments 对象等等
希望每一个知识碎都烂熟于心
JavaScript 知识碎片[四] for ···in 和 for ···of 的区别与基本使用相关推荐
- iOS开发基础知识--碎片19
iOS开发基础知识--碎片19 1:键盘事件顺序 UIKeyboardWillShowNotification // 键盘显示之前 UIKeyboardDidShowNotification // ...
- 重构碎片化知识_知识碎片化,思维导图重构你的思维体系
原标题:知识碎片化,思维导图重构你的思维体系 如何解决碎片化的学习方式? 思维导图重构你的思维体系... 作为校长或教师的你,有没有这样的经历: 备课的时候,突然就会来一个电话,或者一条微信,于是你不 ...
- 重学JavaScript系列——(四)变量、作用域与内存
重学JavaScript系列--(四)变量.作用域与内存 博主以扎实JavaScript基础为目的,以<JavaScript高级程序设计(第四版)>为核心参考资料,以一个"复习者 ...
- 硬盘知识大杂烩(四)
硬盘知识大杂烩(四)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&g ...
- iOS开发基础知识--碎片44
iOS开发基础知识--碎片44 iOS开发基础知识--碎片44 1:App跳转至系统Settings 跳转在IOS8以上跟以下是有区别的,如果是IOS8以上可以如下设置: NSURL *url = ...
- Javascript知识——事件
O(∩_∩)O~~又是新的一周开始了,今天还是在继续学习Javascript知识,今天主要讲了事件的知识.现在就总结下吧. 事件 事件一般是用于浏览器和用户操作进行交互.最早是 IE 和 Netsca ...
- Javascript函数调用的四种模式
Javascript一共有四种调用模式:方法调用模式.函数调用模式.构造器调用模式以及apply调用模式.调用模式不同,对应的隐藏参数this值也会不同. 函数作为对象的属性时,称为方法.此时函数(即 ...
- JavaScript学习总结(四)——逻辑OR运算符详解
转载自 JavaScript学习总结(四)--逻辑OR运算符详解 在JavaScript中,逻辑OR运算符用||表示 var bTrue = true;var bFalse = false;var ...
- HTML/CSS基础知识(四)
WEB标准和W3C的理解与认识 Web标准是一系列标准的集合. 网页主要由三部分组成:结构(Structure).表现(Presentation)和行为(Behavior). 对应的标准也分三方面:结 ...
最新文章
- linux命令rname,linux的rename命令
- linux的特殊权限SUID、SGID和SBIT
- C++ 模板详解(二)
- 用C语言编写贪吃蛇项目描述,刚学C语言,想写一个贪吃蛇的代码
- shaderlab UV动画所需的变量声明
- C++ Qt 访问权限总结
- TypeError:Joi.validate is not a function 解决办法
- SparkSQL中数据集类的封装
- 新版的iMessage就是iOS 10内隐形的浏览器
- numpy——numpy.corrcoef
- win10配置Android SDK环境变量
- 【Unity3D插件】Dialogue System for Unity插件分享《对话系统插件》
- sql注入工具、检测及手工注入集合
- 全网最全测试工程师 学习网站汇总(测试必备 抓紧收藏)
- 氨基酸三字母转一个字母
- findContours函数报错:“将一个无效参数传递给了将无效参数视为严重错误的函数”解决方案之一
- html中微信添加好友超链接,微信给文字加链接代码分享(原来微信超链接是这样加的)...
- 华域php公司,华域智能DNS系统
- 用JAVA写一个画图小程序(JAVA 大作业)
- 弱校胡策 大逃亡(BFS灌水+二分答案)
热门文章
- java总结 --4.过滤器
- oc引导开机直接进_利用OC Gen X工具适配自己的OC引导
- 根据“气质”,AI可以准确识别婴儿年龄、性别
- [项目管理-11]:软硬件项目管理 - 项目管理三要素与项目管理模式
- win7副本不是正版_Win7旗舰版和纯净版有什么区别
- 大逃杀最多100人服务器,疑《使命召唤15》大逃杀模式截图曝光 人数不到100人
- vscode 取消按左括号,自动补全提示代码
- ORA-02436 date or system variable wrongly specified in check constraint
- 使用 gomonkey Mock 函数及方法
- 基于Myeclipse9.1的spring3.1MVC开发搭建