0

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

var foo = MyCOMObject.GetInt64Value();

这个值可以很容易地在消息对话框中显示给用户,使用:

alert(foo);

或通过以下方式显示在页面上:

document.getElementById('displayToUser').innerHTML = foo;

但是,我们不能将此值用作数字(例如,如果我们尝试将其乘以 2)而不会使页面抛出“预期数字”错误。如果我们检查“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 转换为数字,而不经过字符串转换,那就更好了,但我对此抱有较小的希望。

4

3 回答 3

3

这个:

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

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

来自第 5 版 ECMAScript 规范的第 15.5.1 节:

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

和第 15.7.1 节

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

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


编辑如果String(foo)失败,请尝试:

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

惊讶您的innerHTML技巧有效但String(foo)抛出了错误。希望"" + foo会触发与您的技巧相同的隐式转换。innerHTML


编辑好吧,这个 COM 对象确实很奇怪。我接下来的两次齐射:

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

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

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

alert(parseInt("" + foo) * 2);
于 2010-05-05T17:22:14.147 回答
1

哎呀。好吧,如果由于宿主对象的奇怪行为而没有任何显式转换起作用,那么让我们试试隐式转换:

var n= +(''+foo);

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

于 2010-05-05T18:57:55.920 回答
0

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

var foo = MyCOMObject.GetInt64Value(); 
if (foo == null) {
  foo = 0; // Or something else
}
于 2010-05-05T19:03:57.133 回答