development

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

big-blog 2020. 2. 15. 23:18
반응형

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


숫자를 문자열로 변환하는 가장 좋은 방법은 무엇입니까 (속도 이점, 선명도 이점, 메모리 이점 등)?

몇 가지 예 :

  1. String(n)

  2. n.toString()

  3. ""+n

  4. n+""


이처럼 :

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

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

여기에서 성능 테스트를 참조하십시오 (내가 아니라 내 자신을 쓰려고 할 때 찾았습니다) : http://jsben.ch/#/ghQYR

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

주목해야한다 당신이 어떤 방법을 전환을 할 수 있다는 것을 고려할 때 속도의 차이가 너무 큰 아니라고 0.1 초에 1 백만 번 .

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

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


제 생각 n.toString()에는 명확성으로 상을 받는데, 그것이 더 많은 오버 헤드를 가지고 있다고 생각하지 않습니다.


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

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


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

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

출처


혀-인-뺨은 분명히 :

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

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

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

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

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

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

s = `${n}`

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

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


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

number.toFixed( [digits] )

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


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

당신이 줄을 가지고 있지 않는 한

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

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


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


내가 사용 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 % 느립니다.

성능 테스트, 위의 설명


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


모든 것을 고려해야한다면 다음을 제안 할 것입니다.

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

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


거의 모든 가능한 기존 및 향후 사례 (입력, 숫자, null, 정의되지 않음, Symbol 등)에 유효한 유일한 솔루션 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));
}

어느 것이 가장 성능이 좋은지 궁금하다면 다른 숫자-> 문자열 변환을 비교하는 곳을 확인하십시오.

외모가 좋아하는 2+''또는 2+""가장 빠른입니다.

https://jsperf.com/int-2-string


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


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

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

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

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

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


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

다음은 읽은 링크 입니다.


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

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

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

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


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

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

참고 URL : https://stackoverflow.com/questions/5765398/whats-the-best-way-to-convert-a-number-to-a-string-in-javascript



반응형