JavaScript에서 변수가 문자열인지 확인


1738

JavaScript에서 변수가 문자열인지 아니면 다른지 어떻게 알 수 있습니까?

답변:


1690

typeof연산자 를 사용할 수 있습니다 :

var booleanValue = true; 
var numericalValue = 354;
var stringValue = "This is a String";
var stringObject = new String( "This is a String Object" );
alert(typeof booleanValue) // displays "boolean"
alert(typeof numericalValue) // displays "number"
alert(typeof stringValue) // displays "string"
alert(typeof stringObject) // displays "object"

이 웹 페이지의 예 . (하지만 예제는 약간 수정되었습니다).

로 작성된 문자열의 경우에는 예상대로 작동하지 new String()않지만 [1] [2] 에 대해서는 거의 사용하지 않는 것이 좋습니다 . 원하는 경우 이러한 처리 방법에 대한 다른 답변을 참조하십시오.


  1. Google JavaScript 스타일 가이드 는 기본 객체 래퍼를 사용하지 말라고 합니다.
  2. Douglas Crockford 는 기본 객체 래퍼는 더 이상 사용하지 않는 것이 좋습니다 .

45
@ Wolfy87 typeof stringValue가 "string"대신 "object"를 반환 할 수도 있습니다. 내 답변에 대한 의견을 참조하십시오.
DRAX

163
내가 선호하는 답변. 이것에 대한 논쟁은와 같은 객체 줄 바꿈 문자열에 대해 '실패' new String('foo')한다는 것입니다. Google 스타일 가이드는 금지하고 Douglas Crockford 는 더 이상 사용하지 않기를 원 하며 어떤 라이브러리도 사용하지 않습니다. 존재하지 않는 척하고 typeof두려움없이 사용하십시오 .
Mark Amery


2
@DanielLe는 원칙에 위배되는 것이 아니라 일부 문제를 해결하는 대체품을 제안했기 때문입니다.
Vsevolod Golovanov

4
그것이 두통을 일으키는 경우, 99.99 %의 시간은 코드를 올바르게 구성하지 않았기 때문입니다. 그것은 기존과 그것이하는 일에 대한 NaN의 잘못이 아닙니다. 그것은 다음에 코드를 생성 할 때주의하고 배우고 염두에 두어야 할 것입니다.
Mike 'Pomax'Kamermans

1905

이것이 나를 위해 작동하는 것입니다.

if (typeof myVar === 'string' || myVar instanceof String)
// it's a string
else
// it's something else

77
"myVar instanceof String"은 "typeof myVar == 'string'"이상으로 작동합니까?
svth

81
@svth 나는 기억했다. JavaScript에서는 변수 유형의 문자열 또는 String 클래스의 객체 유형을 가질 수 있습니다 (두 가지 모두 문자열이지만 다르게 정의 됨).
DRAX April

38
var somevar = new String ( 'somestring') console.log (typeof somevar) // 객체
Danubian Sailor

82
-1 매우 특이한 코딩 방법을 instanceof따르지 않는 한 여기 에서 확인하는 것은 무의미한 소음 이기 때문에이 답변은 그것이 수행하는 작업이나 사용하는 이유를 설명하지 않습니다. 객체 포장 문자열을 사용하는 경우 필요한 유일한 이유는 객체 포장 문자열은 아무도 사용하지 않는 유용한 기능이며 Google과 Crockford는 모두 나쁜 습관으로 비난합니다 ( google-styleguide.googlecode.com/svn/ trunk /… , crockford.com/javascript/recommend.html ).
Mark Amery

78
가능성이 거의없는 경우를 올바르게 처리하는 견고한 코드를 작성하는 것은 피해야한다는 점에 강력하게 동의하지 않습니다. 다른 사람이 코드를 호출 할 수 있으면 둘 다 확인 typeof하고 instanceof좋은 조언처럼 느껴집니다. @MarkAmery의 postmessage엣지 케이스는 "내가 뭘 뭐라고 postmessage했니?" -그러나 인터페이스에서 처리되고 전파되지 않을 것으로 예상됩니다. 다른 곳에서는, 일부 JS가 승인하지 않더라도 사용되지 않는 코딩 방법을 처리하는 것이 올바른 것 같습니다. 실제로는 그렇지 않으면 코드를 승인하는 문자열로 주석을 달지 마십시오!
Dewi Morgan

157

580 명 이상이 정답에 투표했으며 800 명 이상이 효과가 있지만 샷건 스타일 답변에 투표 했으므로 모든 사람이 이해할 수있는 더 간단한 형태로 답을 다시 작성하는 것이 좋습니다.

function isString(x) {
  return Object.prototype.toString.call(x) === "[object String]"
}

