JavaScript에서 숫자를 문자열로 변환하는 가장 좋은 방법은 무엇입니까?


답변:


516

이처럼 :

var foo = 45;
var bar = '' + foo;

사실, 간단한 편의를 위해 일반적으로 이와 같이 수행하더라도 원시 속도에 대해 1,000 회 이상의 반복 이 장점이 있습니다..toString()

참조 성능 (내게로하지,하지만 난 내 자신을 작성 갔을 때 발견) 여기에 테스트 : http://jsben.ch/#/ghQYR

위의 JSPerf 테스트를 기반으로 가장 빠릅니다. str = num.toString();

속도 차이 는 0.1 초에 100 만 번 변환 할 수 있다고 생각할 때 속도 차이가 크게 중요하지 않다는 점에 유의해야합니다 .

업데이트 : 브라우저마다 속도가 크게 다른 것 같습니다. Chrome num + ''에서이 테스트를 기반으로 가장 빠른 것 같습니다 http://jsben.ch/#/ghQYR

업데이트 2 : 위의 테스트를 기반으로 Firefox 20.0.1은 샘플 .toString()보다 약 100 배 느리게 실행 '' + num됩니다.


58
변환이 선호되는 답변을 반환하지 않는 경우가 있습니다 : '' + 123e-50returns "1.23e-48".
hongymagic

21
@hongymagic : 그 대답은 실제로 유일하게 생각할 수 있습니다. 숫자는 입력 방법을 신경 쓰거나 알 수 없으며 표준 인쇄 표현은 점 앞에 정확히 한 자리 숫자입니다.
Svante

4
jsben.ch/ghQYR 에서 테스트를 실행했을 때마다 다른 결과를 보여줄 때마다!
Maryam Saeidi

2
null foo오류가 발생하지 않기 때문에이 답변을 좋아합니다 .
18시 41 분

2
@MaryamSaeidi은 : 사용 drublic을 의 ' jsperf.com하는 테스트는 위의 일관성 보인다.
Giraldi

364

내 의견으로 n.toString()는 그 명료 함을 위해 상을 받는다. 나는 그것이 더 많은 오버 헤드를 가지고 있다고 생각하지 않는다.


최신 브라우저 버전에서는 중요하지 않지만 약간의 오버 헤드가 발생합니다. Firefox Quantum에서
peterchaula

11
안전하지 않습니다. n은 null이거나 정의되지 않았을 수 있습니다.
david.pfx

20
@ david.pfx 질문은 숫자 값을 문자열로 변환하는 방법을 묻습니다. 숫자가 아닌 값의 예를 제공하는 것은 (예를 들어 null, undefined)이 대답 작동하지 않는 거의가 "안전하지 않은"하지 않습니다.
Michael Martin-Smucker

5
@ MichaelMartin-Smucker : JS를 많이 작성하면 거의 잘리지 않고 건조되는 것을 알 수 있습니다. 질문은 공개적이며 IMO의 좋은 대답은 실제로 실제로 null이거나 정의되지 않은 문자열의 문제를 인정해야합니다. YMMV.
david.pfx

@ david.pfx 나는 많은 js를 작성했으며 문자열로 숫자가 필요하고 문자열로 숫자가 필요했던 마지막 시간을 기억하지 못합니다. 이것이 정답입니다. 이 처리에 아무 대답이 없다 null또는 undefined이 응용 프로그램의 특정이기 때문에, 내가 상상하는 동안 (n || defaultNumber).toString() 대부분의 사람들이 난 강력하게 우리가 질문으로 작업해야합니다 동의하지 이러한 상황에서 원하는 것 인 것이다. 이것은 숫자를 문자열로 변환하는 것과, 필요한 경우 별도의 수업이 필요한 훌륭한 아키텍처 및 기타 유형 변환에 관한 것입니다.
조지 Reith

73

