Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么字符串有时会在javascript中变为数字?_Javascript - Fatal编程技术网

为什么字符串有时会在javascript中变为数字?

为什么字符串有时会在javascript中变为数字?,javascript,Javascript,我有以下代码: function getSessionGUID() { return (S4()+S4()); } function S4() { return (((1+Math.random())*0x10000)|0).toString(16).substring(1); } 它显然返回一个字符串,但如果您多次运行它,您会注意到它有时返回无穷大 for (var i = 0; i < 100000; i++){ if(getSessionGUID() == Infin

我有以下代码:

function getSessionGUID() {
   return (S4()+S4());
}

function S4() {
   return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}
它显然返回一个字符串,但如果您多次运行它,您会注意到它有时返回无穷大

for (var i = 0; i < 100000; i++){ if(getSessionGUID() == Infinity) console.log("INFINITY"); }
871 x INFINITY
结果:

for (var i = 0; i < 100000; i++){ if(getSessionGUID() == Infinity) console.log("INFINITY"); }
undefined

为什么会发生这种情况?在这两种情况下,值都被更改为字符串。

JavaScript是动态键入的。没有整数,也没有浮点。字符串数据类型。所有这些转换都是根据上下文在内部完成的

+可以是字符串连接或加法,具体取决于上下文


编辑:道歉。太晚了。但在与无穷大进行比较时,是==执行到数字的转换。在某些情况下,您生成了有效的数字

JavaScript是动态类型的。没有整数,也没有浮点。字符串数据类型。所有这些转换都是根据上下文在内部完成的

+可以是字符串连接或加法,具体取决于上下文


编辑:道歉。太晚了。但在与无穷大进行比较时,是==执行到数字的转换。在某些情况下,您生成了有效的数字

如果你真的需要一个数字类型,你总是可以使用下面的方法。
console.logNumber1

如果你真的需要一个数字类型,你总是可以使用下面的方法。
console.logNumber1

我想我知道了。实际上,除了我的测试代码之外,这一切都没有错

如果使用这个字符串11e51354,则可以将其断言为true,因为Javascript会检查所有可能使其等于true的类型

"11e51354" == Infinity # True
正确的测试应该是:

"11e51354" === Infinity # False

它仍然是一个字符串,但不知何故,当我通过GET请求发送它时,它被转换成了一个数字类型,它给出了无穷大。

我想我已经找到了答案。实际上,除了我的测试代码之外,这一切都没有错

如果使用这个字符串11e51354,则可以将其断言为true,因为Javascript会检查所有可能使其等于true的类型

"11e51354" == Infinity # True
正确的测试应该是:

"11e51354" === Infinity # False

它仍然是一个字符串,但不知何故,当我通过GET请求发送它时,它被转换为一个数字类型,该类型给出了无穷大。

此测试揭示了答案:

for (var i = 0; i < 100000; i++){
  var x=getSessionGUID();
  if(x == Infinity) console.log(x); }
}
它记录61e93284或1413e390等值

这些值是有效的数字,它们对于数字类型来说太大了,所以当解释为数字时,它们被转换为无穷大

if(getSessionGUID() === Infinity)

如果在测试中将==替换为===,则不会发生转换,也不会记录任何内容。转换是由==运算符引起的。

此测试揭示了答案:

for (var i = 0; i < 100000; i++){
  var x=getSessionGUID();
  if(x == Infinity) console.log(x); }
}
它记录61e93284或1413e390等值

这些值是有效的数字,它们对于数字类型来说太大了,所以当解释为数字时,它们被转换为无穷大

if(getSessionGUID() === Infinity)

如果在测试中将==替换为===,则不会发生转换,也不会记录任何内容。转换是由==运算符引起的。

您正在生成十六进制字符串

使用==运算符时,解释器会尝试将这两个值强制为相同的数据类型。将字符串与无穷大进行比较时,中间数据类型为Number。当这些字符串包含字母e(一个有效的十六进制数字)并且它们被强制为一个数字时,javascript会将其解释为10^x,最后变成一个巨大的数字

,因此任何大于1.7976931348623157e308的值都被认为是无穷大

解决此问题的最简单方法是将==更改为===以便字符串不会被强制为数字

if(getSessionGUID() === Infinity)

您正在生成十六进制字符串

使用==运算符时,解释器会尝试将这两个值强制为相同的数据类型。将字符串与无穷大进行比较时,中间数据类型为Number。当这些字符串包含字母e(一个有效的十六进制数字)并且它们被强制为一个数字时,javascript会将其解释为10^x,最后变成一个巨大的数字

,因此任何大于1.7976931348623157e308的值都被认为是无穷大

解决此问题的最简单方法是将==更改为===以便字符串不会被强制为数字

if(getSessionGUID() === Infinity)

它是随机的,还是i的特定值?它是随机的,还是i的特定值?在什么情况下String+String==无穷大?S4似乎永远不会返回一个数字+运算符不会导致无穷大。我在发布的那一刻就意识到了这一点。该死的电话不让我编辑帖子很抱歉在什么情况下字符串+字符串==无穷大?S4似乎永远不会返回一个数字+运算符不会导致无穷大。我在发布的那一刻就意识到了这一点。该死的电话不让我编辑帖子很抱歉我需要一个字符串类型,但当我在GET请求中使用该值时,它有时会转换为无穷大。通常最好指定所需的数字类型,例如整数,而不是泛型。指定Number只会减少类型强制的可能目标数量。Moox:这仍然非常奇怪。我从来没见过
一个字符串在五年的web开发中转换为无穷大。“你知道这发生在什么特定的字符串上吗?”sudowned检查我的回答。我将查看GET请求的代码,并返回到此线程以了解更多详细信息。@sudown该值实际上被放入cookie中。我想这取决于浏览器,一些输入可能会在这个过程中丢失,值会作为一个变为无穷大的数字保存到cookie中。虽然这是一个奇怪的问题,但解决方法只是在混合S4+-+S4中添加任何非数字字符。我需要一个字符串类型,但有时在GET请求中使用该值时,它会转换为无穷大。通常最好指定所需的数字类型,例如整数,而不是泛型。指定Number只会减少类型强制的可能目标数量。Moox:这仍然非常奇怪。在五年的web开发中,我从未见过字符串转换为无穷大。“你知道这发生在什么特定的字符串上吗?”sudowned检查我的回答。我将查看GET请求的代码,并返回到此线程以了解更多详细信息。@sudown该值实际上被放入cookie中。我想这取决于浏览器,一些输入可能会在这个过程中丢失,值会作为一个变为无穷大的数字保存到cookie中。虽然这是一个奇怪的问题,但解决方法只是在混合S4+-+S4中添加任何非数字字符。