在javascript中有原始变量吗?

时间:2013-11-14 14:00:27

标签: javascript variables boolean-logic primitive

一个非常简单的问题,是否有一种情况,在javascript中使用原始数据类型是优选的,我特别困扰原始布尔值,请考虑以下代码

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

它会alert,但你会得到false,这有点令人困惑(false!= falsy)。

那么使用原始数据类型尤其是原始布尔值是否有意义?

3 个答案:

答案 0 :(得分:8)

这些不是原始的。基元类似于100"foobar"false

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

new Boolean(或NumberString)是一个对象并遵循对象',而不是基元的规则进行比较,布尔转换等。这些对象对JS来说确实很难用程序员(而不是内部使用它们的JS引擎)。

请注意,虽然很少需要使用Boolean和朋友来构造对象(如x = new Boolean(...)中所述),但这些函数本身有时很有用。例如,以下好习惯用法从数组中删除所有有价值的值:

ary = ary.filter(Boolean)

答案 1 :(得分:3)

原始值非常有用(原始值之外:true,false,null,1,2等)。你在问题中谈到的是围绕它们的Object包装器。

对象包装器非常有用,因为它允许您添加要在其上调用的函数。更重要的是,当您在原始值上调用方法时,将在它们上创建Object包装器,并在Object包装器上调用方法。

示例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

*)每次在原始值上调用方法时,都会创建不同的Object包装器:

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());

答案 2 :(得分:1)

你的例子:

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

并且你想知道为什么警告错误。

bool是变量,您在创建它时为其指定了值。所以,当你说if(bool) JavaScript做了一些强制并测试bool是否是假的,它不是,所以条件块执行。现在你在alert(bool),它将尝试调用对象的toString方法并显示结果。 boolean对象的toString方法将boolean对象的值作为字符串返回,因此,您会收到“false”警告。

来吧,试试

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

你会得到完全不同的结果。

这给我们带来了另一个问题:“为什么”你甚至使用布尔构造函数:你可以为布尔对象赋值属性,你不能将属性赋给truefalse。例如,在构建具有可链接方法的逻辑处理库时,您可能希望继承布尔对象。