언어에 익숙하지 않은 사람에게는 명백한 변환이 매우 분명합니다. 다른 사람들이 제안한 것처럼 유형 강제 변환을 사용하면 개발자가 강제 규칙을 모르는 경우 모호성이 생깁니다. 궁극적으로 개발자 시간은 CPU 시간보다 비싸므로 후자의 비용으로 전자에 맞게 최적화합니다. 즉,이 경우 차이는 무시할 수 있지만 확실하지 않은 경우 이러한 종류의 것들을 최적화하는 괜찮은 JavaScript 압축기가 있습니다.

위의 이유로 나는 다음과 같이 갈 것입니다 : n.toString()또는 String(n). null이거나 정의되지 않은 String(n)경우 실패하지 않기 때문에 아마도 더 나은 선택 일 것 n입니다.


12
질문에 대한하지 변환 번호에 대해, 숫자를 변환하거나되었다 null, 또는 undefined. 경우 n이다 nullundefined때문에 내 프로그램의 버그에, 나는 내 프로그램이 나에게 찾아 버그를 수정의 더 나은 기회를주고,이 상태에서 실패를 원합니다. 프로그램 충돌은 프로그래머가 버그를 찾는 데 도움이되는 선물입니다 :-). 대안은 버그에 대해주의 깊게 빛나면서 설계된대로 작동하지 않는 소프트웨어를 제공하는 것입니다. 그래서 나는 String(n)오류를 가리기 위해 사용하는 팬이 아닙니다 .
Matt Wallis

1
String(n)기능 스타일로 사용하기에 좋습니다 (예 : 밑줄의 결합) _.compose(funcThatNeedsAStringParam, String).
Rik Martins

2
String (null)은 프로그램을 크래시하지 않지만 리터럴 문자열 "null"을 반환합니다. 이는 아마도 원하는 것이 아닙니다. 데이터가 합법적으로 null 인 경우 명시 적으로 처리해야합니다.
Peter Smartt

1
@MattWallis 대답이 아니라 개발자의 결정이어야한다고 생각하지 않습니까?
forresthopkinsa

30

... JavaScript의 파서는 숫자의 점 표기법을 부동 소수점 리터럴로 구문 분석합니다.

2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first

출처


17

혀-인-뺨은 분명히 :

var harshNum = 108;
"".split.call(harshNum,"").join("");

또는 ES6에서는 단순히 템플릿 문자열을 사용할 수 있습니다 .

var harshNum = 108;
`${harshNum}`;

ES6 템플릿으로 벤치 마크를 실행하면 때로는 '' + number방법 보다 빠르기도합니다 . 이 벤치 마크의 결과는 여러 번 수행 할 때 매우 다양하므로 너무 진지해야하는지 확실하지 않습니다.
니코 반 벨

15

다른 답변은 이미 다른 옵션을 다루었지만이 방법을 선호합니다.

s = `${n}`

간결하고 간결하며 이미 다른 많은 장소에서 사용되었으므로 (현대 프레임 워크 / ES 버전을 사용하는 경우) 프로그래머가 이해할 수있는 안전한 방법입니다.

중요하지는 않지만 다른 방법 과 비교할 때 가장 빠른 것 같습니다 .


n이 숫자가 아닌 경우에도 안전합니다.
david.pfx

그러나 그렇 n.toString()습니까?
amn

1
@amn 경우는 n이다 undefined그것을 사용하여 구문 오류가 발생합니다.toString()
JEE 목을

이것이 String(n)모든 경우 와 동일한 결과를 제공하지는 않습니까? 유일한 차이점은 덜 명확하다는 것입니다.
Bennett McElwee

그리고 훨씬 느립니다.
Adrian Bartholomew

12

변수를 문자열로 변환하는 가장 간단한 방법은 해당 변수에 빈 문자열을 추가하는 것입니다.

5.41 + ''    // Result: the string '5.41'
Math.PI + '' // Result: the string '3.141592653589793'

2
: 그 안에 괄호가 될 필요가 있음을 참고 (5.41 + '')문자열과 같은 방법을 사용하는 .substring()
Gjaa

왜 그 점을 주목해야합니까?
Adrian Bartholomew

7

통화를 표시하기 위해 결과를 특정 소수 자릿수형식화 해야하는 경우 메소드 와 같은 것이 필요합니다 .toFixed()

