JavaScript에서 문자열로 캐스트


184

StringJavaScript에서 변수를 캐스팅하는 세 가지 방법을 찾았습니다 .
jQuery 소스 코드에서 이러한 세 가지 옵션을 검색했으며 모두 사용 중 입니다.
그들 사이에 차이점이 있는지 알고 싶습니다.

value.toString()
String(value)
value + ""

데모

그들은 모두 같은 결과물을 생산하지만 그중 하나가 다른 것보다 낫습니까?
나는 + ""문자가 절약된다는 장점이 있지만 그다지 큰 이점은 아닙니다.


1
모든 것이 동일하다면 표준 toString()이 갈 길이라고 생각합니다.
asawyer

1
@asawyer. 왜 그런데? 모두 동일한 출력을 생성하고 동일한 작업을 수행하는 경우 하나를 선택하여 사용하십시오. 이것이 사실 이라면 이것이 나의 의견 이다.
gdoron은 Monica

1
처음 두 메소드는 동일해야합니다 (표준을 확인해야하지만 생성자가 toString을 호출 함). 세 번째는 일반적으로 동일한 출력을 생성하지만 매우 다른 메커니즘을 포함합니다 (속도에 따라 다른 호출을 포함하므로 모든 종류의 객체에 대해 예상하지 못할 수도 있음).
Adriano Repetti 2016 년

6
제 생각 toString에는 객체와 동등한 문자열을 얻으려고한다는 사실을 자체적으로 문서화하는 가장 명확한 방법입니다. String(...)약간 둔감 value + ""하고 약간의 해킹입니다. 또한 toString사소한 부수적 인 이점으로 생각해야 할 경우 사용자 정의 구현 으로 기본값을 무시할 수 있습니다.
asawyer

2
@ 아드리아노. 그러나 + ""jsperf에 따르면 가장 빠릅니다. 그래서 ... 다른 방법으로 추측합니다.
gdoron은 Monica

답변:


213

(가) 때 그들은 다르게 행동 할 value것입니다 null.

  • null.toString()오류 발생 -null의 'toString'메소드를 호출 할 수 없음
  • String(null)반환 값- "널"
  • null + ""또한 "널"을 리턴합니다.

valueis 인 경우 매우 유사한 동작이 발생합니다 undefined( jbabey의 답변 참조 ).

그 외에는 무시할만한 성능 차이가 있습니다. 큰 루프에서 사용하지 않는 한 걱정할 가치가 없습니다.


이것은 실제로 흥미로운 차이점입니다. 따라서 아직 toString()확인하지 않은 경우 사용을 삼가야 null합니다.
Sammy S.

@SammyS. 인쇄 null또는 undefined화면에 인쇄 하는 것이 자바 스크립트 오류보다 바람직한 동작 인지 알 수 없음 ...
Justus Romijn

@JustusRomijn : 사실입니다. 그동안 옵션 유형을 사용하여 이러한 오류를 처리하기 시작했습니다.
Sammy S.

typeof를 사용하여 이러한 캐스트 변수를 확인하여 문자열을 확인할 수 있습니다. 대해서 typeof (널 (null) + '') == '문자열'
브루스 임

4
그들이 다르게 행동하는 또 다른 경우가 있습니다. v + ''v에 toString () 및 valueOf () 메서드가 모두있는 경우 잘못된 결과를 반환합니다. 연결은 toString ()을 무시하고 valueOf ()를 사용합니다. 클래스의 예는 연결 실패 : github.com/processing-js/processing-js/blob/...
Mikita Belahlazau

26

차이점이 있지만 질문과 관련이 없을 수도 있습니다. 예를 들어, toString 프로토 타입은 정의되지 않은 변수에 존재하지 않지만 다른 두 가지 방법을 사용하여 undefined를 문자열로 캐스트 할 수 있습니다.

var foo;

var myString1 = String(foo); // "undefined" as a string

var myString2 = foo + ''; // "undefined" as a string

var myString3 = foo.toString(); // throws an exception

http://jsfiddle.net/f8YwA/


3
변수가 전혀 정의되지 않은 경우에도 오류가 발생합니다 String(). 예 : String(test);throws Uncaught ReferenceError: test is not defined, var test; String(test);결과는 "undefined".
Anthony

