JavaScript——属性的检测和枚举

目录

任务描述

相关知识

属性的检测

属性的枚举

编程要求

任务描述

本关任务:给定一个属性的名字,请先判断它属于哪一个对象,然后返回该对象的所有自有属性名连接成的字符串。   如:school对象有三个自有属性name,location,studentNum,如果给定name,你需要返回字符串namelocationstudentNum

相关知识

在 JavaScript 编程实践中,如果我们调用别人的接口,常常需要了解实体是否具有某个属性。

属性的检测

属性的检测指检查对象是否有某个属性或者方法,需要使用运算符inin的左侧是属性或者方法名,右侧是检查对象,对象有该属性或者方法则返回true,否则返回false,如下:

var school = {name:"SJTU",location:"ShangHai",studentNum:40000,display:function() {console.log(this.name);}
};
// 检测属性
console.log("name" in school);    // 输出true
console.log("sales" in school);    // 输出false
// 检测方法
console.log("display" in school);    // 输出true
console.log("print" in school);    // 输出false

 

这里的属性名是字符串,必须用双引号包含在内。

还可以用hasOwnProperty()检测对象是否具有某个自有属性或方法。括号内的参数是属性或者方法的名字。

所谓自有属性或者方法,是指对象自己定义的属性或者方法,而不是从原型链上继承来的。

var school = {name:"SJTU",location:"ShangHai",studentNum:40000,display:function() {console.log(this.name);}
};
console.log(school.hasOwnProperty("studentNum"));    // true
console.log(school.hasOwnProperty("hasOwnProperty"));    // false

因为hasOwnProperty方法继承自object对象,不是自有方法,所以返回false

属性的枚举

定义:属性的枚举指按顺序逐个的列出属性的名字。如下面的例子:

var person = {name:"Ye",gender:"Gril",age:23,salary:23000,height:1.78
}

根据前面的知识,我们知道对象person有五个属性,所谓枚举,就是依次列出这五个属性的名字,即:name、gender、age、salary、height,至于它们排列的顺序,在不同的浏览器中的结果不同,这里不讨论。   在继续下面的知识点之前,首先要知道一个概念:可枚举性(enumerable),这是对象的属性的一个性质,用户自己定义的属性默认为可枚举,系统内置的对象的属性默认为不可枚举。

枚举属性有三种方法:

  • for...in...循环;

可以枚举所有可枚举的属性,包括继承的属性。如下:

// 首先定义一个school对象,它从原型链上继承的属性都是不可枚举的,而下面自定义的四个属性或者方法都是可枚举的
var school = {name:"SJTU",location:"ShangHai",studentNum:40000,display:function() {console.log(this.name);}
};
// 枚举school的属性
// 下面的圆括号中的att表示对象的属性,school表示对象
for(var att in school) {// 依次输出name,location,studentNum,displayconsole.log(att);
}

圆括号里面的表达式中,att表示对象的属性,school表示该对象,这个循环将依次遍历对象的所有可枚举属性,每次输出一个属性的值。

  • Object.getOwnPropertyNames()

括号中有一个参数,是要枚举的对象。该表达式将返回对象的所有自有属性的名字,不区分是否可枚举,结果以字符串数组的形式呈现,如下:

// 定义一个school对象
var school = {name:"SJTU",location:"ShangHai",studentNum:40000,display:function() {console.log(this.name);}
};
// 为school对象增加一个不可枚举的属性range
Object.defineProperty(school, "range", {value: 4,    // 设置range属性的值enumerable: false    // 设置range属性为不可枚举
});
// 输出["name","location","studentNum","display","range"]
console.log(Object.getOwnPropertyNames(school));

如果用上面的for...in...循环,range属性是不能够枚举到的。

  • Object.keys();   括号中有一个参数,是要枚举的对象。该表达式返回可枚举的自有属性,以字符串数组的形式。所以这里对属性的要求更加严格,既要求是自有属性,又要求可枚举。  
var school = {name:"SJTU",location:"ShangHai",studentNum:40000,display:function() {console.log(this.name);}
};
// 为school对象增加一个不可枚举的属性range
Object.defineProperty(school, "range", {value: 4,    // 设置range属性的值enumerable: false    // 设置range属性为不可枚举
});
// 输出["name","location","studentNum","display"]
console.log(Object.keys(school));

 

总结一下上面三个方法对属性是否自有,是否可枚举的要求:

方法名是否要求可枚举是否要求自有
for...in...
Object.getOwnPropertyNames()
Object.keys()

编程要求

本关的编程任务是补全右侧代码片段中 Begin 至 End 中间的代码,具体要求如下:

  • 有两个可选的对象orangecar,判断给定的属性名a属于哪一个对象;

  • 返回该对象的所有自有属性名组成的字符串,例如:如果判断为car,则返回brandpricemodel

  • 给定的两个对象的自有属性都是可枚举的;

