0

unsigned int64 (VT_UI8) 値を返すメソッドを持つ COM オブジェクトがあります。COM オブジェクトをロードしてそのメソッドを呼び出し、値をそのまま取得できる JavaScript を含む HTML ページがあります。

var foo = MyCOMObject.GetInt64Value();

この値は、次を使用してメッセージ ダイアログでユーザーに簡単に表示できます。

alert(foo);

または次の方法でページに表示されます。

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

ただし、この値を Number として使用することはできません (たとえば、2 を掛けようとした場合)、ページで "Number expected" エラーがスローされます。「typeof(foo)」をチェックすると、「unknown」が返されます。

次のようにして、これに対する回避策を見つけました。

document.getElementById('displayToUser').innerHTML = foo;
var bar = parseInt(document.getElementById('displayToUser').innerHTML);
alert(bar*2);

私が知る必要があるのは、そのプロセスをより効率的にする方法です。具体的には、一部のドキュメント要素の innerHTML を foo に設定してから取得するのではなく、明示的に foo を String にキャストする方法はありますか。私は次のようなものを呼んでも構いません:

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

String 変換を経由せずに int64 を Number に直接変換する方法があればさらに良いでしょうが、私はその希望をあまり持ちません。

4

3 に答える 3

3

これ:

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

COMオブジェクトが(または「文字列」ヒントを使用して)正しく実装されている場合(ただし、以下を参照)、それを行う必要があります(そして、トリックが機能する場合は明らかにそうです-に割り当てると、COMオブジェクトを変換する同じプロセス文字列への変換は ) のように発生します。toStringvalueOfinnerHTMLfooinnerHTMLString(foo)

第 5 版 ECMAScript 仕様のセクション 15.5.1 から:

String がコンストラクターとしてではなく関数として呼び出されると、型変換が実行されます。

そしてセクション15.7.1

Number がコンストラクターとしてではなく関数として呼び出されると、型変換が実行されます。

確認するだけの価値はあるかもしれNumber(foo) * 2ませんが、うまくいくとは思いません (あなたの COM オブジェクトは数値ではなく文字列への変換のみを処理しているようですが、これは驚くべきことでも不合理なことでもありません)。


編集String(foo)が失敗した場合は、次を試してください。

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

あなたのトリックが機能しているのにエラーが発生していることに非常に驚いています。うまくいけば、トリックと同じ暗黙の変換がトリガーされます。innerHTMLString(foo)"" + fooinnerHTML


編集わかりました、この COM オブジェクトは非常に奇妙です。次の 2 つの一斉射撃:

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

これはすべての暗黙的な変換を使用します (オブジェクトを文字列に追加するとオブジェクトが文字列に変換され、*演算子を文字列に適用すると数値に変換されます)。

別の方法として、文字列から数値への変換を明示的かつ間接的に行うこともできます。

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

ええ。ホスト オブジェクトの奇妙な動作のために明示的な変換がどれも機能しない場合は、暗黙的な変換を試してみましょう。

var n= +(''+foo);

Numberターゲットの型が int64 の値の全範囲をカバーしていないことを気にしないと仮定しています(これは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 に答える