var a = function() {console.log(11)};
var b = function() {console.log(11)};
console.log( a==b ); //false
js中基本數(shù)據(jù)類型和引用數(shù)據(jù)類型
基本類型:存放在棧內(nèi)存中,數(shù)據(jù)大小確定崔步,內(nèi)存空間大小可以分配
引用類型:存放在堆內(nèi)存中的對象稳吮,每個空間大小不一樣,根據(jù)情況進行特定的分配
當需要訪問引用數(shù)據(jù)類型時井濒,首先從棧中獲取該對象的地址指針灶似,然后再從堆內(nèi)存中取得所需的數(shù)據(jù)慎陵。
則console.log( a==b ); 返回false。
a和b都是保存了指向堆內(nèi)存中對象的指針喻奥,但是是兩個對象,只是這兩個對象的值相等捏悬。
如果var a = {};var b = a;這時變量b保存的是變量a保存的指針撞蚕,都指向堆內(nèi)存的同一個對象,因此a==b返回true过牙。
var a = [1,2,3,4,5];
var b = a;
var c = a[0];
console.log(b); // [1,2,3,4,5]
console.log(c); // 1
b[4] = 6;
c = 7;
console.log(a[4]); //6
console.log(a[0]); //1
傳值和傳址的區(qū)別甥厦。a是數(shù)組,屬于引用類型寇钉,b中存入的是棧中的地址刀疙,不是堆內(nèi)存中的對象。而c中只是獲取從a堆內(nèi)存中獲取的一個數(shù)值扫倡,并保存在棧中谦秧,所以b修改的時候,會根據(jù)地址到a堆內(nèi)存中修改撵溃,c則直接在棧中修改疚鲤,并不能修改堆內(nèi)存中的內(nèi)容。
在比較對象的相等性問題時:
相等和不相等--------先轉(zhuǎn)換再比較(==)
全等和不全等--------只比較不轉(zhuǎn)換(===)
console.log( {}=={} ); //false
console.log( []==[] ); //false
兩個操作值都是對象缘挑,比較兩個對象是不是同一個對象
console.log([] == ![]); //true
集歇!操作符會將[]轉(zhuǎn)換為boolean型,再對其求反為false语淘,再進行比較诲宇,boolean值轉(zhuǎn)換為0,[]轉(zhuǎn)換為數(shù)值0,則相等
console.log({} == !{}); //false
console.log(Boolean([])) //true
console.log(Boolean(![])) //false
console.log([] == ![]) //true
console.log(Boolean(!{})) //false
console.log(Number([])) //true
console.log(Number({})) //NaN
console.log(Number(!{})) //0
console.log({} == !{}) //false
比較按照
(1)如果一個操作值為布爾值惶翻,則在比較之前先將其轉(zhuǎn)換為數(shù)值
(2)如果一個操作值為字符串姑蓝,另一個操作值為數(shù)值,則通過Number()函數(shù)將字符串轉(zhuǎn)換為數(shù)值
(3)如果一個操作值是對象维贺,另一個不是它掂,則調(diào)用對象的valueOf()方法,得到的結(jié)果按照前面的規(guī)則進行比較
(4)null與undefined是相等的
(5)如果一個操作值為NaN溯泣,則相等比較返回false
(6)如果兩個操作值都是對象虐秋,則比較它們是不是指向同一個對象
console.log(NaN==undefined); //false
console.log(null==undefined);//true
console.log(null==NaN);//false