hasOwnProperty()
方法用于检查给定对象中是否包含指定的属性。
对象.hasOwnProperty(属性名)
其中:
对象
是要检查的 JavaScript 对象。
属性名
是要检查的属性的名称(字符串类型)。
如果给定对象包含指定的属性,则返回
true
;否则,返回
false
。
hasOwnProperty()
方法主要用于检查对象中是否包含某个属性,而不考虑该属性是从原型链继承的还是直接定义在该对象上的。与
in
运算符不同,它只检查对象本身,而不考虑原型链上的属性。
例如,以下代码使用
hasOwnProperty()
方法检查
person
对象是否直接包含
name
属性:
const person = {name: "John Doe",age: 30
};if (person.hasOwnProperty("name")) {console.log("该对象直接包含 'name' 属性。");
}
输出:
该对象直接包含 'name' 属性。
JavaScript 中的对象可以从原型链继承属性。当使用
in
运算符时,它会检查对象本身和整个原型链,以确定属性是否存在。但是,
hasOwnProperty()
方法只检查对象本身,不考虑原型链上的属性。
例如,假设我们有一个
Car
类,定义了
make
属性,而
Toyota
类继承自
Car
类。以下代码使用
in
运算符和
hasOwnProperty()
方法来检查
toyota
对象是否包含
make
属性:
class Car {constructor(make) {this.make = make;}
}class Toyota extends Car {
}const toyota = new Toyota("Toyota");console.log("使用 'in' 运算符:" + ("make" in toyota));
console.log("使用 'hasOwnProperty' 方法:" + toyota.hasOwnProperty("make"));
输出:
使用 'in' 运算符:true 使用 'hasOwnProperty' 方法:true
在第一个输出中,
in
运算符返回
true
,因为
make
属性通过原型链继承到
toyota
对象中。而在第二个输出中,
hasOwnProperty()
方法返回
true
,因为
make
属性直接定义在
toyota
对象的原型中。
hasOwnProperty()
方法在以下场景中很有用:
const person = {name: "John Doe",age: 30
};for (let key in person) {if (person.hasOwnProperty(key)) {console.log("该对象自身的可枚举属性:" + key);}
}
输出:
该对象自身的可枚举属性:name 该对象自身的可枚举属性:age在这个例子中,
for ... in
循环遍历了
person
对象的可枚举属性。我们使用
hasOwnProperty()
方法来过滤掉原型链上的继承属性,只输出对象自身的属性。
const person = {name: "John Doe",age: 30
};if (person.hasOwnProperty("occupation")) {console.log("该对象具有 'occupation' 属性。");
} else{console.log("该对象不具有 'occupation' 属性。");
}
输出:
该对象不具有 'occupation' 属性。在这个例子中,我们使用
hasOwnProperty()
方法来判断
person
对象是否具有
occupation
属性。由于该属性不存在,因此输出为
该对象不具有 'occupation' 属性。
。
hasOwnProperty()
方法在所有现代浏览器和 JavaScript 引擎中都得到广泛支持,包括:
请注意以下几点:
hasOwnProperty()
方法只检查对象本身,不考虑原型链上的属性。
hasOwnProperty()
方法时,属性名必须是一个字符串。
hasOwnProperty()
方法是一个有用的工具,用于确定给定对象中是否存在指定的属性。它仅检查对象本身,不考虑原型链上的属性。这使得它成为遍历对象自身的可枚举属性和判断对象是否具有某个属性的理想选择。
1、使用类的load()方法Properties p = new Properties();(in);2、使用类的getBundle()方法示例: ResourceBundle rb = (name, ());3、使用类的构造函数示例: InputStream in = new BufferedInputStream(new FileInputStream(name));ResourceBundle rb = new PropertyResourceBundle(in);4、使用class变量的getResourceAsStream()方法示例: InputStream in = (name);Properties p = new Properties();(in);5、使用()所得到的的getResourceAsStream()方法示例: InputStream in = ()(name);Properties p = new Properties();(in);6、使用类的getsystemResourceAsStream()静态方法示例: InputStream in = (name);Properties p = new Properties();(in);补充Servlet中可以使用的getResourceAsStream()方法示例:InputStream in = (path);
this关键字1)在类的内部代表对象本身,你应该看到过(),这种用法吧,this就代表这个类的对象,比如public class A {private String name;public void setName(String name) {//this就代表A的一个对象//当你实例一个A时,A a1 = new A();this就是那个a1,只是this在内部用,而a1在外部用//A a2 = new A()同理,这时在a2的内部,this就代表 = name;}}2)this的第二种用法,是用在构造函数里的当在构造器里要调用自己的其他构造器时,就用thisthis必须放在第一行public class A {private String name;public A() {this(no name);} public A(String name) { = name;//other codes}}super关键字1)显式的调用父类的方法当从一个类继承时,子类和父类都有一个同名方法,也就是子类覆盖了父类的方法,可是又想调用父类的方法,那么就要用super,像继承swing的类时就有个好例子public class MyPanel extends JPanel {@Overridepublic void paint(Graphics g) {(g);//如果不用super,那么就会调用自己的paint方法}}2)用在构造器,和this的用法一样,super也可以用在构造器,this是调用自己的其他构造器,那么super当然就是调用父类的构造器了-------------------------------------------------------super和this用在构造器的话,前者表示调用父类的够早器,后者表示调用本类的其他构造器,他们两个都必须是写在构造器里的第一行public class Person {private String name;private int age;public Person() {name = ;age = 0;} public Person(String n, int a) {name = n;age = a;}}public class Student extends Person {private String id;//学号 public Student(String name, int age) {super(name, age);//必须写在第一行,子类无法直接访问父类的私有属性,所以通过调用父类的构造器类初始化属性} public Student(String id, String name, int age) {this(name, age);//因为本类已经有个构造器初始化name和age了,所以交给他来做就行了,也必须写在第一行 = id;}}这个例子够清晰了吧
java的hashCode方法首先,想要明白hashCode的作用,你必须要先知道Java中的集合。 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。 你知道它们的区别吗?前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。 那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是方法了。 但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。 也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。 这显然会大大降低效率。 于是,Java采用了哈希表的原理。 哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。 如果详细讲解哈希算法,那需要更多的文章篇幅,我在这里就不介绍了。 初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际上并不是真正的在内存的物理地址,不过可以这样理解)。 这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。 如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。 所以这里存在一个冲突解决的问题。 这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。 所以, Java对于eqauls方法和hashCode方法是这样规定的:1、如果两个对象相同,那么它们的hashCode值一定要相同;2、如果两个对象的hashCode相同,它们并不一定相同 上面说的对象相同指的是用eqauls方法比较。 你当然可以不按要求去做了,但你会发现,相同的对象可以出现在Set集合中。 同时,增加新元素的效率会大大下降。 如果你改写了equal()方法,令两个实际不是一个对象的两个实例在逻辑上相等了,但是hashcode却是不等。 所以要记得改写hashcode。 不改写会带来什么后果呢?当然,比如你在用hashmap,hashtable之类的设计hashcode的类的时候,就会出麻烦了。 至于如何改写一个hashcode,这就有好有坏了,看各人的功底了。 现在还有专门的人在研究优秀的hash算法。 也就是说 List 是一个有序的、可重复的对象容器接口,Set是一个无序的、不可重复的对象容器接口 。 后面都讲了 Set 是如何实现不重复的 :为了避免多次重复的使用 equal 方法带来的系统负担 ,set 首先调用hashCode 方法来检测 是否被占用 如果被占用 然后调用 equal 方法判断被占用的是否相同
本文地址:https://www.badfl.com/article/433c13386d14b292c791.html
上一篇:hasownpropertyhasOwnProperty的作用...
下一篇:googlecomgoogleplay...