6

我似乎无法找到关于这两者之间有什么区别的明确解释。我还想指出,我也不太了解文字和值之间的区别。

布尔文字是否使用布尔对象?

4

3 回答 3

16

文字是您在脚本中按字面提供的值,因此它们是固定的。

值是“一段数据” 所以文字是一个值,但并非所有值都是文字。

例子:

1; // 1 is a literal
var x = 2; // x takes the value of the literal 2
x = x + 3; // Adds the value of the literal 3 to x. x now has the value 5, but 5 is not a literal.

对于问题的第二部分,您需要知道原语是什么。它比这更复杂一些,但您可以将它们视为“不是对象的所有类型”。Javascript 有 5 个,包括booleannumber。所以这些通常不是一个对象。

那为什么你仍然可以(152).toString()用 Javascript 做呢?这是因为一种称为强制的机制(在其他语言中也称为自动装箱)。当需要时,Javascript 引擎将在原语和它的对象包装器之间进行转换,例如booleanBoolean. 这是 Javascript 原语和自动装箱的绝佳解释

并不是说这种行为有时并不是你所期望的,尤其是在Boolean

例子:

true; // this is a `boolean` primitive
new Boolean(true); // This results in an object, but the literal `true` is still a primitive
(true).toString(); // The literal true is converted into a Boolean object and its toString method is called
if(new Boolean(false)) { alert('Eh?'); }; // Will alert, as every Boolean object that isn't null or undefined evaluates to true (since it exists)
于 2013-05-01T22:34:23.197 回答
0

是无法再评估的表达式。这意味着,这些是值:

  • X
  • 123
  • 真的
  • “asdqwe”

现在,文字是固定值表达式。从上面的列表中,以下是文字:

  • 123
  • 真的
  • “asdqwe”

所以,x有一个值,但不是固定的。

回答主要问题,布尔值只能有两个文字: falsetrue,每个布尔变量都是一个布尔值。

您会在大学的编译器或计算机语义课程中看到这一点,但是如果您仍然不了解其中的区别,此处链接的维基百科页面非常好。

于 2013-05-01T22:35:21.827 回答
0

!!x, Boolean(x),的比较值new Boolean(x).valueOf()

[true, false, null, undefined, 1, 0, NaN, Infinity, "true", "false", "", [], {}, new Boolean(false)]
.forEach(e => console.debug(
   [ !!e, Boolean(e), (new Boolean(e)).valueOf() ], e
))

// !!e, Boolean, valueOf
[true,  true,    true]   true
[false, false,   false]  false
[false, false,   false]  null
[false, false,   false]  undefined
[true,  true,    true]   1
[false, false,   false]  0
[false, false,   false]  NaN
[true,  true,    true]   Infinity
[true,  true,    true]   "true"
[true,  true,    true]   "false"
[false, false,   false]  ""
[true,  true,    true]   []
[true,  true,    true]   Object {}
[true,  true,    true]   Boolean {[[PrimitiveValue]]: false} // new Boolean(false)

笔记:

Boolean(x) === !!x

typeof true == "boolean"
typeof Boolean(x) == "boolean"
typeof new Boolean(x) == "object" // not boolean!
typeof Boolean == "function"

Boolean(new Boolean(false)) == true // <- any object converted to boolean is true!
Boolean(new Boolean(false).valueOf()) == false
于 2017-07-13T15:37:30.247 回答