또는 인라인 (이를 위해 UltiSnip 설정이 있습니다) :

Object.prototype.toString.call(myVar) === "[object String]"

때문에 참고로, 파블로 산타 크루즈의 대답은 잘못 typeof new String("string")이다object

DRAX의 답변은 정확하고 기능적이며 정답이어야합니다 (Pablo Santa Cruz가 가장 정확하지 않기 때문에 대중 투표에 반대하지는 않습니다).

그러나이 대답은 확실히 정확하고 실제로 가장 좋은 대답입니다 ( lodash / underscore 사용 제안 제외 ). 면책 조항 : lodash 4 코드베이스에 기여했습니다.

내 원래 답변 (많은 머리 위로 분명히 날아갔습니다)은 다음과 같습니다.

underscore.js에서 이것을 트랜스 코딩했습니다.

['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'].forEach( 
    function(name) { 
        window['is' + name] = function(obj) {
              return toString.call(obj) == '[object ' + name + ']';
    }; 
});

isString, isNumber 등을 정의합니다.


Node.js에서 이것은 모듈로 구현 될 수 있습니다 :

module.exports = [
  'Arguments',
  'Function', 
  'String', 
  'Number', 
  'Date', 
  'RegExp'
].reduce( (obj, name) => {
  obj[ 'is' + name ] = x => toString.call(x) == '[object ' + name + ']';
  return obj;
}, {});

[편집] : Object.prototype.toString.call(x)함수와 비동기 함수를 구분합니다.

const fn1 = () => new Promise((resolve, reject) => setTimeout(() => resolve({}), 1000))
const fn2 = async () => ({})

console.log('fn1', Object.prototype.toString.call(fn1))
console.log('fn2', Object.prototype.toString.call(fn2))


11
underscore.js를 추천하지만 (이상한 이유는 무엇입니까?) 여기에서는 사용하지 않습니다. 또한 함수를 사용하여 전역 네임 스페이스를 오염시킵니다. node.js에서 이러한 모든 기능을 가진 모듈을 만들 것입니다 ( 대신 사용할 global || windowwindow있지만 처음에는 가지고 있지 않은 문제를 해결하는 나쁜 접근 방법입니다).
Benjamin Gruenbaum

19
@ BenjaminGruenbaum 나는 OP의 질문에 대한 답을 찾고 왔으며 답을 좋아하지 않았습니다. 그래서 밑줄이 무엇인지 확인하고 약간의 압축을 풀고 수정하기에 충분하다고 생각했습니다 (밑줄 라이브러리를로드하지 않아도 됨). 내 게시물을 명확하게 설명하겠습니다.
Orwellophile

2
@Orwellophile Cool, 이제 알았습니다. 원래 답변은 밑줄 자체를 제안하는 것처럼 표현되었습니다. 개인적으로 나는 myObject+"" === myObject객체가 문자열인지 확인 하려고합니다 (또는 더 나은 방법으로, 행동 기반 유형 시스템에서 처음에는 유형 검사를하지 않을 것입니다).
Benjamin Gruenbaum

18
@ Orwellophile, 이것이 DRAX의 대답보다 어떻게 낫습니까?
Pacerier

3
그것은 다시 정의 할 수있다, 그래서 JS는 원숭이 패치를 지원 toString에서 Object.prototype. 따라서 toString객체 유형을 확인하는 것이 최선의 방법은 아니라고 주장합니다 .
Andre Rodrigues

84

jQuery 또는 lodash / Underscore 의 내장 함수를 사용하는 것이 좋습니다 . 사용하기 쉽고 읽기 쉽습니다.

두 함수 모두 DRAX가 언급 한 경우를 처리합니다. 즉, (A) 변수가 문자열 리터럴인지 (B) String 개체의 인스턴스인지 확인합니다. 두 경우 모두 이러한 함수는 값을 문자열로 올바르게 식별합니다.

lodash / Underscore.js

if(_.isString(myVar))
   //it's a string
else
   //it's something else

jQuery

if($.type(myVar) === "string")
   //it's a string
else
   //it's something else

_.isString ()에 대한 lodash 설명서를 참조하십시오. 대한 참조하십시오.

자세한 내용 은 $ .type ()에 대한 jQuery 설명서 를 참조하십시오.


96
이것은 JS 커뮤니티에서 잘못된 점의 필수 요소입니다. 기본 유형에 대한 검사는 단일 라이너이며 언어 구성 (기본 중 하나)과 관련이 있지만 외부 라이브러리를 사용하는 것이 좋습니다. 누군가이 라이브러리 중 하나를 이미 사용하고 있다면 좋은 아이디어 일 수 있지만 단순히 유형을 확인하는 대신 해당 라이브러리를 다운로드하는 것은 과도합니다.
Rafał Wrzeszcz

