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
"When Number
is called as a function rather than as a constructor, it performs a type conversion."
"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 中的相等性判断
a 和 b相等,为什么f和d不相等?
@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 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: 哦,好的,你整理好给个地址我看下
@JerryMark: http://www.cnblogs.com/thinking-better/p/5330120.html
可以把Number()理解为一个普通的将其他类型转换为数字的函数,将new Number()理解为对象的构造函数,
那么Number(3),得到数值 3,new Number() 得到了一个Number对象。