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,display
    console.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.mfbz.cn/a/764194.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

应急响应:应急响应流程,常见应急事件及处置思路

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 这一章节我们需…

【PWN · ret2syscall | GoPwn】[2024CISCN · 华中赛区]go_note

一道GoPwn,此外便是ret2syscall的利用。然而过程有不小的曲折,参考 返璞归真 师傅的wp,堪堪完成了复现。复现过程中,师傅也灰常热情回答我菜菜的疑问,感谢!2024全国大学生信息安全竞赛(ciscn&am…

【U8+】供应链-库存管理-库存展望

知识点:库存展望可查询展望期内存货的预计库存、可用量情况。 分析步骤一:在库存管理-设置-选项-可用量检查页签库存展望可用量公式中预计入库和预计出库进行勾选和对应仓库档案需要勾选纳入可用量计算 步骤二:库存展望查询条件维护展望日期以及存货和选择

深度学习笔记: 最详尽解释混淆矩阵 Confusion Matrix

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家! 混淆矩阵 假设我们有包含临床测量数据的医疗数据,例如胸痛、良好的血液循环、动脉阻塞和体重…

昇思25天学习打卡营第06天|网络构建

神经网络基础 神经网络是一种模拟人脑神经元工作方式的计算模型,它由多个层次的节点(神经元)组成,每个神经元接收输入、进行加权求和并经过非线性激活函数转换后输出到下一层或作为最终输出。 昇思模型中的mindspore.nn提供了常…

PHP商家来客宝小程序系统客户打卡赢霸王餐美食之旅嗨翻天

🎉商家来客宝大放送!🍽️ 🔥开篇福利预警! 嘿宝贝们,今天要给你们揭秘一个超级劲爆的吃货福利——“商家来客宝客户打卡吃霸王餐”活动!🎉 是不是已经听到肚子咕咕叫了呢&#xff…

类和对象(提高)

类和对象(提高) 1、定义一个类 关键字class 6 class Data1 7 { 8 //类中 默认为私有 9 private: 10 int a;//不要给类中成员 初始化 11 protected://保护 12 int b; 13 public://公共 14 int c; 15 //在类的内部 不存在权限之分 16 void showData(void)…

Django + Vue 实现图片上传功能的全流程配置与详细操作指南

文章目录 前言图片上传步骤1. urls 配置2. settings 配置3. models 配置4. 安装Pillow 前言 在现代Web应用中,图片上传是一个常见且重要的功能。Django作为强大的Python Web框架,结合Vue.js这样的现代前端框架,能够高效地实现这一功能。本文将…

GraphPad Prism生物医学数据分析软件下载安装 GraphPad Prism轻松绘制各种图表

Prism软件作为一款功能强大的生物医学数据分析与可视化工具,其绘图功能尤为突出。该软件不仅支持绘制基础的图表类型,如直观明了的柱状图、展示数据分布的散点图,以及描绘变化趋势的曲线图,更能应对复杂的数据呈现需求&#xff0c…

【Python】已解决:urllib.error.HTTPError: HTTP Error 403: Forbidden

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:urllib.error.HTTPError: HTTP Error 403: Forbidden 一、分析问题背景 在使用Python的urllib库中的urlopen或urlretrieve函数下载文件时,有时会遇到…

指哪打哪,重绘神器!我已出手…

最近AI界又爆出了一个大新闻,阿里巴巴、香港大学和蚂蚁集团的研究人员联合推出了一款超厉害的AI工具——MimicBrush,它的问世,无疑给图像编辑领域带来了一场革命,它就像魔法师手中的魔杖,轻轻一挥,就能让图…

C# Web控件与数据感应之属性统一设置

目录 关于属性统一设置 准备数据源 范例运行环境 AttributeInducingFieldName 方法 设计与实现 如何根据 ID 查找控件 FindControlEx 方法 调用示例 小结 关于属性统一设置 数据感应也即数据捆绑,是一种动态的,Web控件与数据源之间的交互&…

高编:线程(2)——同步与互斥

一、互斥 概念: 互斥 》在多线程中对 临界资源 的 排他性访问。 互斥机制 》互斥锁 》保证临界资源的访问控制。 pthread_mutex_t mutex; 互斥锁类型 互斥锁变量 内核对象 框架: 定义互斥锁 》初始化锁 》加锁 》解锁 》销…

vite+vue集成cesium

1、创建项目、选择框架vuejs pnpm create vite demo_cesium 2、进入项目安装依赖 cd demo_cesium pnpm install3、安装cesium及插件 3、pnpm i cesium vite-plugin-cesium 4、修改vite-config.js import { defineConfig } from vite import vue from vitejs/plugin-vue impo…

Github忘记了Two-factor Authentication code

意外重置了edge浏览器 码农家园github自从开启开启了2FA认证,每次输入auth code确实麻烦,于是下载了浏览器插件 Open two factor authenticator, 最近edge频繁宕机,而且提示磁盘空间不足,要不要立即清理并重置浏览器临…

TS_开发一个项目

目录 一、编译一个TS文件 1.安装TypeScript 2.创建TS文件 3.编译文件 4.用Webpack打包TS ①下载依赖 ②创建文件 ③启动项目 TypeScript是微软开发的一个开源的编程语言,通过在JavaScript的基础上添加静态类型定义构建而成。TypeScript通过TypeScript编译器或…

单片机软件架构连载(2)-指针

我工作了10年,大大小小做过几十个项目,用指针解决过很多实际产品的痛点,比如写过小系统,数据结构(队列,链表),模块化编程等等..... 今天贴近实际,给大家总结了c语言指针常用的知识点&#xff0c…

用可视化的方式学统计学

本次分享一个统计学学习工具:看见统计。 看见统计致力于用数据可视化 (使用D3.js完成) 让统计概念更容易理解,源于布朗大学几位作者👇 看见统计共有6个章节, 下面来看看具体内容, 中心极限定理 对于一个(性质比较好的)分布,如果我们有足够大的独立同分布的样本,其…

【C语言】刷题笔记 Day1

多刷题 多思考 【题目1】 实现字母的大小写转换,实现多组输入输出 1. getchar 为输入函数,EOF(end of file)为文件结束标志,通常为文件结束的末尾。 2. 题目中要求实现多组输入输出,那我们用 while 循…

学习无人机飞行技术,有哪些就业方向?

随着无人机技术的不断进步和应用领域的拓展,研发创新人才的需求也将不断增加,那就业前景还是很广阔的。学习无人机飞行技术后,有以下多个就业方向可供选择: 1. 无人机操作员: - 负责操控和监控无人机飞行,…