时间:2021-05-26
对象遍历
为了便于对象遍历的测试,我在下面定义了一个测试对象 obj。
测试对象
// 为 Object 设置三个自定义属性(可枚举)Object.prototype.userProp = 'userProp';Object.prototype.getUserProp = function() { return Object.prototype.userProp;};// 定义一个对象,隐式地继承自 Object.prototypevar obj = { name: 'percy', age: 21, [Symbol('symbol 属性')]: 'symbolProp', unEnumerable: '我是一个不可枚举属性', skills: ['html', 'css', 'js'], getSkills: function() { return this.skills; }};// 设置 unEnumerable 属性为不可枚举属性Object.defineProperty(obj, 'unEnumerable', { enumerable: false});ES6 之后,共有以下 5 种方法可以遍历对象的属性。
for…in: 遍历对象自身的和继承的可枚举属性(不含 Symbol 类型的属性)
for (let key in obj) { console.log(key); console.log(obj.key); // wrong style console.log(obj[key]); // right style}不要使用 for…in 来遍历数组,虽然可以遍历,但是如果为 Object.prototype 设置了可枚举属性后,也会把这些属性遍历到,因为数组也是一种对象。
Object.keys(obj):返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 类型的属性)
Object.keys(obj); // ["name", "age", "skills", "getSkills"]Object.getOwnPropertyNames(obj):返回一个数组,包含对象自身的所有属性(不含 Symbol 类型的属性,不包含继承属性,但是包括不可枚举属性)
Object.getOwnPropertyNames(obj);// ["name", "age", "unEnumerable", "skills", "getSkills"]Object.getOwnPropertySymbols(obj):返回一个数组,包含对象自身的所有 Symbol 类型的属性(不包括继承的属性)
Object.getOwnPropertySymbols(obj);// [Symbol(symbol 属性)]Reflect.ownKeys(obj):返回一个数组,包含对象自身的所有属性(包含 Symbol 类型的属性,还有不可枚举的属性,但是不包括继承的属性)
Reflect.ownKeys(obj);// ["name", "age", "unEnumerable", "skills", "getSkills", Symbol(symbol 属性)]以上的5种方法遍历对象的属性,都遵守同样的属性遍历的次序规则
如何判断某个属性是不是某个对象自身的属性呢?
用 in 操作符(不严谨,它其实判定的是这个属性在不在该对象的原型链上)
用 hasOwnProperty(),这个方法只会检测某个对象上的属性,而不是原型链上的属性。
obj.hasOwnProperty('age'); // trueobj.hasOwnProperty('skills'); // trueobj.hasOwnProperty('userProp'); // false但是它还是有不足之处的。举例~
// 利用 Object.create() 新建一个对象,并且这个对象没有任何原型链var obj2 = Object.create(null, { name: { value: 'percy' }, age: { value: 21 }, skills: { value: ['html', 'css', 'js'] }});obj2.hasOwnProperty('name'); // 报错 obj2.hasOwnProperty('skills'); // 报错针对上面的情况,我们用一个更完善的解决方案来解决。
使用 Object.prototype.hasOwnProperty.call(obj,'prop'…)
数组遍历
数组实际上也是一种对象,所以也可以使用上面对象遍历的任意一个方法(但要注意尺度),另外,数组还拥有其他遍历的方法。
最基本的 for 循环、while 循环遍历(缺陷是多添加了一个计数变量)
ES6 引入:for…of ,这下就没有这个计数变量了,但是也不够简洁(这里不做详细介绍,以后写)
下面说几种数组内置的一些遍历方法
Array.prototype.forEach(): 对数组的每个元素执行一次提供的函数
Array.prototype.map(): 返回一个新数组,每个元素都是回调函数返回的值
Array.prototype.map(callback(currentValue, index, array){ // do something }[,thisArg]);``` ```js// map 的一个坑[1,2,3].map(parseInt); // [1, NaN, NaN]// 提示 map(currentValue,index,array)// parseInt(value,base)一些有用的数组内置方法(类似 map,回调函数的参数都是那 3 个)
Array.prototype.reduce(callback,[initialValue]):习惯性称之为累加器函数,对数组的每个元素执行回调函数,最后返回一个值(这个值是最后一次调用回调函数时返回的值)
Array.prototype.reduceRight(callback[, initialValue]):用法和上面的函数一样,只不过遍历方向正好相反
总结一下上面这些函数的共性
最下面的文章想说的就是让我们用更简洁的语法(比如内置函数)遍历数组,从而消除循环结构。
参考资料:无循环 JavaScript
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
JavaScript遍历table1、说明遍历表格中的某行某列,并打印其值2、实现源码JavaScript遍历tabletrtd,trth{border:#CC
C++遍历二叉树实例详解2叉数又叫红黑树,关于2叉数的遍历问题,有很多,一般有三种常用遍历方法:(1)前序遍历(2)中序遍历(3)后续遍历以下是经典示例:#in
swiftCharacter类型详解及实例1、遍历字符串//for-in遍历Stringforcinstr.characters{print(c)}//c是Ch
相信大家对集合遍历再熟悉不过了,这里总结一下HashMap和List的遍历方法,以及它们该如何实现遍历删除。这里对于每种遍历删除出现的问题的原因都给出了详解!(
for循环JavaScript提供多种遍历语法。最原始的写法就是for循环。letarr=[1,2,3,4,5];for(varindex=0;index<ar