2013-11-14 15 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

我认为“在使用原始数据类型,特别是原始布尔值时,有没有过这样一个点?”很明显 –

相关问题