number.toFixed( [digits] )

digits 소수점 이하 자릿수 뒤에 표시 할 자릿수입니다.


2
안전하지 않은 당신이하지 않는 알고 는 숫자입니다.
david.pfx

6

내가 사용 https://jsperf.com를 다음과 같은 경우에 대한 테스트 케이스를 만들 수 :

number + ''
`${number}`
String(number)
number.toString()

https://jsperf.com/number-string-conversion-speed-comparison

2018 년 7 월 24 일 현재 결과 number + ''는 템플릿 문자열 리터럴과 연결된 Firefox에서 Chrome에서 가장 빠릅니다.

둘 다 String(number)number.toString()가장 빠른 옵션보다 약 95 % 느립니다.

성능 테스트, 위의 설명


2

처음 두 개는 읽기 쉽기 때문에 좋아합니다. 나는 사용하는 경향이 String(n)있지만 그것은 다른 것보다 단지 스타일의 문제입니다.

그것은 당신이 라인을 가지고 있지 않는 한

var n = 5;
console.log ("the number is: " + n);

그것은 매우 자기 설명입니다


2

나는 그것이 상황에 달려 있다고 생각하지만 어쨌든 .toString()이해하기가 매우 명확하기 때문에 방법을 사용할 수 있습니다 .


2

.toString ()은 내장 타입 캐스팅 함수입니다. 세부 사항에 대해서는 전문가가 아니지만 내장 타입 캐스팅 구절의 명시 적 방법론을 비교할 때마다 내장 해결 방법이 항상 선호됩니다.


1

모든 것을 고려해야한다면 다음과 같이 제안합니다.

var myint = 1;
var mystring = myint + '';
/*or int to string*/
myint = myint + ''

IMHO는 문자열로 변환하는 가장 빠른 방법입니다. 내가 틀렸다면 나를 바로 잡으십시오.


1

유일한 유효 솔루션 거의 모든 가능한 기존 및 향후의 경우 (입력, 널 (null)이 정의되지 않은, 기호 다른, 아무것도 번호)입니다 String(x). "여기서는 반드시 숫자를 문자열로 변환하고 여기에서 반드시 부울을 문자열로 변환"과 같은 값 유형 가정을 기반으로 간단한 조작에 3 가지 방법을 사용하지 마십시오.

설명:

String(x)null, undefined, Symbols, [anything]을 처리하고 .toString()객체를 호출 합니다.

'' + x.valueOf()x에 대한 호출 (번호로 캐스트), 심볼에 대한 호출 은 구현에 따른 결과를 제공 할 수 있습니다.

x.toString() 널을 던지고 정의되지 않습니다.

참고 : String(x)와 같은 프로토 타입이없는 객체에서는 여전히 실패합니다 Object.create(null).

'Hello, undefined'와 같은 문자열이 마음에 들지 않거나 프로토 타입이없는 객체를 지원하려면 다음 유형 변환 함수를 사용하십시오.

/**
 * Safely casts any value to string. Null and undefined are converted to ''.
 * @param  {*} value
 * @return {string}
 */
function string (str) {
  return value == null ? '' : (typeof value === 'object' && !value.toString ? '[object]' : String(value));
}

1

숫자 리터럴을 사용하면 속성에 액세스하기위한 점이 소수점과 구별되어야합니다. 숫자 리터럴 123에서 String ()을 호출하려는 경우 다음 옵션이 남습니다.

123..toString()
123 .toString() // space before the dot 123.0.toString()
(123).toString()

1

다음은 JS에서 정수를 문자열로 변환하는 방법입니다

방법은 성능의 내림차순으로 정렬됩니다.

(성능 테스트 결과는 @DarckBlezzer가 그의 답변으로 제공합니다)

var num = 1

방법 1 :

num =`$ {num}`

방법 2 :

num = num + ''

방법 3 :

num = 문자열 (num)

방법 4 :

num = num.toString ()

참고 : 숫자에서 직접 tostring ()을 호출 할 수 없습니다

