Это:
alert(Number(String(foo)) * 2);
должен это сделать (но см. Ниже ), если ваш COM-объект реализует toString
(или valueOf
с подсказкой "string") правильно (и, очевидно, это так, если ваш innerHTML
хитрость работает - потому что когда вы присваиваете foo
для innerHTML
, происходит тот же процесс преобразования COM-объекта в строку, что и для String(foo)
).
Из раздела 15.5.1 спецификации ECMAScript 5-го издания:
Когда 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);