为什么新的数字(8)不完全等于8?

时间:2015-11-13 15:23:25

标签: javascript

alert返回false而不是true?因为type是x和y的数字,并且根据===的文档,它是一个严格的比较,它检查类型和值。

var x=8;
var y=new Number(8);
alert(typeof x);
alert(y===x);//false

PS:JavaScript的新手仍然了解基本概念。

5 个答案:

答案 0 :(得分:1)

这是因为在使用new进行实例化时类型为object,即使该对象的名称为Number。

typeof y === "object"

答案 1 :(得分:1)

基本类型 Boolean Number String ,每个都有一个对应的对象表示,可以通过</body>创建,new Boolean等。正如我已经暗示的那样,那些返回对象对象数字数字不同,因此严格比较将返回new String

但是,这些构造函数并没有得到广泛使用,因为正如你所发现的那样,它们不能很好地与原语配合使用。封装与原语数值相同的值的false对象不(严格地)等于所述原始值。

您可能更常见的是使用Number函数而不使用Number。如果在没有new的情况下进行调用,则new只需执行类型转换,即原语数字值。

那么我们为什么要拥有NumberNumberString个对象?

事实证明,你一直在使用这些对象,而不是(可能)知道,例如当你做的时候

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实例永远不会与其他任何内容完全相同。