5
Rafal에 동의합니다. 이 외부 라이브러리 중 하나를 사용하는 "가독성"이 향상되는 모든 곳에서보고 있습니다. JavaScript를 알고 있다면 사용하지 않은 일부 외부 라이브러리보다 읽기 쉽습니다. _.every()처음에는 사용하기에 약간 혼란스럽고 _.isBoolean()회사의 혼란스러운 개발자들 처럼 단순한 것입니다. 개발자는 값이 부울이고 거짓 인 경우 거짓이라고 잘못 생각했습니다. 독일어를 모르기 때문에 영어가 독일어보다 읽기 쉽습니다. JavaScript를 배우면 모든 것이 합리적입니다.
John Harding

20
@ RafałWrzeszcz이 라이브러리는 상당히 널리 사용되며 매우 유용하고 테스트 된 기능을 제공합니다. 특히 lodash. 누군가 가이 하나의 솔루션에만 사용하기 위해 라이브러리를 다운로드하지 않는 것이 좋습니다 ....하지만 모든 자바 스크립트 개발자 가이 라이브러리를 다운로드하고 누락 된 부분을 보는 것이 좋습니다. ;)
ClearCloud8

13
Lodash와 같은 라이브러리의 요점은 모두 빠졌습니다. 속도가 아닙니다. "개발 용이성"이 아닙니다. Lodash와 같은 라이브러리를 사용하는 이유 는 js 앱을 손상시키는 문제에 대해 "방어 성"을 제공합니다. 치명적인 오류는 객체에서 문자열 작업을 시도 할 때 발생하며 그 반대도 마찬가지입니다. Lodash는 이러한 오류를 방지하는 데 엄청난 가치를 제공합니다.
random_user_name

1
많은 사람들이 노드 또는 노드와 같은 환경 에서이 작업을 수행하고 jQuery를 사용하는 사람은 거의 없다는 것을 명심하십시오.
매트 플레처

35
function isString (obj) {
  return (Object.prototype.toString.call(obj) === '[object String]');
}

나는 그것을 여기에서 보았다 :

http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/


4
이 솔루션은 답변에 제공된 URL에 언급 된 크로스 프레임 / 크로스 창 참조 시나리오를 처리하기 때문에 가장 강력하다고 생각합니다.
ewh

1
좋은 대답은 Underscore.js 가이 방법을 사용하는 것처럼 보입니다!
Daan

1
@ling 궁금한 점이 있는데 왜 괄호를 사용 Object.prototype.toString.call(obj) === '[object String]'합니까?
StubbornShowaGuy

@Earlee (x === y)보다 가독성이 좋은 x === y가요?
StubbornShowaGuy

@StubbornShowaGuy 내 의견으로는, 그렇습니다. 또한 일관성에 관한 것입니다. 나는 개인적으로 항상 값을 반환 할 때 괄호를 사용합니다.
Aquarelle

28

가장 좋은 방법은:

var s = 'String';
var a = [1,2,3];
var o = {key: 'val'};

(s.constructor === String) && console.log('its a string');
(a.constructor === Array) && console.log('its an array');
(o.constructor === Object) && console.log('its an object');
(o.constructor === Number || s.constructor === Boolean) && console.log('this won\'t run');

이들 각각은 "new Object ()"등과 같은 적절한 클래스 함수로 구성되었습니다.

또한 Duck-Typing : "오리처럼 보이고, 오리처럼 걷고, 오리처럼 냄새가 나는 경우 반드시 배열이어야합니다"의미, 속성을 확인하십시오.

도움이 되었기를 바랍니다.

편집하다; 2016 년 12 월 5 일

항상 접근 방식 조합을 사용할 수 있습니다. 다음 은 typeof 와 함께 인라인 액션 을 사용하는 예입니다 .

var type = { 'number': Math.sqrt.bind(Math), ... }[ typeof datum ];

다음은 인라인 맵을 사용하는 '실제 세계'의 예입니다.

function is(datum) {
    var isnt = !{ null: true, undefined: true, '': true, false: false, 0: false }[ datum ];
    return !isnt;
}
console.log( is(0), is(false), is(undefined), ... );  // >> true true false

이 함수는 [custom] "type-casting"대신 "type-/-value-mapping"을 사용하여 변수가 실제로 "존재하는지"알아냅니다. 이제 불쾌한 머리카락을 null&0 !

여러 번 당신은 심지어 그것의 유형에 관심이 없습니다 . 타이핑을 피하는 또 다른 방법은 Duck-Type 세트를 결합하는 것입니다.

