一個非常簡單的問題,有沒有曾經在那裏用原始數據類型是在JavaScript中最好的情況下,我特別是通過原始的布爾困擾,考慮下面的代碼在JavaScript中有沒有使用原始變量?
var bool = new Boolean(false);
if (bool){
alert(bool);
}
將alert
但你會得到false
,這有點令人困惑(false
!= falsy)。
所以在使用原始數據類型,特別是原始布爾值時,有沒有過這樣的一點?
一個非常簡單的問題,有沒有曾經在那裏用原始數據類型是在JavaScript中最好的情況下,我特別是通過原始的布爾困擾,考慮下面的代碼在JavaScript中有沒有使用原始變量?
var bool = new Boolean(false);
if (bool){
alert(bool);
}
將alert
但你會得到false
,這有點令人困惑(false
!= falsy)。
所以在使用原始數據類型,特別是原始布爾值時,有沒有過這樣的一點?
的原始值是非常有用的(原始值例如:真,假零,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());
這些不是原始的。原語是像100
,"foobar"
,false
:
> typeof false
"boolean"
> typeof new Boolean(false)
"object"
new Boolean
(或Number
或String
)是一個對象,並遵循對象,而不是原語的比較規則,布爾轉換等。這些對象確實是一個幾乎不有用JS程序員(而不是內部使用它們的JS引擎)。
請注意,雖然很少需要使用Boolean
和朋友來構建對象(如x = new Boolean(...)
),但這些功能本身有時很有用。例如,以下nice成語從數組中刪除所有falsy值:
ary = ary.filter(Boolean)
這是一個相當不錯的用例! – C5H8NNaO4
你舉的例子:
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對象,你不能分配屬性true
和false
。例如,在構建具有可鏈式方法的邏輯處理庫時,您可能希望從布爾對象繼承。
我知道它給出了什麼,爲什麼,我問是否使用它。 –
好吧,我試圖推斷你寫的文字和你給的代碼的含義。你已經把你對閱讀理解的缺乏與此聯繫在一起,並且導致你提出一個後續問題,這隻會讓我重申已經給出的答案的一部分。也許你應該多學習一些基礎知識,使用布爾對象的原因與簡單的真假相反是顯而易見的。 – Kastor
我認爲「在使用原始數據類型,特別是原始布爾值時,有沒有過這樣一個點?」很明顯 –
您在混合_value holder_和_value_。雖然_value_可以被視爲false,但它是_holder_是一個對象,因此被視爲true –