예 : 2.toString ()에서 Uncaught SyntaxError가 발생 함 : 유효하지 않거나 예상치 못한 토큰



0

String 생성자를 사용할 수도 있습니다 . 이 벤치 마크 에 따르면 Firefox 58 " + num에서 인기있는 브라우저 Google Chrome 보다 속도가 느리더라도 숫자를 문자열로 변환하는 가장 빠른 방법 입니다.


0

방법 toFixed()은 또한 목적을 해결합니다.

var n = 8.434332;
n.toFixed(2)  // 8.43

0

Numberobject를 호출 한 다음을 호출 할 수 있습니다 toString().

Number.call(null, n).toString()

이 자바 스크립트를 다른 자바 스크립트 기본 객체에 사용할 수 있습니다.


0

최근 에이 문제를 해결하면 방법 3과 4가 적합하지 않습니다. 문자열을 복사 한 다음 함께 모으는 방법 때문입니다. 작은 프로그램의 경우이 문제는 중요하지 않지만 실제 웹 응용 프로그램의 경우 빈도 문자열 조작을 처리해야하는이 작업은 성능과 가독성에 영향을 줄 수 있습니다.

다음은 읽은 링크 입니다.


0

시간이있을 때 더 많은 데이터로 이것을 다시 편집 할 것입니다. 지금은 괜찮습니다 ...

NodeJS v8.11.2에서 테스트 : 2018/06/06

let i=0;
    console.time("test1")
    for(;i<10000000;i=i+1){
    	const string = "" + 1234;
    }
    console.timeEnd("test1")
    
    i=0;
    console.time("test1.1")
    for(;i<10000000;i=i+1){
    	const string = '' + 1234;
    }
    console.timeEnd("test1.1")
    
    i=0;
    console.time("test1.2")
    for(;i<10000000;i=i+1){
    	const string = `` + 1234;
    }
    console.timeEnd("test1.2")
    
    i=0;
    console.time("test1.3")
    for(;i<10000000;i=i+1){
    	const string = 1234 +  '';
    }
    console.timeEnd("test1.3")
    
    
    i=0;
    console.time("test2")
    for(;i<10000000;i=i+1){
    	const string = (1234).toString();
    }
    console.timeEnd("test2")
    
    
    i=0;
    console.time("test3")
    for(;i<10000000;i=i+1){
    	const string = String(1234);
    }
    console.timeEnd("test3")
    
    
    i=0;
    console.time("test4")
    for(;i<10000000;i=i+1){
    	const string = `${1234}`;
    }
    console.timeEnd("test4")
    
    i=0;
    console.time("test5")
    for(;i<10000000;i=i+1){
    	const string = 1234..toString();
    }
    console.timeEnd("test5")
    
    i=0;
    console.time("test6")
    for(;i<10000000;i=i+1){
    	const string = 1234 .toString();
    }
    console.timeEnd("test6")

산출

test1: 72.268ms
test1.1: 61.086ms
test1.2: 66.854ms
test1.3: 63.698ms
test2: 207.912ms
test3: 81.987ms
test4: 59.752ms
test5: 213.136ms
test6: 204.869ms

예-test4는 내가 정기적으로 사용하는 것입니다!
Adrian Bartholomew

0

node.js를 사용할 때 비슷한 결과가 나타납니다. 이 스크립트를 실행했습니다.

let bar;
let foo = ["45","foo"];

console.time('string concat testing');
for (let i = 0; i < 10000000; i++) {
    bar = "" + foo;
}
console.timeEnd('string concat testing');


console.time("string obj testing");
for (let i = 0; i < 10000000; i++) {
    bar = String(foo);
}
console.timeEnd("string obj testing");

console.time("string both");
for (let i = 0; i < 10000000; i++) {
    bar = "" + foo + "";
}
console.timeEnd("string both");

다음과 같은 결과를 얻었습니다.

 node testing.js
string concat testing: 2802.542ms
string obj testing: 3374.530ms
string both: 2660.023ms

내가 그것을 실행할 때마다 비슷한 시간.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.