this.id = "998";  // use a number or a string-equivalent
function get(id) {
    if (!id || !id.toString) return;
    if (id.toString() === this.id.toString()) http( id || +this.id );
    // if (+id === +this.id) ...;
}

모두 Number.prototype String.prototype 있습니다 .toString() method. 숫자의 문자열과 동일한 것이 동일한 지 확인한 다음 http함수에 a 로 전달했는지 확인 했습니다 Number. 다시 말해, 우리는 신경 쓰지 않았다 그 유형이 무엇인지 .

희망은 당신에게 더 많은 작업을 제공합니다 :)


생성자 속성을 가져 오려는 시도가 실패하므로 일반 오래된 숫자를 확인해야합니다.

@torazaburo Chrome 콘솔에서 지금은 잘 작동했습니다. 왜 작동하지 않는다고 생각합니까?
Mark Amery

2
@torazaburo 어설 션 ( (o.constructor === Number || s.constructor === Boolean)) 으로 게임을하고 싶을 수도 있습니다 . 일화, parseIntNaN취약하지만 강력한 도구입니다. Not-a-Number는 Not-a-Number가 아니며 undefined를 정의 할 수 있습니다.
코디

1
a.constructor === 배열이 잘못 때로는 실패 할 수 있습니다, 사용 Array.isArray 볼 web.mit.edu/jwalden/www/isArray.html
axkibe에게

1
동의, 이것은 안전하지 않습니다. 더 나은 방법은 속성 검사를 사용하는 것입니다. 현재 유일하게 진정한 안전 장치입니다. 예 : if(thing.call) { 'its a function'; }또는 if(thing.defineProperties) { 'its an object'; }. 입력 주셔서 감사합니다, axkibe!
Cody

17

typeof이 경우에 왜 단순히 사용하지 않는지 솔직히 알 수 없습니다 .

if (typeof str === 'string') {
  return 42;
}

예. 객체 래핑 된 문자열 (예 :)에 대해서는 실패 new String('foo')하지만 이것들은 널리 나쁜 습관으로 간주되며 대부분의 최신 개발 도구는 사용을 권장하지 않습니다. (하나만 보이면 해결하십시오!)

Object.prototype.toString트릭은 모든 프론트 엔드 개발자가 경력에서 하루를 저지르는 죄책감으로 발견되었지만 영리한 광택으로 당신을 속이게하지는 않습니다.

const isString = thing => Object.prototype.toString.call(thing) === '[object String]';

console.log(isString('foo'));

Object.prototype.toString = () => 42;

console.log(isString('foo'));


15

이 간단한 솔루션을 사용하고 싶습니다.

var myString = "test";
if(myString.constructor === String)
{
     //It's a string
}

3
4 년 후 Cody의 답변과 다른 점은 무엇입니까?
Jonathan H

3
@Sheljohn Cody의 답변은 훌륭합니다. 내 대답 (전체 텍스트)이 짧고 요점에 가깝습니다. 당신은 물었다 : :)
ScottyG

기능으로,이 처리하는 방법 필요 undefined하고 null, 여전히 빈 문자열 (모두 응답 권리를 얻기 ''new String('')).
MikeBeaton

@MikeBeaton 문제 없습니다 : (mystring || false) && mystring.constructor === String. 부울을 반환 해야하는 함수에 사용되는 경우 false를 사용했습니다.
alans

13

성능이 중요한 이유는 다음과 같습니다.

문자열을 테스트하는 것만 큼 간단한 작업을 수행하는 것은 올바르게 수행되지 않으면 비쌀 수 있습니다.

예를 들어 어떤 것이 문자열인지 테스트하는 함수를 작성하려면 다음 두 가지 방법 중 하나로 수행 할 수 있습니다.

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

2) const isString = str => ((typeof str === 'string') || (str instanceof String));

둘 다 매우 간단하므로 성능에 어떤 영향을 줄 수 있습니까? 일반적으로 함수 호출은 특히 내부에서 무슨 일이 일어나고 있는지 모르는 경우 비용이 많이들 수 있습니다. 첫 번째 예에서는 Object의 toString 메소드에 대한 함수 호출이 있습니다. 두 번째 예에서는 typeof 및 instanceof가 연산자이므로 함수 호출이 없습니다. 연산자는 함수 호출보다 훨씬 빠릅니다.

성능을 테스트 할 때 예제 1은 예제 2보다 79 % 느립니다!

테스트를 참조하십시오 : https://jsperf.com/isstringtype


테스트 링크는 죽었지 만 당신을 믿습니다. 이런 종류의 정보는 매우 중요합니다. IMHO 이것은 가장 많이 찬성 된 답변이 아니더라도 최소한 현재의 현행 답변에 대해 가장 많이 찬성 된 의견이어야합니다.
Coderer

