Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中是否曾经使用过基元变量? 一个非常简单的问题,在JavaScript中是否有一个使用原始数据类型是比较好的,我特别担心原始布尔代数,考虑下面的代码 var bool = new Boolean(false); if (bool){ alert(bool); }_Javascript_Variables_Boolean Logic_Primitive - Fatal编程技术网

javascript中是否曾经使用过基元变量? 一个非常简单的问题,在JavaScript中是否有一个使用原始数据类型是比较好的,我特别担心原始布尔代数,考虑下面的代码 var bool = new Boolean(false); if (bool){ alert(bool); }

javascript中是否曾经使用过基元变量? 一个非常简单的问题,在JavaScript中是否有一个使用原始数据类型是比较好的,我特别担心原始布尔代数,考虑下面的代码 var bool = new Boolean(false); if (bool){ alert(bool); },javascript,variables,boolean-logic,primitive,Javascript,Variables,Boolean Logic,Primitive,它将发出警报,但您将得到错误,这有点令人困惑(错误!=falsy) 那么,使用基本数据类型,特别是基本布尔值有什么意义呢?这些不是基本数据类型。原语类似于100,“foobar”,false: > typeof false "boolean" > typeof new Boolean(false) "object" new Boolean(或Number或String)是一个对象,遵循对象,而不是用于比较、布尔转换等的原语规则。这些对象对于JS程序员来说确实没有什么用处(与内部使用

它将发出
警报
,但您将得到
错误
,这有点令人困惑(
错误
!=falsy)


那么,使用基本数据类型,特别是基本布尔值有什么意义呢?

这些不是基本数据类型。原语类似于
100
“foobar”
false

> typeof false
"boolean"
> typeof new Boolean(false)
"object"
new Boolean
(或
Number
String
)是一个对象,遵循对象,而不是用于比较、布尔转换等的原语规则。这些对象对于JS程序员来说确实没有什么用处(与内部使用它们的JS引擎相反)

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

ary = ary.filter(Boolean)

原语值非常有用(原语值除外:true、false、null、1、2等)。你在问题中谈论的是它们周围的对象包装

对象包装器很有用,因为它允许您添加要在其上调用的函数。更重要的一点是,当您在原语值上调用方法时,会在原语值上创建对象包装,并在对象包装上调用方法*

示例1:String

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'
演示:

*)每次对基元值调用方法时,都会创建不同的对象包装器:

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());
你的例子是:

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);
}
你会得到完全不同的结果


这就引出了您的另一个问题“为什么”您甚至会使用布尔构造函数:您可以将属性分配给布尔对象,您不能将属性分配给
true
false
。例如,在使用可链接方法构建某些逻辑处理库时,您可能希望从布尔对象继承。

您正在混合值持有者和值。虽然值可以被视为false,但它的持有者是一个对象,因此被视为true,这是一个非常好的用例!我知道它给出了什么以及为什么,我在问你是否曾经使用过它。好吧,我试着从你写的单词和你给出的代码中推断出你的意思。你把你的阅读理解能力的缺乏与此联系在一起,这导致你提出了一个后续问题,这只会让我重申已经给出的部分答案。也许你应该进一步学习基础知识,使用布尔对象而不是简单的真或假的原因是显而易见的。我认为“使用原始数据类型,特别是原始布尔值有意义吗?”很明显你对原始值的定义有缺陷,尽管我给出了使用布尔值的对象和标量表示的理由。