JavaScript 中的物件包含同樣的屬性及相同的值,它們是相等的嗎?
當然不是相等的。
原因:物件的比較並非值得比較:即使兩個物件包含同樣的屬性及相同的值,它們也是不相等的各個索引元素完全相同的兩個陣列也不相等。
var o = {x:1},p = {x:1}; //具有相同屬性的兩個物件
o === p // => false:兩個單獨的物件永不相等
var a = [],b = []; //兩個單獨的空陣列
a === b; // => false:兩個單獨的陣列永不相等
我們通常將物件稱為引用型別(引用型別),以此來和JavaScript的基本型別區分開來。依照術語的叫法,物件值都是引用(reference),物件的比較均為引用的比較:當且僅當它們引用同一個基物件時,它們才相等。
var a = []; //定義一個引用空陣列的變數一
var b = a; //變數b引用同一個陣列
b [0] = 1; //通過變數b修改引用的陣列
a [0]; // => 1變數a也會修改
a === b; // => true; a和b引用同一個陣列,因此它們相等
這段程式碼第二行只是把陣列(或物件)賦值給一個變數,僅僅是賦值的引用值:物件本身並沒有複製一次如果想要一個物件或者陣列的副本,則必須顯式複製物件的每個屬性或陣列的每個元素。
var a = {'a','b','c','d'};
var b = {};
for(var i = 0; i <a.length; i ++){
b [i] = a [i];
}
所以我們怎麼比較兩個單獨的物件那個或者陣列呢?
。根據上一段程式碼的演示,我們可以想到同樣的方法,通過比較它們的屬性或者元素,來比較物件或陣列請看下面比較兩個陣列的函式:
function equalArrays(a,b){
if(a.length!= b.length)return false; //兩個長度不同的陣列不相等
for(var i = 0; i <a.length; i ++)
if(a [i]!== b [i])返回false; //如果有任意元素不相等,則陣列不相等
返回true; //否則它們相等
}
注:本文章有部分內容摘自書“JavaScript的權威指南第6版”
如果有錯誤的地方還請留言,大家一起討論一下,謝謝!