Javascript原始类型和相应的对象

在Javascript中,并非每个数据都是对象。存在一些原始类型,如字符串,数字和布尔值,它们不是对象。对于每种类型,都存在一个构造函数,它输出一个具有相似行为的对象:
Number
String
Boolean
。为了混淆问题,实际上可以在原始类型上调用方法 - 它们将在此操作期间转换为相应的对象,然后转换回来。例如,人们可以做到
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!!!
(从概念的角度来看,我有点理解这种区别。对象可以有额外的属性,因此除非它们实际上是相同的,否则不应该相等。所以如果我们想要
4 === 4
,我们需要使用一个不是但是,任何充分动态的编程语言都会遇到这种困境,但Javscript是我所知道的唯一一种有两种类型 - 一种是对象的而一种不是 - 用于数字或字符串。)   为数字,字符串和布尔值保留两个单独的表示形式有什么好处?在什么情况下,人们需要区分原始类型和对象?     
已邀请:
  保持两个有什么好处   数字的单​​独表示,   字符串和布尔? 性能   在什么情况下可以需要   原始类型之间的区别   和物体? 想到了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     
  保留两个单独的表示形式有什么好处 正如您所指出的,您也可以在未装箱的值上调用方法(a.toFixed(1))。但是每次调用这样的方法时,这确实会导致转换,换句话说就是新的盒装对象(可能)的实例化。 所以那里有性能损失。如果显式创建盒装数字然后调用其方法,则不需要创建其他实例。 所以我认为两者兼顾的原因很多。 JavaScript最初只是一种简单的解释语言,这意味着性能很差,这意味着它们可以提高性能的任何(简单)方式都很重要,例如默认情况下使数字和字符串原语。 Java也有盒装和未装箱的价值。     

要回复问题请先登录注册