alert返回false而不是true?因为type是x和y的数字,并且根据===
的文档,它是一个严格的比较,它检查类型和值。
var x=8;
var y=new Number(8);
alert(typeof x);
alert(y===x);//false
PS:JavaScript的新手仍然了解基本概念。
答案 0 :(得分:1)
这是因为在使用new
进行实例化时类型为object
,即使该对象的名称为Number。
typeof y === "object"
答案 1 :(得分:1)
基本类型 Boolean , Number 和 String ,每个都有一个对应的对象表示,可以通过</body>
创建,new Boolean
等。正如我已经暗示的那样,那些返回对象。 对象是数字与数字不同,因此严格比较将返回new String
。
但是,这些构造函数并没有得到广泛使用,因为正如你所发现的那样,它们不能很好地与原语配合使用。封装与原语数值相同的值的false
对象不(严格地)等于所述原始值。
您可能更常见的是使用Number
函数而不使用Number
。如果在没有new
的情况下进行调用,则new
只需执行类型转换,即原语数字值。
那么我们为什么要拥有Number
,Number
和String
个对象?
事实证明,你一直在使用这些对象,而不是(可能)知道,例如当你做的时候
Boolean
在JavaScript中,只有对象可以拥有属性。原始值不能具有属性。然而,您可以调用"primitive".substring(0, 5)
方法,就好像它是值的属性一样。这是因为JavaScript会执行一些名为自动装箱的操作。当您尝试使用像对象这样的原始值时(例如,通过访问属性),JavaScript会在内部将原语暂时转换为其等效的对象版本。
答案 2 :(得分:0)
Y是一个对象而不是一个数字。新关键字引用对象。所以y是一个值为8的数字对象。
尝试 <ul>
<% TwitterApi.get_ronaldo_tweets.each do |tweet|%>
<li><%= tweet %></li>
<% end %>
</ul>
答案 3 :(得分:0)
当你var y=new Number(8);
时,它变成了一个对象,而不是一个数字,因此===
无法将两者都比较。
var x=8;
var y=new Number(8);
alert(typeof x);//number
alert(typeof y);//object
alert(y===x);//false
答案 4 :(得分:0)
首先,警报始终返回undefined
。但它在屏幕上打印东西。 console.log
会为您提供更详细,更丰富的信息。
这个问题有两个部分。首先,数字通常不是Number
个实例。第二个是任何类型的两个对象(两个实例)永远不会完全相同:
{}=={} // false
Number
问题现在转到Number
问题。虽然JavaScript中的所有数字在技术上都是Number
,但javascript并不会像这样对待它们,而且它们不是数字实例。这是我不太喜欢的东西,但它就是它的本质。如果按实例创建数字,则其行为与非对象值相同:
5 instanceof Number //false
typeof 5 // "number"
使用Number
构造函数创建数字会创建一个对象,该对象充当Number
:
new Number(5) instanceof Number //true
typeof new Number(5) // "object"
应该注意的是,这个对象实际上并不是很特别。你可以自己编号:
function MyNumber(val){ this.number = 1 * val || 0; } MyNumber.prototype.valueOf = function(){ 返回this.number; }
这将像Number
对象一样工作。当然,就像Number
对象一样,当你进行数学运算时,这会丢失:
typeof(MyNumber(6)+ MyNumber(4))//“number”
这实际上是有用的功能。但它在这背叛了你:
new Number(5)===new Number(5) //false
Number
实例永远不会与其他任何内容完全相同。