コメント欄がないのでここでひっそりつっこんでおきます。
Stringと Boolean(と Numberと Date)だけこのように比較方法を === から == にしたりする必要はなくて、
String.prototype.equals = Boolean.prototype.equals = function(arg){ return this == arg; };
こう。
Object.prototype.equals = function(that) { return this.valueOf() === that.valueOf(); }
これでオブジェクトに関しては同一性をチェックし、プリミティブでは値が等しいかどうかをチェックする。
ところで、配列の場合、
valueOf メソッドの動作は、オブジェクトの種類に応じて異なります
配列の要素は、カンマによって連結される文字列に変換されます。Array.toString メソッドや Array.join メソッドと同じように動作します。
Microsoft JScript 5.5 リファレンス (chm)
と書かれていて同一性のチェックができなさそうに思えるけど、JScript5.7、Firefox(javascript1.5)ともにチェックできていた。
Array.prototype.valueOf() は String、Boolean、Number、Dateのそれと違って特別に用意されてはいなかった。
参照: 15.4 Array オブジェクト (Array Objects)
ということは Object.prototype.valueOf()が呼ばれるはずで、これは thisを返す。
var a = [1]; alert(a.valueOf() === a); // true
JScript5.5のいいかげんなリファレンスを書いた人、出てきなさい。(はじめての言語だった JScriptと HSPのヘルプには、変数の概念から始まる丁寧な説明を受けました。大変感謝しています)