首页 新闻 会员 周边 捐助

一个 new Number 和Number的区别

-1
[已解决问题] 解决于 2016-03-27 23:53

var a=new Number(3);
var b=Number(3);
var c=3;
var d=new Object(3);
var f=Object(3);
document.write(a==b);
// console.log(typeof a);
// document.write("\n");
document.write(a==c);
// document.write("\n");
document.write(c==d);
// document.write("\n");
document.write(a==d);//false
// document.write("\n");
document.write(b==d);
// document.write("\n");
document.write(f==d);//false

__Construct的主页 __Construct | 初学一级 | 园豆:57
提问于:2016-03-25 19:03
< >
分享
最佳答案
0

ES5规范

"When Number is called as a function rather than as a constructor, it performs a type conversion."

MDN社区Number

"In a non-constructor context (i.e., without the new operator), Number can be used to perform a type conversion."

 

当没有使用new操作符的时候,调用Number()函数将会执行类型转换,其结果将是执行ToNumber(value)后的返回值。所以Number(3)返回3,并且是number基本类型。

楼主的例子可以用严格相等(===)改进一下,会更容易理解,参见:JavaScript 中的相等性判断

奖励园豆:5
_better | 菜鸟二级 |园豆:207 | 2016-03-27 23:13

a 和 b相等,为什么f和d不相等?

__Construct | 园豆:57 (初学一级) | 2016-03-27 23:56

@JerryMark: 当你用函数形式调用Object()方法并传入一个参数,将会执行如下操作:1.如果(参数的)值是null、undefined或者未传值,将会创建并返回一个Object对象,与调用内建的Object()构造函数的返回值是一样的。 2.否则返回ToObject(value)的结果。由ToObject可知,Object(3)返回的将是一个Number对象,如何证明呢?看下面:

"When the Object function is called with no arguments or with one argument value, the following steps are taken:

  1. If value is null, undefined or not supplied, create and return a new Object object exactly as if the standard built-in Object constructor had been called with the same arguments (15.2.2.1).
  2. Return ToObject(value)."
1 var d = new Object(3);
2 var f = Object(3);
3 
4 console.log(typeof d);  // 对象
5 console.log(typeof f);  // 对象
6 console.log(d instanceof Number);  // Number对象,注意不是number primitive(Number基本类型),而是Primitive wrapper objects(基本类型包装对象,此处就是Number包装对象),下同
7 console.log(f instanceof Number);

 

既然d和f是相同类型(object)为什么不相等呢?因为你比较的是两个引用类型(reference,也就是object/对象类型),简单说引用类型比较内存地址当然不是同一个对象,复杂来说看规范The Abstract Equality Comparison Algorithm (毫不留情的走到step 10然后return false)。再扩展一点,为什么基本类型的3和值是3的Number对象比较会返回true呢?看规范喽~(step 8 / step 9)

 

说了好多,我要写个博客整理下 ==

_better | 园豆:207 (菜鸟二级) | 2016-03-28 12:23

@_better: 哦,好的,你整理好给个地址我看下

__Construct | 园豆:57 (初学一级) | 2016-03-28 12:27

@JerryMark: http://www.cnblogs.com/thinking-better/p/5330120.html

_better | 园豆:207 (菜鸟二级) | 2016-03-30 19:24
其他回答(1)
0

可以把Number()理解为一个普通的将其他类型转换为数字的函数,将new Number()理解为对象的构造函数,

那么Number(3),得到数值 3,new Number() 得到了一个Number对象。

呆尐兔兔 | 园豆:342 (菜鸟二级) | 2016-03-25 21:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册