在JavaScript中将int64值转换为数字对象

在JavaScript中将int64值转换为数字对象,javascript,com,type-conversion,int64,Javascript,Com,Type Conversion,Int64,我有一个COM对象,它有一个返回无符号int64(VT_UI8)值的方法。我们有一个HTML页面,其中包含一些JavaScript,可以加载COM对象并调用该方法来检索值,如下所示: var foo = MyCOMObject.GetInt64Value(); 此值可通过以下方式在消息对话框中轻松显示给用户: alert(foo); 或通过以下方式显示在页面上: document.getElementById('displayToUser').innerHTML = foo; 但是,我们不

我有一个COM对象,它有一个返回无符号int64(VT_UI8)值的方法。我们有一个HTML页面,其中包含一些JavaScript,可以加载COM对象并调用该方法来检索值,如下所示:

var foo = MyCOMObject.GetInt64Value();
此值可通过以下方式在消息对话框中轻松显示给用户:

alert(foo);
或通过以下方式显示在页面上:

document.getElementById('displayToUser').innerHTML = foo;
但是,我们不能将此值用作一个数字(例如,如果我们尝试将其乘以2),而页面不会抛出“Number expected”错误。如果我们选中“typeof(foo)”,它将返回“unknown”

我通过执行以下操作找到了解决方法:

document.getElementById('displayToUser').innerHTML = foo;
var bar = parseInt(document.getElementById('displayToUser').innerHTML);
alert(bar*2);
我需要知道的是如何使这个过程更有效率。具体来说,有没有一种方法可以显式地将foo转换为字符串,而不必将某个文档元素的innerHTML设置为foo,然后从中检索它。我不介意打这样的电话:

alert(parseInt((string)foo) * 2);
如果有一种方法可以直接将int64转换为数字,而不必进行字符串转换,那就更好了,但我对此不抱太大希望。

这是:

alert(Number(String(foo)) * 2);
如果COM对象正确地实现了
toString
(或带有“string”提示的
valueOf
),则应该执行此操作(但请参见下面的)(如果你的
innerHTML
技巧奏效,显然是这样的——因为当你将
foo
分配给
innerHTML
时,将COM对象转换为字符串的过程与
string(foo)
相同)

根据第5版ECMAScript规范第15.5.1节:

当字符串作为函数而不是构造函数调用时,它将执行类型转换

和第15.7.1节

当Number作为函数而不是构造函数调用时,它将执行类型转换

也许值得尝试一下
Number(foo)*2
来确定,但我认为它不起作用(似乎您的COM对象只处理到字符串的转换,而不是数字,这并不奇怪或不合理)


编辑如果
字符串(foo)
失败,请尝试:

alert(Number("" + foo) * 2);
我很惊讶你的
innerHTML
技巧能起作用,但是
String(foo)
抛出了一个错误。希望
“+foo
能触发与
innerHTML
技巧相同的隐式转换


编辑好的,这个COM对象确实很奇怪。我接下来的两个动作:

alert(("" + foo) * 2);
它使用所有隐式转换(将对象添加到字符串会将对象转换为字符串;将
*
运算符应用到字符串会将其转换为数字)

或者,我们可以使字符串->数字转换显式但间接:

alert(parseInt("" + foo) * 2);
这:

如果COM对象正确地实现了
toString
(或带有“string”提示的
valueOf
),则应该执行此操作(但请参见下面的)(如果你的
innerHTML
技巧奏效,显然是这样的——因为当你将
foo
分配给
innerHTML
时,将COM对象转换为字符串的过程与
string(foo)
相同)

根据第5版ECMAScript规范第15.5.1节:

当字符串作为函数而不是构造函数调用时,它将执行类型转换

和第15.7.1节

当Number作为函数而不是构造函数调用时,它将执行类型转换

也许值得尝试一下
Number(foo)*2
来确定,但我认为它不起作用(似乎您的COM对象只处理到字符串的转换,而不是数字,这并不奇怪或不合理)


编辑如果
字符串(foo)
失败,请尝试:

alert(Number("" + foo) * 2);
我很惊讶你的
innerHTML
技巧能起作用,但是
String(foo)
抛出了一个错误。希望
“+foo
能触发与
innerHTML
技巧相同的隐式转换


编辑好的,这个COM对象确实很奇怪。我接下来的两个动作:

alert(("" + foo) * 2);
它使用所有隐式转换(将对象添加到字符串会将对象转换为字符串;将
*
运算符应用到字符串会将其转换为数字)

或者,我们可以使字符串->数字转换显式但间接:

alert(parseInt("" + foo) * 2);

如果由于宿主对象的奇怪行为,显式转换都不起作用,那么让我们试试隐式转换:

var n= +(''+foo);

我假设您不介意目标类型
Number
没有覆盖int64的全部值范围(它是
双精度的
,因此只能得到52位尾数)。

Eek。如果由于宿主对象的奇怪行为,显式转换都不起作用,那么让我们尝试隐式转换:

var n= +(''+foo);

我假设您不介意目标类型
Number
没有覆盖int64的全部值范围(它是
双精度
,因此只能得到52位尾数).

Matt,从对其他答案的评论来看,我怀疑您正在某种循环中运行此代码。如果是这样,请确保在尝试转换之前检查返回值是否为null

var foo = MyCOMObject.GetInt64Value(); 
if (foo == null) {
  foo = 0; // Or something else
}

Matt,从注释到其他答案,我怀疑您正在某种循环中运行此代码。如果是这样,请确保在尝试转换之前检查返回值是否为null

var foo = MyCOMObject.GetInt64Value(); 
if (foo == null) {
  foo = 0; // Or something else
}

不幸的是,我尝试过这样做,调用“字符串(foo)”会产生一个“字符串预期”错误。@Matt:Try
alert(Number(“+foo)*2)
。(我很惊讶
String(foo)
不起作用,但如果
innerHTML=foo
起作用,那么
“+foo
应该起作用。)(编辑了我的答案以包含这一点。)有趣的是,结果显然总是0,所以也不行。谢谢。@Matt:你有没有试过
alert(parseInt(“+foo)*2)
?以防万一