如何判断两个对象是否相等? 你可能会认为,如果两个对象有相同的属性,以及它们的属性有相同的值,这两个对象就是相等的,但是并不是这样。看如下案例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
// 对象的定义方法一:对象字面量
var person = {
name:'xpf',
age:23,
gender:'male'
}
// 对象的定义方法二:构造函数
var animal = new Object();
animal.name = 'xpf';
animal.age = 23;
animal.gender = 'male';
console.log(typeof(person),person); //object {name:'xpf',age:23,gander:'male'}
console.log(typeof(animal),animal); //object {name:'xpf',age:23,gander:'male'}
console.log(animal == person); // false
console.log(animal === person); // false
</script>
</body>
</html>
实际输出结果如下:
通过上面的例子可以看到,无论使用"=="还是"===",都返回false。主要原因是在js中,基本数据类型string,number等是通过值来比较,而对象是通过指针指向的内存中的地址来做比较。再看下面一个例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
// 对象的定义方法一:对象字面量
var person = {
name:'xpf',
age:23,
gender:'male'
}
// 对象的定义方法二:构造函数
var animal = new Object();
animal.name = 'xpf';
animal.age = 23;
animal.gender = 'male';
var haha = person;
console.log(typeof(person),person); //object {name:'xpf',age:23,gander:'male'}
console.log(typeof(animal),animal); //object {name:'xpf',age:23,gander:'male'}
console.log(typeof(haha),haha); //object {name:'xpf',age:23,gander:'male'}
console.log(haha == person); // true
console.log(haha === person); // true
console.log(animal == haha); // false
console.log(animal === haha); // false
</script>
</body>
</html>
上例返回true的,是因为person和haha的指针指向了内存中的同一个地址。和面向对象的语言(Java/C++)中值传递和引用传递的概念相似。
所以两个对象有相同的属性,以及它们的属性有相同的值,并不一定相等。
对象person和animal在初始化的时候,会在堆内存中开辟两块内存,分别存储各自的值
访问对象的方法:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
var person = {
name:'xpf',
age:23,
gender:'male'
}
// 访问对象的第一种方法 .
console.log(person.name); // xpf
// 访问对象的第二种方法 []
console.log(person['name']); // xpf
</script>
</body>
</html>
实际输出结果: