在JavaScript中将int64值转换为Number对象

时间:2010-05-05 17:15:44

标签: javascript com type-conversion int64

我有一个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明确地转换为String,而不是必须将一些文档元素的innerHTML设置为foo,然后从中检索它。我不介意这样说:

alert(parseInt((string)foo) * 2);

如果有一种方法可以直接将int64转换为数字,而不进行字符串转换,那就更好了,但我对它的希望不大。

3 个答案:

答案 0 :(得分:3)

此:

alert(Number(String(foo)) * 2);

应该这样做(但是见下面),如果你的COM对象正确实现toString(或valueOf带有“string”提示)(显然它确实如此)如果您的innerHTML技巧有效 - 因为当您将foo分配给innerHTML时,将COM对象转换为字符串的过程与String(foo)}相同。

第5版ECMAScript规范第15.5.1节:

  

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

第15.7.1节

  

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

可能值得尝试Number(foo) * 2来确保,但我不认为它会起作用(看起来你的COM对象只处理转换为String,而不是Number,这并不奇怪或不合理)。


修改如果String(foo)失败,请尝试:

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

非常对您的innerHTML诀窍正在运作感到惊讶,但String(foo)正在抛出错误。希望"" + foo会触发与innerHTML技巧相同的隐式转换。


编辑好的,这个COM对象确实非常奇怪。我的下两个萨尔沃斯:

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

使用所有隐式转换(将对象添加到字符串会将对象转换为字符串;将*运算符应用于字符串会将其转换为数字)。

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

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

答案 1 :(得分:1)

伊克。好吧,如果由于宿主对象的奇怪行为而没有任何显式转换正在工作,那么让我们尝试隐含的转换:

var n= +(''+foo);

我假设你不介意目标类型Number没有涵盖int64的全部值(它是double,所以你只得到52位的尾数)。

答案 2 :(得分:0)

马特,从评论到其他答案,我怀疑你是在某种循环中运行这段代码。如果是这样,请确保在尝试转换之前检查返回的值为null。

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