2013-11-14 48 views
3

一個非常簡單的問題,有沒有曾經在那裏用原始數據類型是在JavaScript中最好的情況下,我特別是通過原始的布爾困擾,考慮下面的代碼在JavaScript中有沒有使用原始變量?

var bool = new Boolean(false); 
if (bool){ 
    alert(bool); 
} 

alert但你會得到false,這有點令人困惑(false!= falsy)。

所以在使用原始數據類型,特別是原始布爾值時,有沒有過這樣的一點?

+4

您在混合_value holder_和_value_。雖然_value_可以被視爲false,但它是_holder_是一個對象,因此被視爲true –

回答

3

的原始值是非常有用的(原始值例如:真,假零,1,2等)。你在談論的問題是它們周圍的對象包裝。

對象包裝很有用,因爲它允許您添加要在其上調用的函數。還有一件更重要的事情是,當你調用原始值的方法時,會在它們上面創建Object wrappers,並在Object wrappers *上調用方法。

實施例1:字符串

String.prototype.sayHello = function() { 
    return this + ' says hello'; 
}; 

// calling a method on a string literal temporarily converts it to a String 
console.log('John'.sayHello()); // 'John says hello' 

實施例2:布爾

var bool = new Boolean(false); 
console.log(bool); // Boolean 
console.log(bool.toString()); // 'false' 
console.log(bool.valueOf()); // false 

// How you can use it: 
Boolean.prototype.toCaps = function() { 
    return this.valueOf().toString().toUpperCase(); 
}; 

console.log(bool.toCaps()); // 'FALSE' 

// calling a method on a boolean literal temporarily converts it to a Boolean 
console.log(true.toCaps()); // 'TRUE' 
console.log((1 === 1).toCaps()); // 'TRUE' 

DEMO:http://jsbin.com/apeGOve/1/edit

*)不同的對象的包裝均由方法被調用時創建在原始值上:

String.prototype.getWrapper = function() { return this; }; 
String.prototype.setTest = function() { this.test = 'test' }; 
String.prototype.getTest = function() { return this.test; }; 

var str = '123'; 
console.log('Different wrappers each time',str.getWrapper() === str.getWrapper()); 

var wrapper = str.getWrapper(); 
wrapper.setTest(); 
console.log(wrapper.getTest()); 
console.log(str.getTest()); 
8

這些不是原始的。原語是像100"foobar"false

> typeof false 
"boolean" 
> typeof new Boolean(false) 
"object" 

new Boolean(或NumberString)是一個對象,並遵循對象,而不是原語的比較規則,布爾轉換等。這些對象確實是一個幾乎不有用JS程序員(而不是內部使用它們的JS引擎)。

請注意,雖然很少需要使用Boolean和朋友來構建對象(如x = new Boolean(...)),但這些功能本身有時很有用。例如,以下nice成語從數組中刪除所有falsy值:

ary = ary.filter(Boolean) 
+0

這是一個相當不錯的用例! – C5H8NNaO4

1

你舉的例子:

var bool = new Boolean(false); 
if (bool){ 
    alert(bool); 
} 

和你想知道爲什麼它提醒假的。

bool是變量,您在創建它時爲它分配了一個值。所以,當你說if(bool) JavaScript做了一些強制並測試bool是否是虛假的,它不是,所以條件塊執行。現在你在alert(bool),它會嘗試調用你的對象的toString方法並顯示結果。布爾對象的toString方法以字符串的形式返回布爾對象的值,所以你會得到警告的單詞「false」。

來吧,試試

var bool = new Boolean(false); 
bool.toString = function() { 
    return 'I need a banana'; 
} 
if (bool){ 
    alert(bool); 
} 

,你會得到完全不同的結果。

這給我們帶來的您的其他問題「爲什麼」,你甚至會使用布爾構造函數:您可以指定屬性的Boolean對象,你不能分配屬性truefalse。例如,在構建具有可鏈式方法的邏輯處理庫時,您可能希望從布爾對象繼承。

+0

我知道它給出了什麼,爲什麼,我問是否使用它。 –

+1

好吧,我試圖推斷你寫的文字和你給的代碼的含義。你已經把你對閱讀理解的缺乏與此聯繫在一起,並且導致你提出一個後續問題,這隻會讓我重申已經給出的答案的一部分。也許你應該多學習一些基礎知識,使用布爾對象的原因與簡單的真假相反是顯而易見的。 – Kastor

+0

我認爲「在使用原始數據類型,特別是原始布爾值時,有沒有過這樣一個點?」很明顯 –