欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > JavaScript——属性的检测和枚举

JavaScript——属性的检测和枚举

2024/10/24 19:19:44 来源:https://blog.csdn.net/m0_73614626/article/details/140089444  浏览:    关键词: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*********/
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com