在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!!!
(从概念的角度来看,我有点理解这种区别。对象可以有其他属性,因此除非它们实际上是相同的,否则不应该相等。所以如果我们想要{{1}我们需要使用一个不是对象的类型。但任何充分动态的编程语言都面临着这种困境,但Javscript是我所知道的唯一一种有两种类型 - 一种是对象而一种不是 - 用于数字或字符串。 )
为数字,字符串和布尔值保留两个单独的表示形式有什么好处?在什么情况下,人们需要区分原始类型和对象?
答案 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也有盒装与未装箱的价值。