var orange = {weight:"200g",color:"orange",taste:"sour"
};
var car = {brand:"Jaguar",price:"$80000",model:"XFL"
}
function mainJs(a){//请在此处编写代码/*********begin*********/var r = "";if (a in orange) {for (var s in orange) {r += s;}}else {for (var s in car) {r += s;}}return r;/*********end*********/
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/37374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

达梦数据库系列—15. 表的备份和还原

目录 1、表备份 2、表还原 1、表备份 表备份和表还原恢复,都必须在联机状态下进行。 与备份数据库与表空间不同,不需要备份归档日志,不存在增量备份之说。 CREATE TABLE TAB_FOR_RES_02(C1 INT);CREATE INDEX I_TAB_FOR_RES_02 ON TAB_F…

树状数组——点修区查与区修点查

树状数组是一种代码量小,维护区间的数据结构 他可以实现: 1.区间修改,单点查询 2.单点修改,区间查询 当然,二者不可兼得,大人全都要的话,请选择线段树 前置知识: lowbit(x)操作…

如何安装和配置Monit

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 关于 Monit Monit 是一个有用的程序,可以自动监控和管理服务器程序,以确保它们不仅保持在线,而且文…

Java与前端框架集成开发指南

Java与前端框架集成开发指南 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 引言 在当今互联网应用开发中,Java作为一种强大的后端语言&#xff0…

程序人生 - (002)

作为一名程序员,在编程和软件开发的过程中,通常会有一些深刻的感悟和体会。这些感悟不仅仅是关于技术的,也包括对工作的态度、职业的发展和人生的理解。 代码即逻辑:编写代码不仅仅是使用编程语言,更重要的是用逻辑思维…

LDM论文解读

论文名称:High-Resolution Image Synthesis with Latent Diffusion Models 发表时间:CVPR2022 作者及组织:Robin Rombach, Andreas Blattmann, Dominik Lorenz,Patrick Esser和 Bjorn Ommer, 来自Ludwig Maximilian University of Munich &a…

独一无二的设计模式——单例模式(Java实现)

1. 引言 亲爱的读者们,欢迎来到我们的设计模式专题,今天的讲解的设计模式,还是单例模式哦!上次讲解的单例模式是基于Python实现(独一无二的设计模式——单例模式(python实现))的&am…

web全屏api,实现元素放大全屏,requestFullscreen,exitFullscreen

全屏api 主要方法 document.exitFullscreen(); 退出页面全屏状态,document是全局文档对象 dom.requestFullscreen(); 使dom进入全屏状态,异步,dom是一个dom元素 dom.onfullscreenchange(); 全…

专题四:Spring源码初始化环境与BeanFactory

上文我们通过new ClassPathXmlApplicationContext("applicationContext.xml");这段代码看了下Spring是如何将Xml里面内容注入到Java对象中,并通过context.getBean("jmUser");方式获得了一个对象实例,而避开使用new 来耦合。今天我们…

【TB作品】智能台灯控制器,ATMEGA128单片机,Proteus仿真

题目 8 :智能台灯控制器 基于单片机设计智能台灯控制器,要求可以调节 LED 灯的亮度,实现定时开启与关闭, 根据光照自动开启与关闭功能。 具体要求如下: (1)通过 PWM 功能调节 LED 灯亮度&#x…

【本地调试】使用 Nginx 和 Hosts 文件实现本地开发调试请求转发

可以按照以下 nginx 配置来设置,通过 nginx 和 host 将网页的请求转发到本地的后端服务器,以方便本地开发调试 一、nginx 配置 worker_processes 1;events {worker_connections 1024; }http {include mime.types;default_type application/js…

【Python】 数据分析中的常见统计量:中位数

那年夏天我和你躲在 这一大片宁静的海 直到后来我们都还在 对这个世界充满期待 今年冬天你已经不在 我的心空出了一块 很高兴遇见你 让我终究明白 回忆比真实精彩 🎵 王心凌《那年夏天宁静的海》 中位数(Median)是统计学…

深入浅出3D感知中的优化与基于学习的技术1(原创系列)

近期几乎看了所有有关NERF技术论文,本身我研究的领域不在深度学习技术方向,是传统的机器人控制和感知。所以总结了下这部分基于学习的感知技术,会写一个新的系列教程讲解这部分三维感知技术的发展到最新的技术细节,并支持自己最近…

娱乐圈发生震动,AI大模型技术已经取代了SNH48的小偶像?

自2023年以来,全球都被包裹在AI的惊天大潮之中,所有行业都在主动或被动地迎接改变。目前,各行业已经有大量公司正在把AI作为自身发展的最佳路径。其中,娱乐行业作为最被人们熟知的行业也在面对AI的发展时,发生着巨大变…

解析Java中1000个常用类:Currency类,你学会了吗?

在线工具站 推荐一个程序员在线工具站:程序员常用工具(http://cxytools.com),有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。程序员资料站 推荐一个程序员编程资料站:程序员的成长之路(http://cxyroad.com),收录了一些列的技术教程…

解析connectionReset异常的原因与解决方案

解析connectionReset异常的原因与解决方案 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java中connectionReset异常的原因及其解决方案。这…

遥远星辰中的觉醒:超大质量黑洞的苏醒与人类的未来

遥远星辰中的觉醒:超大质量黑洞的苏醒与人类的未来 在浩渺无垠的宇宙中,星辰的闪烁仿佛是时间的涟漪,穿越亿万年的距离,抵达我们的眼眸。而在这片星辰大海的深处,一个惊人的现象正在悄然上演——距离地球3.6亿光年之遥…

Unity获取剪切板内容粘贴板图片文件文字

最近做了一个发送消息的unity项目,需要访问剪切板里面的图片文字文件等,翻遍了网上的东西,看了不是需要导入System.Windows.Forms(关键导入了unity还不好用,只能用在纯c#项目中),所以我看了下py…

GMSB文章九:微生物的相关关系组间波动

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 介绍 计算配对微生物在组间的相关关系波动情况进而评估不同分组的微生物状态。secom_linear 函数…

线性表与顺序存储结构(下)

前言 接上文(线性表与顺序存储结构(上))。 这些顺序存储结构的方法在顺序表上下卷中已经提到过,但是有些许不同,可以为理解顺序表提供更丰富的视角。(不过最主要的区别在于顺序表上下卷中的顺…