原始值
原始值包括undefined null 布尔值 数字 字符
原始值是不可更改的
字符串的操作比如str.toUpperCase()
不会改变str的值,只是返回一个新的原始值
原始值的比较是值的比较
var s1 = 'hello', s2 ='hello'
s1 == s2 //true
s1 === s2 //true
对象
对象是可变的
var person = {name:'Mike',age:18}
person.age = 22
var a = [1,2,3] //数组也是对象
a[1] = 5
对象的比较不是值的比较:即使两个对象有相同的属性,属性的值也相等,它们也不相等,两个单独的对象永不相等
var p1 = {name:'mike',age:18}, p2 = {name:'mike',age:18}
p1 == p2 //false
p1 === p2 //false
var a = [1,2], b =[1,2]
a == b //false
a === b //false
对象又被成为引用类型(reference type),区分于基本类型,对象的值都是引用,对象的比较是引用的比较,即只有两个引用了同一个对象,它们才相等。
两个对象变量引用同一个对象,则值同时变化
var p1=p2={name:'Mike',age:18}
p1.age = 22
p2.age //22
所以建立对象的副本,要建立一个新的对象,然后逐个拷贝对象的属性。
var p1={name:'Mike',age:18}
var p2 = {}
p2.name = p1.name
p2.age = p1.age
p2 // {name: "Mike", age: 18}
总结:
基本类型即原始值的比较是值的比较,对象是引用的比较。