2010-05-05 3 views
0

부호없는 int64 (VT_UI8) 값을 반환하는 메서드가있는 COM 객체가 있습니다. 우리는 COM 개체를로드하는 방법에 전화를 걸 수있는 몇 가지 자바 스크립트가 포함 된 HTML 페이지가, 같은 값을 검색하기 :int64 값을 JavaScript의 Number 객체로 변환

var foo = MyCOMObject.GetInt64Value(); 

이 값은 쉽게 메시지 대화 상자에서 사용자에게 표시 할 수 있습니다 사용 :

alert(foo); 

또는하여 페이지에 표시 : 페이지 던져없이 (우리는 2를 곱하려고하면 예를 들어) 그러나

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

, 우리는 숫자로이 값을 사용할 수 없습니다 g "예상 번호"오류. "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); 

이 직접 문자열 변환을 거치지 않고, 숫자로 INT64를 변환하는 방법입니다,하지만 난 그 적은 희망을 유지하면 될 것입니다 더 나은.

+2

모든 숫자는 자바 스크립트에서 두 배입니다. 따라서 64 비트 int를 double로 변환하면 정밀도가 느슨해 질 수 있음을 알아야합니다. –

답변

3

이 :

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

그것을 (그러나 아래 참조) COM 객체 (이하 "문자열"힌트 또는 valueOf) toString를 구현하는 경우, 정확하게 (그리고 innerHTML 경우 분명히 그것은 수행한다 트릭 작동 - fooinnerHTML에 할당하면 COM 개체를 문자열로 변환하는 동일한 과정이 String(foo)처럼 발생하기 때문에 트릭 작업이 발생합니다. 5 판 인 ECMAScript 사양의 섹션 15.5.1에서

는 :

문자열은 함수로서가 아닌 생성자라고한다

, 그것은 타입 변환을 수행합니다.

그리고 제 번호가 함수로가 아닌 생성자라고한다 15.7.1

, 그것은 그것은 수 있도록 단지 Number(foo) * 2을 시도 가치가있을 수 있습니다

타입 변환을 수행 확실히,하지만 작동하지 않을 것 같아요 (당신의 COM 객체는 Number가 아닌 String으로의 변환 만 처리하는 것처럼 보입니다. 놀랍지도 무리한 것도 아닙니다).String(foo) 만약이 실패


편집, 시도 :

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

나는 당신의 innerHTML 트릭이 작동하지만 String(foo)가 오류를 던지고있다 매우 놀랄 해요. "" + foo암시적인 변환을 innerHTML 트릭으로 실행하게되기를 바랍니다.


편집 좋아이 COM 객체는 실제로 매우 이상한되고 있습니다. 내 다음 두 일제 사격 :

(문자열에 객체를 추가 객체를 문자열로 변환하고, 문자열로 * 연산자를 적용하는 번호로 변환)은 모든 암시 적 변환을 사용
alert(("" + foo) * 2); 

.

다른 방법으로, 우리는 현악기> 숫자 변환 명시 적 있지만 간접 할 수 있습니다 :

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

불행히도 "String (foo)"을 호출하면 "String expected"오류가 발생했습니다. – Matt

+0

@Matt : 대신'alert (Number (""+ foo) * 2)'를 시도하십시오. ('String * foo '는 작동하지 않지만'innerHTML = foo'가 작동한다면''''foo''가 작동해야한다는 것에 매우 놀랐습니다.) (내 대답을 편집하여 이것을 포함 시켰습니다.) –

+0

재미있는 결과는 분명히 항상 0이므로 작동하지 않습니다. 그래도 고마워. – Matt

1

Eek 발을. 명시 적 변환의 어느 것도 있기 때문에 호스트 개체의 이상한 행동의 작동되지 않는 음 경우의 암시 적 사람을 해보자 :

var n= +(''+foo); 

를 내가 대상 유형 Number가 커버하지 않는 것을 신경 쓰지 않는 당신을 믿고있어 int64 값의 전체 범위 (double이므로 52 비트의 가수만 가져옵니다).

+0

그 결과 n은 0으로 설정됩니다. Number는 내가 필요로하는 범위를주지 않을 것입니다. 그러나 아무것도 가지고 있지 않은 것보다 낫습니다. 이 특정 메서드가 32 비트에 맞지 않는 결과를 반환하는 것을 결코 보지 못했습니다.) – Matt

0

Matt, 의견에서 다른 답변까지, 나는이 코드를 어떤 종류의 루프에서 돌리고 있다고 생각합니다. 그렇다면 전환을 시도하기 전에 null 값을 확인하십시오.

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