typeof str === 'string' || str instanceof String(내가 선호하는 괄호를 삭제할 수 있음 if (..)); 그럼에도 불구하고, # 2에서 기본 및 객체 유형을 모두 확인하는 것이 명확하고 충분합니다. 이 검사는 어쨌든 '희귀'해야합니다.
user2864740

12
if (s && typeof s.valueOf() === "string") {
  // s is a string
}

문자열 리터럴 let s = 'blah'과 객체 문자열 모두에서 작동let s = new String('blah')


3
주의! 빈 문자열에서는 잘못된 것이므로 실패합니다.
Philipp Sumi


5

@customcommander 솔루션은 귀하의 사례의 90 %에 충분하다고 생각합니다.

typeof str === 'string'

올바르게 서비스해야합니다 (일반적으로 new String('something')코드에 이유가 없기 때문에 간단 합니다).

당신이 처리에 관심이 있다면 String객체를 (예 : 타사의 var를 기대하십시오) @ ClearCloud8이 제안한대로 lodash를 사용하면 명확하고 간단하며 우아한 솔루션처럼 보입니다.

그러나 크기 때문에 lodash와 같은 라이브러리에주의를 기울일 것을 제안합니다. 대신에

import _ from 'lodash'
...
_.isString(myVar)

거대한 lodash 객체를 가져 오는 것은 다음과 같습니다.

import { isString as _isString } from 'lodash'
...
_isString(myVar)

그리고 간단한 번들링으로 괜찮을 것입니다 (클라이언트 코드를 참조하십시오).


왜 === = = 충분할 때
zavr

4

node.js 환경에서 작업하는 경우 utils에서 내장 함수 isString을 간단히 사용할 수 있습니다.

const util = require('util');
if (util.isString(myVar)) {}

편집 : @ Jee가 언급했듯이 이것은 v4부터 더 이상 사용되지 않습니다.


대체품이 있습니까?
Anthony Kong

3
문서에 " typeof value === 'string'대신 사용"이라고 표시되어 있습니다.
Mr Rogers

x = new String('x'); x.isString(x);false를 반환합니다 . 이 util.types.isStringObject()그러나 대한이 false를 반환 x = 'x'타입 캐릭터. 전혀 유틸리티를 제공하지 않는 두 가지 유틸리티 기능 ...
spinkus

4

다음 방법은 변수가 문자열인지 확인합니다 ( 존재하지 않는 변수 포함 ).

const is_string = value => {
  try {
    return typeof value() === 'string';
  } catch (error) {
    return false;
  }
};

let example = 'Hello, world!';

console.log(is_string(() => example)); // true
console.log(is_string(() => variable_doesnt_exist)); // false

3

또한 이것이 잘 작동하고 다른 예제보다 훨씬 짧다는 것을 알았습니다.

if (myVar === myVar + '') {
   //its string
} else {
   //its something else
}

빈 따옴표를 연결하면 값이 문자열로 바뀝니다. 경우는 myVar이미 문이 성공 인 경우 다음 문자열입니다.


3
유일한 문제는 변수의 유형을 확인하려고 할 때 변수를 강제한다는 것입니다. 와 비교할 때 조금 비싸 보입니다 typeof.
Olical

1
그래 맞아. jsperf이보다 약 20 % 느리지 typeof만 여전히 약간 빠르다고 말했다 toString. 어느 쪽이든, 나는 강제력에 대한 구문을 좋아한다고 생각합니다.
Chris Dolphin

4
이것은 문자열 유형에서는 작동하지 않습니다. var s = new String('abc'); > s === s + '' > false
user5672998

1
new String유형을 만드는 cus에서는 작동하지 않습니다 object. w3schools.com/js/tryit.asp?filename=tryjs_string_object2
Chris Dolphin

좋은 생각이지만 객체로 감싸 진 문자열의 경우는 생략합니다.
Anthony Rutledge

3
var a = new String('')
var b = ''
var c = []

function isString(x) {
  return x !== null && x !== undefined && x.constructor === String
}

console.log(isString(a))
console.log(isString(b))
console.log(isString(c))

x.constructor === 문자열이 null 또는 undefined에 대해 false를 반환하는 경우 null 또는 undefined를 확인해야하는 이유는 무엇입니까?
Jules Manson

1
@JulesManson : 오류가 발생하지 않고 오류가 발생 false합니다.
Ry-

3

나는 유형 검사를하는 것이 유용이 간단한 기술 찾을 문자열 -

String(x) === x // true, if x is a string
                // false in every other case

