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

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



답변

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 는 기본 객체 래퍼는 더 이상 사용하지 않는 것이 좋습니다 .

답변

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

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


답변

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))


답변

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 설명서 를 참조하십시오.


답변

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

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

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


답변

가장 좋은 방법은:

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. 다시 말해, 우리는 신경 쓰지 않았다 그 유형이 무엇인지 .

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


답변

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'));