热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

详解js中的遍历

实例属性和原型属性JavaScript中对象的属性分为两种:数据属性和接见器属性。依据细致的上下文环境的差别,又能够将属性分为:原型属性和实例属性。原型属性是定义在对象的原型pro

实例属性和原型属性

  • Javascript中对象的属性分为两种: 数据属性接见器属性
  • 依据细致的上下文环境的差别,又能够将属性分为: 原型属性实例属性
  • 原型属性 是定义在对象的原型prototype 中的属性,
  • 实例属性 一方面来自组织的函数中,然后就是组织函数实例化后增加的新属性。

js的罗列

Javascript中遍历一个对象的属性并不太简朴,重要有两个缘由:

  • Javascript中的对象一般都处在某个原型链中,它会从一个或多个的上层原型上继续一些属性
  • Javascript中的属性不光有值,它还有一些除了值之外的其他特征,个中一个影响属性遍历的特征就是Enumerable(一个属性形貌符) ,假如该值为 true ,则这个属性是可罗列的,不然反之
属性形貌符
  • 属性形貌符 重要有两种情势:数据形貌符存取形貌符
  • 运用Object.getOwnPropertyDescriptorObject.getOwnPropertyDescriptors两个要领猎取对象的属性形貌符

var obj = {
name: '10',
_age: 25,
get age(){
return this._age;
},
set age(age){
if(age<1){
throw new Error('Age must be more than 0');
}else{
this._age = age;
}
}
};
var des = Object.getOwnPropertyDescriptors(obj);
console.log(des);
/**
* des: {
* name: {
* configurable: true,
* enumerable: true,
* value: "10",
* writable: true,
* __proto__: Object
* },
* _age: {
* configurable: true,
* enumerable: true,
* value: 25,
* writable: true,
* __proto__: Object
* },
* age: {
* configurable: true,
* enumerable: true,
* get: f age(),
* set: f age(age),
* __proto__: Object
* },
* __proto__: Object
* }
*/

value

该属性的值(仅针对数据属性形貌符有用)

writable

writable属性设置为false时,该属性被称为“不可写”。它不能被重新分配。

get

猎取该属性的接见器函数(getter)。假如没有接见器, 该值为undefined。(仅针对包含接见器或设置器的属性形貌有用)

set

猎取该属性的设置器函数(setter)。 假如没有设置器, 该值为undefined。(仅针对包含接见器或设置器的属性形貌有用)

configurable

configurable特征示意对象的属性是不是能够被删除,以及除writable特征外的其他特征是不是能够被修正。

enumerable

enumerable定义了对象的属性是不是能够在 for...in 轮回和 Object.keys() 中被罗列。

  • name、_age具有 'configurable''enumerable''value''writable'四个属性形貌符,统称数据形貌符
  • age具有'configurable''enumerable''get''set'四个属性形貌符,统称存取形貌符
分类&#8216;configurable&#8217;&#8216;enumerable&#8217;&#8216;value&#8217;&#8216;writable&#8217;&#8216;get&#8217;&#8216;set&#8217;
数据形貌符yesyesyesyesnono
存取形貌符yesyesnonoyesyes

对象的属性形貌符,能够经由过程Object.definePropertyObject.defineProperties来修正(configurabletrue的条件下)

经常使用的遍历要领

for...in...遍历

  • 遍历本身及原型链上一切可罗列的属性
  • 运用 for&#8230;in 轮回遍历对象属性时返回的属性会因为各个 浏览器差别 致使对象属性遍历的递次有能够不是当初构建时的递次。

Chrome Opera 的 Javascript 剖析引擎遵照的是新版 ECMA-262 第五版范例。因而,运用 for-in 语句遍历对象属性时遍历书序并不是属性构建递次。而 IE6 IE7 IE8 Firefox Safari 的 Javascript 剖析引擎遵照的是较老的 ECMA-262 第三版范例,属性遍历递次由属性构建的递次决议。

