一个非常简单的问题,有没有曾经在那里用原始数据类型是在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 –