Javascript原始类型和相应的对象

时间:2011-03-03 15:44:08

标签: javascript primitive-types

在Javascript中并非每个数据都是对象。存在一些原始类型,如字符串,数字和布尔值,它们不是对象。对于每种类型,都存在一个构造函数,它输出具有相似行为的对象:NumberStringBoolean。为了混淆问题,实际上可以调用基本类型的方法 - 它们将在此操作期间转换为相应的对象,然后转换回来。例如,可以做

var a = 4.1324;
a.toFixed(1) // outputs 4.1

然而,如果您尝试将基本类型和对象与严格相等进行比较,则差异会显示

var a = new Number(4);
var b = 4;
a === b; // False!!!
typeof a; // 'object'
typeof b; // 'number'

实际上,一个人试图比较对象,但无论如何它们都是不同的:

var a = new Number(4);
var b = new Number(4);
a === b; // False!!!

(从概念的角度来看,我有点理解这种区别。对象可以有其他属性,因此除非它们实际上是相同的,否则不应该相等。所以如果我们想要{{1}我们需要使用一个不是对象的类型。但任何充分动态的编程语言都面临着这种困境,但Javscript是我所知道的唯一一种有两种类型 - 一种是对象而一种不是 - 用于数字或字符串。 )

  

为数字,字符串和布尔值保留两个单独的表示形式有什么好处?在什么情况下,人们需要区分原始类型和对象?

2 个答案:

答案 0 :(得分:6)

  

保持两个人有什么好处   数字的单​​独表示,   字符串和布尔?

性能

  

在什么情况下可以需要   原始类型之间的区别   和对象?

考虑到了Coersion。在0 == false

new Number(0) != false

例如:

var a = new Boolean(false);
if(a) {
  //this code runs
}

var a = false;
if(a) {
  //this code never runs
}

您可以在此处详细了解coersion:http://webreflection.blogspot.com/2010/10/javascript-coercion-demystified.html

答案 1 :(得分:0)

  

保留两个单独的表示形式有什么好处

正如您所指出的,您也可以在未装箱的值上调用方法(a.toFixed(1))。但是每次调用这样的方法时,这确实会导致转换,换句话说就是新的盒装对象(可能)的实例化。

因此存在性能损失。如果显式创建一个盒装数字,然后调用其方法,则不需要创建更多实例。

所以我认为两者兼顾的原因很多。 JavaScript最初只是一种简单的解释语言,意味着性能很糟糕,这意味着它们可以提高性能的任何(简单)方式都很重要,例如默认情况下创建数字和字符串原语。

Java也有盒装与未装箱的价值。