17

그것들은 동일하게 동작하지만 toString숫자 이진수, 8 진수 또는 16 진수 문자열을 변환하는 방법을 제공합니다 :

예:

var a = (50274).toString(16)  // "c462"
var b = (76).toString(8)      // "114"
var c = (7623).toString(36)   // "5vr"
var d = (100).toString(2)     // "1100100"

9

이 JSPerf 테스트 에 따르면 속도가 다릅니다. 그러나 대량으로 사용하지 않는 한 잘 수행해야합니다.

완전성을 위해 : asawyer가 이미 언급 했듯이이.toString() 방법 을 사용할 수도 있습니다 .


2
그 jsperf는 동일한 테스트를 두 번 가지고, 그것을 편집했습니다. 그리고 new String()객체를 반환하지 않습니다String
gdoron은 Monica

new String()예 개체를 반환합니다. String()그러나 문제의 문자열 인 문자열을 반환합니다.
코넬

2
이것은 전적으로 사실이 아닙니다. 결과에서 볼 수 있듯이 빈 문자열과 개체 를 연결해도 개체와 빈 문자열을 연결하는 것과 같은 결과 가 나오지 않습니다 . 또한 호출 할 수 new String(blarg)있는 String객체를 제공합니다 toString(). 내 Chrome 디버거에서는 위의 차이점을 제외하고 동일한 종류의 객체를 효과적으로 생성합니다.
Sammy S.

@SammyS. 답변에 성능 결과 예를 추가해 주시겠습니까? jsperf 링크는 현재 다운되었으며 앞으로 5 년 안에 다시있을 것입니다.
mxmlnkn

9

위의 모든 것 외에도 정의 된 값에 대해 다음을 알아야합니다 v.

  • String(v) 전화 v.toString()
  • '' + vv.valueOf()다른 유형 캐스트 ​​이전의 통화

따라서 다음과 같은 작업을 수행 할 수 있습니다.

var mixin = {
  valueOf:  function () { return false },
  toString: function () { return 'true' }
};
mixin === false;  // false
mixin == false;    // true
'' + mixin;       // "false"
String(mixin)     // "true"

FF 34.0 및 노드 0.10에서 테스트


8

null, undefined, NaN, 0 및 false로 OK이면 모두 ''로 캐스팅하는 (s ? s+'' : '')것이 더 빠릅니다.

http://jsperf.com/cast-to-string/8 참조

참고-현재 브라우저마다 큰 차이가 있습니다.


4

실제 예 : 임의의 수의 매개 변수로 호출 할 수있는 로그 함수가 있습니다 log("foo is {} and bar is {}", param1, param2). 경우 DEBUG플래그로 설정 true, 괄호는 지정된 파라미터로 대체 취득하고, 문자열이 전달됩니다 console.log(msg). 매개 변수는 문자열, 숫자 및 JSON / AJAX 호출에 의해 반환 될 수있는 것 null입니다.

  • arguments[i].toString()가능한 null값으로 인해 옵션이 아닙니다 (Connell Watkins 답변 참조)
  • JSLint는 다음에 대해 불평합니다 arguments[i] + "" 입니다. 이것은 무엇을 사용해야할지 결정에 영향을 줄 수도 있고 그렇지 않을 수도 있습니다. 일부 사람들은 JSLint를 엄격하게 준수합니다.
  • 일부 브라우저에서는 빈 문자열을 연결하는 것이 문자열 함수 또는 문자열 생성자를 사용하는 것보다 약간 빠릅니다 (Sammys S. 답변의 JSPerf 테스트 참조). Opera 12와 Firefox 19에서 빈 문자열을 연결하는 것은 엄청나게 빠릅니다 (Firefox 19에서는 95 %) . 또는 적어도 JSPerf 는 말합니다.

1

이 페이지에서 각 방법의 성능을 직접 테스트 할 수 있습니다. :)

http://jsperf.com/cast-to-string/2

여기에서 모든 컴퓨터와 브라우저에서 ' ""+ str '이 가장 빠르며 (String) str이 가장 ​​느립니다.

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