2010-05-02 44 views
4

前一段時間我寫了一個blog post,詳細描述瞭如何在JavaScript(針對Number,String和Boolean等事物)中引用基本對象和對象封裝的值類型導致麻煩,包括但不限於類型轉換爲布爾型例如對象包裝的NaN,「」和false實際上是類型轉換爲true)。JavaScript中基本和對象封裝值的可用性是否有用?

我的問題是,帶着所有這些困惑和問題,對於具有內置類的兩種類型的值的JavaScript,是否有任何好處?

編輯:感謝您的快速解答。我認爲,JavaScript的創建者打算封裝原生作爲一種使標量值​​具有子方法的方式,但是它顯然不適用,導致更多問題。

+0

@Delan:開始時,爲了讓Java開發者能夠輕鬆地使用JavaScript,開始付出了很大的努力。這可能很容易成爲實現這一目標的一次(不成功)嘗試。作爲這種情況有多糟糕的一個例子:即使布爾值對象的值爲false,它也會始終評估爲真。 – 2010-05-02 11:02:02

+0

我只是將它們視爲實現細節來爲文字提供原型。 – eyelidlessness 2010-05-02 11:09:29

回答

0

與許多語言一樣,JavaScript也有很好的零件和不好的零件

這是真的很差的零件之一

恕我直言,真的沒有太大的好處,只有傷害,從打字包裝。

我們的朋友道格拉斯克羅克福德已經遍及這個問題,事實上他從第一天起就反對它。這就是你需要知道的一切。

0

道格拉斯克羅克福德雖然是那裏最聰明的人之一,但不是上帝 - 他所說的一切都不應該盲目追隨。事實上,在某種情況下,您希望對原始類型使用包裝 - 如果您想通過引用傳遞值。

原始值總是由值周圍傳遞,並通過引用對象。所以,如果由於某種原因,您需要通過參考通過號碼,那麼你可以用數字對象來做到這一點。在不丟失引用(AFAIK)的情況下,實際上不能改變數字的值,但可以像任何對象一樣隨意添加其他參數 - 這是基本數字不支持的。

var nr1 = new Number(123), 
    nr2 = nr1; // reference to nr1 
nr1.name = "number"; //parameter "name" for nr1 is set AFTER the initialization of nr2 
alert(nr2.name); // nr2 has the same parameter as nr1 
+0

你也可以爭辯說,通過引用傳遞不可變原語的範圍是有限的,因爲正如你所說的那樣,值不能被修改。你可以像你的例子那樣添加額外的字段,但是我不知道在實踐中這是否應該用**原始**類型來完成。 – 2010-05-02 11:41:07

+0

我同意這不是最實際的用法,但我的觀點是要顯示原語和包裝對象之間的實際區別,而不是說明克羅克福德已經說了一些,所以我們必須遵守。我從來沒有使用**新數字**,因爲有更好的方法來完成相同的行爲,但如果有人想使用它,那麼我看不出爲什麼他/她不應該。 – Andris 2010-05-02 11:49:12

+0

@Andris:我認爲這是因爲他們「完全沒有必要,偶爾也會感到困惑」。他們是沒有必要的,因爲正如你所說,「有更好的方法來完成同樣的行爲」。而且他們偶爾會感到困惑,因爲在這種情況下'b'評估爲true:'var b = new Boolean(false);如果(b){alert(b)}' – 2010-05-02 12:00:32

相關問題