JavaScript에서 var가 문자열인지 어떻게 확인할 수 있습니까?


답변:


381

당신은 가까이 있었다 :

if (typeof a_string === 'string') {
    // this is a string
}

관련 참고 사항 : new String('hello')유형이 Object대신 문자열이 생성되면 위의 검사가 작동하지 않습니다 . 이 문제를 해결하는 복잡한 솔루션이 있지만 문자열을 그런 식으로 만드는 것을 피하는 것이 좋습니다.


1
여러분, 저는 정말로 두 분 모두에게 답을 드릴 것입니다. 그러나 저는 할 수 없습니다. 제가 할 수있는 것은 둘 다 +1입니다. 충분히 설명했다.
vitto

이것은 나를 위해 일했다if(typeof(str) === typeof(String()))
Scott Murphy

78

typeof연산자는 중위 (그래서 당신의 예제의 LHS가 이해가되지 않습니다)되지 않습니다.

당신은 그렇게 사용해야합니다 ...

if (typeof a_string == 'string') {
    // This is a string.
}

typeof함수가 아니라 연산자 라는 것을 기억하십시오 . 그럼에도 불구하고, 당신은 typeof(var)야생에서 많이 사용되는 것을 볼 수 있습니다 . 이만큼 의미가 var a = 4 + (1)있습니다.

또한 ==두 피연산자가 모두 String( typeof 항상 a를 반환 )이기 때문에 (평등 비교 연산자)를 사용할 수도 있습니다 String. JavaScript는 내가 사용한 것과 동일한 단계를 수행하도록 정의되어 있습니다 ===(엄격한 비교 연산자).

으로 Box9 언급 ,이 감지되지 않습니다 인스턴스 String객체를.

당신은 그것을 감지 할 수 있습니다 ....

var isString = str instanceof String;

jsFiddle .

...또는...

var isString = str.constructor == String;

jsFiddle .

그러나 이것은 다중 window환경 에서 작동하지 않습니다 (생각하십시오 iframe).

당신은이 문제를 해결할 수 있습니다 ...

var isString = Object.prototype.toString.call(str) == '[object String]';

jsFiddle .

그러나 다시 Box9에서 언급했듯이 리터럴 String형식을 사용하는 것이 좋습니다 (예 :)var str = 'I am a string'; .

추가 자료 .


1
@ Box9 걱정 마세요, 어쨌든 답장을 했어요 : P
alex

@alex 나도 지금 : o (10 분 더!)
David Tang

3
@RobG 담당자는 한 24 시간 동안 최대 담당자를 얻었습니다. 그 후, 공감 율은 당신의 평판에 포함되지 않습니다.
alex

문자열 만 가지고있는 멤버의 존재를 테스트하여 변수가 문자열인지 확인할 수 없습니까? 예를 들면 다음과 같습니다. if(myVar.toUpperCase) alert('I am a string');? 참조 : jsfiddle.net/tb3t4nsx
성분

1
@ ingredient_15939 그것은 정말 좋은 방법이 아닙니다 ... 때문에{ toUpperCase: '' }
alex

14

이전 답변을 결합하면 다음과 같은 솔루션이 제공됩니다.

if (typeof str == 'string' || str instanceof String)

또는

Object.prototype.toString.call(str) == '[object String]'

4

다음 표현식은 true를 리턴 합니다 .

'qwe'.constructor === String

다음 표현식은 true를 리턴 합니다 .

typeof 'qwe' === 'string'

다음 표현식은 false (sic!)를 반환합니다 .

typeof new String('qwe') === 'string'

다음 표현식은 true를 리턴 합니다 .

typeof new String('qwe').valueOf() === 'string'

가장 좋은 방법 ( imho ) :

if (someVariable.constructor === String) {
   ...
}

1

요즘 나는 typeof () 함수 형식을 사용하는 것이 바람직하다고 생각합니다 ...

if(filename === undefined || typeof(filename) !== "string" || filename === "") {
   console.log("no filename aborted.");
   return;
}

의 함수 형식이 없으며 typeof괄호로 작업 순서를 제어하는 ​​것입니다. 어떤 사람들은 특정 상황에서 더 읽기 쉽습니다.
Jon z

@Jonz "작업 순서 제어"는 무슨 뜻입니까? 감사.
a20

나는 나중에 당신이 생성자를 검사하고 이론상 더 빠르지 만 더 빠르지 않다고 생각하기 때문에 그것을 선호 할 수 있다는 것을 깨달았다 고 생각합니다. 예제 번호 4는 괄호 사용법 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…를 보여줍니다 . 컴파일러 구문 분석에서 고려해야 할 사항은 명확하고 읽기 쉽습니다. '순서'에 대한 내 추측은 속도 문제 일 수 있거나 컴파일러가 인수 스택을로드하는 방법과 관련이 있습니다.
Master James

1
@ a20 연산 순서는 여러 연산이 포함 된 명령문에 대해 연산이 실행되는 순서를 설명합니다. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…를 참조하십시오. 괄호 (운영 그룹화)가 가장 높은 연산자 우선 순위를 가지므로 먼저 평가됩니다. 이 경우 괄호 filename는 단일 문장 만 그룹화하므로 쓸모없고 관계가 없습니다. 이 답변의 점수가 0 인 것은 좋은 일입니다. 잘못되었거나 오도하고 도움이되지 않기 때문입니다. 마이너스 점수이면 더 좋을 것입니다.
Jon z

링크에 대한 매우 유익한 감사합니다. 괄호를 먼저 확인하고 실행합니까? 괄호없이 일명 전화하는 다른 방법을 다음에 확인하지 않고 바로 실행해야합니다. 아니? 런타임 컴파일러에 대해 이해하지 못하는 내용은 무엇입니까?
마스터 제임스

0

모든 경우에 null 또는 undefined 확인 a_string

if (a_string && typeof a_string === 'string') {
    // this is a string and it is not null or undefined.
}

typeof nulltypeof undefined반환하지 않습니다 'string', 그래서 typeof a_string충분하다. 네크로 포스트 미안
Ivan Frolov

-3

모든 경우에 효과가있는 나의 개인적인 접근 방식은 모두 문자열에만 존재하는 멤버의 존재를 테스트하는 것입니다.

function isString(x) {
    return (typeof x == 'string' || typeof x == 'object' && x.toUpperCase && x.substr && x.charAt && x.trim && x.replace ? true : false);
}

참조 : http://jsfiddle.net/x75uy0o6/

이 방법에 결함이 있는지 알고 싶지만 수년 동안 나에게 도움이되었습니다.


2
이것은 그러한 메소드를 가진 오래된 객체에 의해 쉽게 속입니다.
alex

8
이것을 덕 타이핑이라고합니다. 예를 들어 줄처럼 걷거나 줄처럼 말하면 줄일 수도 있습니다. 이것이 문자열을 테스트하는 가장 좋은 방법이라고 생각하면 약간 미쳤지 만 Javascript는 Thunderdome입니다.
Jon z
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.