for-in 语句没法保证遍历递次,应只管防止编写依靠对象属性递次的代码。假如想递次遍历一组数据,请运用数组并运用 for 语句遍历。

var Animal = function({name='none', age=3, weight=80}={}){
this.name = name;
this.age = age;
this.weight = weight;
}
Animal.prototype = {
color: 'red'
}
var dog = new Animal()
// 将weight属性设置为 不可罗列
Object.defineProperty(dog, 'weight', {
enumerable: false
})
for(let i in dog){
console.log(n);
}
//原型链上的color一样被遍历出来了,而且因为weight属性被设置成了enumerable:false,所以不可被遍历
//name
//age
//color

for...of遍历

一个数据构造只需布置了Symbol.iterator属性,就被视为具有 iterator 接口,就能够用for...of轮回遍历它的成员。也就是说,for...of轮回内部挪用的是数据构造的Symbol.iterator要领。

for...of轮回能够运用的局限包含数组、SetMap 构造、某些相似数组的对象(比方arguments对象、DOM NodeList 对象)、Generator 对象,以及字符串。

假如不太清晰iterator,请去看看阮一峰大神的这篇文章,内里关于for...of以及iterator都讲的异常细致!

实在for...offor...in都是迭代一些东西,它们之间的重要区分在于它们的迭代体式格局。

  • 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); // 0, 1, 2, "foo", "arrCustom", "objCustom"
}
for (let i in iterable) {
if (iterable.hasOwnProperty(i)) {
console.log(i); // 0, 1, 2, "foo"
}
}
for (let i of iterable) {
console.log(i); // 3, 5, 7
}

Object.prototype.objCustom = function() {};
Array.prototype.arrCustom = function() {};
let iterable = [3, 5, 7];
iterable.foo = 'hello';

在这段代码内里,因为继续和原型链,对象iterable继续属性objCustomarrCustom

for (let i in iterable) {
console.log(i); // 0, 1, 2, "foo", "arrCustom", "objCustom"
}

在这段代码内里,此轮回仅以原始插进去递次纪录iterable 对象的可罗列属性。它不纪录数组元素3, 5, 7hello,因为这些不是罗列属性。然则它纪录了数组索引以及arrCustomobjCustom(为什么纪录arrCustomobjCustom在本文for...in内里有讲过)。

for (let i in iterable) {
if (iterable.hasOwnProperty(i)) {
console.log(i); // 0, 1, 2, "foo"
}
}

hasOwnProperty()用来搜检找到的罗列属性是不是是对象本身的(等于不是是继续的)

for (let i of iterable) {
console.log(i); // 3, 5, 7
}

该轮回迭代并纪录iterable作为可迭代对象定义的迭代值,这些是数组元素 3, 5, 7,而不是任何对象的属性。

Object.keys遍历

Object.keys() 要领会返回一个由一个给定对象的本身可罗列属性构成的数组,数组中属性名的分列递次和运用 for...in 轮回遍历该对象时返回的递次一致 (二者的重要区分是 一个 for-in 轮回还会罗列其原型链上的属性)。

Object.getOwnPropertyNames()遍历

Object.getOwnPropertyNames()要领返回一个由指定对象的一切本身属性的属性名(包含不可罗列属性但不包含Symbol值作为称号的属性)构成的数组,此要领不会猎取原型链上的属性。

var Animal = function({name='', age=1, weight=70}={}){
this.name = name;
this.age = age;
this.weight = weight;
}
Animal.prototype = {
type: 'Animal'
}
var dog = new Animal()
// 将height属性设置为 不可罗列
Object.defineProperty(dog, 'weight', {
enumerable: false
})
var keys = Object.getOwnPropertyNames(dog);
console.log(keys)
// ['name', 'age', 'weight']

结语

这篇文章愿望能让人人越发明白js中的遍历,写的不好多多包涵并指出!


推荐阅读
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
author-avatar
一个字-刘斌
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有