const test = x =>
  console.assert
    ( String(x) === x
    , `not a string: ${x}`
    )

test("some string")
test(123)           // assertion failed
test(0)             // assertion failed
test(/some regex/)  // assertion failed
test([ 5, 6 ])      // assertion failed
test({ a: 1 })      // assertion failed
test(x => x + 1)    // assertion failed

같은 기술이 Number 에도 적용됩니다.

Number(x) === x // true, if x is a number
                // false in every other case

const test = x =>
  console.assert
    ( Number(x) === x
    , `not a number: ${x}`
    )

test("some string") // assertion failed
test(123)           
test(0)             
test(/some regex/)  // assertion failed
test([ 5, 6 ])      // assertion failed
test({ a: 1 })      // assertion failed
test(x => x + 1)    // assertion failed

그리고 RegExp의 경우 -

RegExp(x) === x // true, if x is a regexp
                // false in every other case

const test = x =>
  console.assert
    ( RegExp(x) === x
    , `not a regexp: ${x}`
    )

test("some string") // assertion failed
test(123)           // assertion failed
test(0)             // assertion failed
test(/some regex/)  
test([ 5, 6 ])      // assertion failed
test({ a: 1 })      // assertion failed
test(x => x + 1)    // assertion failed

객체 와 동일 -

Object(x) === x // true, if x is an object
                // false in every other case

NB, 정규 표현식, 배열 및 함수도 객체로 간주됩니다.

const test = x =>
  console.assert
    ( Object(x) === x
    , `not an object: ${x}`
    )

test("some string") // assertion failed
test(123)           // assertion failed
test(0)             // assertion failed
test(/some regex/)  
test([ 5, 6 ])      
test({ a: 1 })      
test(x => x + 1)    

그러나 배열을 확인 하는 것은 약간 다릅니다.

Array.isArray(x) === x // true, if x is an array
                       // false in every other case

const test = x =>
  console.assert
    ( Array.isArray(x)
    , `not an array: ${x}`
    )

test("some string") // assertion failed
test(123)           // assertion failed
test(0)             // assertion failed
test(/some regex/)  // assertion failed
test([ 5, 6 ])      
test({ a: 1 })      // assertion failed
test(x => x + 1)    // assertion failed

그러나이 기법은 함수 에서는 작동 하지 않습니다.

Function(x) === x // always false

var x = new String(x); String(x)===xfalse를 반환합니다. 그러나 ({}).toString.call(x).search(/String/)>0항상 힘줄 것들에 대한 반환
동기화

1
function isClass(x,re){return ({}).toString.call(x).search(re)>0;}; isClass("hello",/String/) 또는 isClass(3,/Number/)또는isClass(null,/Null/)
동기화

2

간단한 해결책은 다음과 같습니다.

var x = "hello"

if(x === x.toString()){
// it's a string 
}else{
// it isn't
}

1
문자열인지 확인 하지 않습니다 . 그것은 문자열로 만들어지고, 많은 것들이 toString()기능합니다
Muhammad Umer

7
@MuhammadUmer 예, 문자열로 변환 한 다음 원래 값과 비교하여 동일성을 확인 합니다. 원래 값도 문자열 인 경우 에만 True 입니다.
MrWhite

4
이것은 잘못이다 : .toString어떤 값도 맹목적으로 부를 수 없다 . 검사 할 x가 null이거나 정의되지 않은 경우 시도 코드 예외
user5672998

1
아이디어는 여전히 사용할 수 있습니다. x === String (x)는 안전하고 작동합니다.
Márton Sári

정말? 이 솔루션은 너무 이상해 보입니다. toString()메서드가 재정의되어 특정 구현으로 인해 예외가 발생할 수 있으며 검사가 확실하게 작동하지 않기 때문입니다. 주요 아이디어는 얻고 자하는 것과 관련이없는 메소드를 호출해서는 안된다는 것입니다. 나는 그 toString방법 과 관련된 불필요한 오버 헤드에 대해 이야기하고 있지 않습니다 . 다운 보팅.
Rustem Zinnatullin

2

유형 검사기 도우미 :

function isFromType(variable, type){
  if (typeof type == 'string') res = (typeof variable == type.toLowerCase())
  else res = (variable.constructor == type)
  return res
}

용법:

isFromType('cs', 'string') //true
isFromType('cs', String) //true
isFromType(['cs'], Array) //true
isFromType(['cs'], 'object') //false

또한 재귀 적으로 만들고 싶다면 (예 : Object 인 Array)을 사용할 수 있습니다 instanceof.

