我有一个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转换为数字,而不进行字符串转换,那就更好了,但我对它的希望不大。
答案 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
}