( ['cs'] instanceof Object //true)


2

변수가 특정 유형인지 또는 특정 유형의 유형인지 여부를 알려주는 나머지 경로로 이동합니다.
JS는 ducktyping을 기반으로합니다. 무언가가 문자열처럼 cks 경우, 문자열처럼 사용할 수 있고 사용해야합니다.

7문자열? 그렇다면 왜 /\d/.test(7)작동합니까?
{toString:()=>('hello there')}문자열? 그렇다면 왜 ({toString:()=>('hello there')}) + '\ngeneral kenobi!'작동합니까?
이들에 대한 질문이 없습니다 SHOULD 위의 작품은, 요점은 그들이 할 수 있습니다.

그래서 내가 만든 duckyString()기능을
내가하지 다른 답변으로 음식을 장만 많은 경우를 테스트 아래. 각 코드마다 :

  • 문자열 같은 변수를 설정
  • 동일한 문자열 작업과 실제 문자열을 실행하여 출력을 비교합니다 (문자열처럼 처리 할 수 ​​있음을 증명합니다)
  • 문자열과 같은 문자열을 실제 문자열로 변환하여 실제 문자열을 duckyString()예상하는 코드의 입력을 정규화하는 것을 보여줍니다.
text = 'hello there';
out(text.replace(/e/g, 'E') + ' ' + 'hello there'.replace(/e/g, 'E'));
out('Is string? ' + duckyString(text) + '\t"' + duckyString(text, true) + '"\n');

text = new String('oh my');
out(text.toUpperCase() + ' ' + 'oh my'.toUpperCase());
out('Is string? ' + duckyString(text) + '\t"' + duckyString(text, true) + '"\n');

text = 368;
out((text + ' is a big number') + ' ' + ('368' + ' is a big number'));
out('Is string? ' + duckyString(text) + '\t"' + duckyString(text, true) + '"\n');

text = ['\uD83D', '\uDE07'];
out(text[1].charCodeAt(0) + ' ' + '😇'[1].charCodeAt(0));
out('Is string? ' + duckyString(text) + '\t"' + duckyString(text, true) + '"\n');

function Text() { this.math = 7; }; Text.prototype = {toString:function() { return this.math + 3 + ''; }}
text = new Text();
out(String.prototype.match.call(text, '0') + ' ' + text.toString().match('0'));
out('Is string? ' + duckyString(text) + '\t"' + duckyString(text, true) + '"\n');

이것은 실제 배열을 필요로하지 않고 배열 과 비슷한 것이 있는지 테스트하는 !!x것과는 정반대 입니다. jQuery 객체; 그것들은 배열입니까? 아뇨. 충분 해요? 예, 기능을 통해 제대로 실행할 수 있습니다 . JS에 강력한 기능을 제공 하고 문자열을 테스트 하면 코드의 상호 운용성이 떨어집니다.x===true
Array.prototype

위의 결과는 다음과 같습니다.

hEllo thErE hEllo thErE
Is string? true "hello there"

OH MY OH MY
Is string? true "oh my"

368 is a big number 368 is a big number
Is string? true "368"

56839 56839
Is string? true "😇"

0 0
Is string? true "10"

따라서 문자열이 무엇인지 알고 싶은 이유 가 전부 입니다.
나처럼, 당신이 구글에서 여기에 도착하여 문자열 같은 것이 있는지 알고 싶다면 여기에 답이 있습니다.
실제로 길거나 깊게 중첩 된 char 배열로 작업하지 않는 한 비싸지 않습니다.
모든 if 문이기 때문에 같은 함수 호출이 없기 때문입니다 .toString(). 의 또는 멀티 바이트 문자
만있는 객체가있는 char 배열을 확인하려는 경우를 제외하고 toString()는 문자열을 만드는 것 외에는 확인할 다른 방법이 없으며 바이트를 구성하는 문자 수를 각각 계산하십시오

function duckyString(string, normalise, unacceptable) {
    var type = null;
    if (!unacceptable)
        unacceptable = {};
    if (string && !unacceptable.chars && unacceptable.to == null)
        unacceptable.to = string.toString == Array.prototype.toString;

    if (string == null)
        ;

    //tests if `string` just is a string
    else if (
        !unacceptable.is &&
        (typeof string == 'string' || string instanceof String)
    )
        type = 'is';

    //tests if `string + ''` or `/./.test(string)` is valid
    else if (
        !unacceptable.to &&
        string.toString && typeof string.toString == 'function' && string.toString != Object.prototype.toString
    )
        type = 'to';

    //tests if `[...string]` is valid
    else if (
        !unacceptable.chars &&
        (string.length > 0 || string.length == 0)
    ) {
        type = 'chars';
        //for each char
        for (var index = 0; type && index < string.length; ++index) {
            var char = string[index];

            //efficiently get its length
            var length = ((duckyString(char, false, {to:true})) ?
                char :
                duckyString(char, true) || {}
            ).length;

            if (length == 1)
                continue;

            //unicode surrogate-pair support
            char = duckyString(char, true);
            length = String.prototype[Symbol && Symbol.iterator];
            if (!(length = length && length.call(char)) || length.next().done || !length.next().done)
                type = null;
        }
    }

    //return true or false if they dont want to auto-convert to real string
    if (!(type && normalise))
        //return truthy or falsy with <type>/null if they want why it's true
        return (normalise == null) ? type != null : type;

    //perform conversion
    switch (type) {
    case 'is':
        return string;
    case 'to':
        return string.toString();
    case 'chars':
        return Array.from(string).join('');
    }
}

옵션이 포함되어 있습니다

  • 어떤 방법이 문자열 y로 간주되는지 묻습니다.
  • 문자열 감지 방법 제외 (예 : 싫어하는 경우 .toString())

내가 완성 주의자이기 때문에 더 많은 테스트가 있습니다.

out('Edge-case testing')
function test(text, options) {
    var result = duckyString(text, false, options);
    text = duckyString(text, true, options);
    out(result + ' ' + ((result) ? '"' + text + '"' : text));
}
test('');
test(null);
test(undefined);
test(0);
test({length:0});
test({'0':'!', length:'1'});
test({});
test(window);
test(false);
test(['hi']);
test(['\uD83D\uDE07']);
test([['1'], 2, new String(3)]);
test([['1'], 2, new String(3)], {chars:true});
  • 모든 부정적인 경우가 설명되는 것 같습니다
  • 브라우저> = IE8에서 실행되어야합니다.
  • 문자열 반복자를 지원하는 브라우저에서 다중 바이트를 지원하는 문자 배열

산출:

Edge-case testing
is ""
null null
null null
to "0"
chars ""
chars "!"
null null
chars ""
to "false"
null null
chars "😇"
chars "123"
to "1,2,3"

1

@DRAX의 답변 을 확장하기 위해 다음과 같이하십시오.

function isWhitespaceEmptyString(str)
{
    //RETURN:
    //      = 'true' if 'str' is empty string, null, undefined, or consists of white-spaces only
    return str ? !(/\S/.test(str)) : (str === "" || str === null || str === undefined);
}

또한 nulls 및 undefined유형을 고려하고와 같이 문자열이 아닌 유형을 처리 0합니다.


1

이것은 나에게 충분합니다.

경고 : 이것은 완벽한 솔루션이 아닙니다. 내 게시물의 하단을 참조하십시오.

Object.prototype.isString = function() { return false; };
String.prototype.isString = function() { return true; };

var isString = function(a) {
  return (a !== null) && (a !== undefined) && a.isString();
};

그리고 당신은 이것을 아래와 같이 사용할 수 있습니다.

//return false
isString(null);
isString(void 0);
isString(-123);
isString(0);
isString(true);
isString(false);
isString([]);
isString({});
isString(function() {});
isString(0/0);

//return true
isString("");
isString(new String("ABC"));

경고 : 이 경우에는 제대로 작동하지 않습니다.

//this is not a string
var obj = {
    //but returns true lol
    isString: function(){ return true; }
}

isString(obj) //should be false, but true

-1

이 기능을 사용하여 모든 유형을 결정할 수 있습니다.

var type = function(obj) {
    return Object.prototype.toString.apply(obj).replace(/\[object (.+)\]/i, '$1').toLowerCase();
};

변수가 문자열인지 확인하려면 :

type('my string') === 'string' //true
type(new String('my string')) === 'string' //true
type(`my string`) === 'string' //true
type(12345) === 'string' //false
type({}) === 'string' // false

https://codepen.io/patodiblasi/pen/NQXPwY?editors=0012


-2

string내용에 관계없이 유형 인지 또는 유형에 관계없이 내용이 숫자 또는 문자열인지 여부를 알고 있는지 확실하지 않습니다 .

따라서 유형이 문자열인지 확인하려면 이미 대답했습니다.
그러나 문자열 또는 숫자인지 여부를 내용을 기반으로 알고 싶다면 다음을 사용하십시오.

function isNumber(item) {
    return (parseInt(item) + '') === item;
}

그리고 몇 가지 예를 들면 :

isNumber(123);   //true
isNumber('123'); //true
isNumber('123a');//false
isNumber('');    //false

원래 유형을 확인하는 방법을 묻고 있었지만 당시에는 질문을 구성하는 방법조차 몰랐습니다. (아마도 /^\d+$/.test('123')잠재적 파싱 문제의 복잡성을 피하기 위해이 작업을 수행했을 것입니다 )
Olical
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.