JavaScript에서 변수가 문자열인지 아니면 다른 것인지 어떻게 알 수 있습니까?
질문자 :Olical
이것이 나를 위해 일하는 것입니다.
if (typeof myVar === 'string' || myVar instanceof String) // it's a string else // it's something else
DRAX
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] 에 대해 권장됩니다. 원하는 경우 이러한 처리 방법에 대한 다른 답변을 참조하십시오.
- Google JavaScript 스타일 가이드 에서는 원시 객체 래퍼를 절대 사용하지 말라고 합니다.
- Douglas Crockford 는 원시 객체 래퍼가 더 이상 사용되지 않을 것을 권장했습니다 .
Pablo Santa Cruz
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
이기 때문에 Pablo Santa Cruz의 대답은 잘못되었습니다.
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))
Orwellophile
jQuery 또는 lodash/Underscore 의 내장 함수를 사용하는 것이 좋습니다. 사용하기 쉽고 읽기 쉽습니다.
두 함수 모두 DRAX가 언급한 경우를 처리합니다... 즉, 둘 다 (A) 변수가 문자열 리터럴인지 또는 (B) 문자열 개체의 인스턴스인지 확인합니다. 두 경우 모두 이러한 함수는 값을 문자열로 올바르게 식별합니다.
lodash / Underscore.js
if(_.isString(myVar)) //it's a string else //it's something else
제이쿼리
if($.type(myVar) === "string") //it's a string else //it's something else
자세한 내용 은 _.isString()에 대한 lodash 설명서를 참조하십시오.
자세한 내용 은 $.type()에 대한 jQuery 설명서를 참조하십시오.
ClearCloud8
function isString (obj) { return (Object.prototype.toString.call(obj) === '[object String]'); }
나는 그것을 여기에서 보았다:
http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
ling
가장 좋은 방법은:
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
함수에 Number
로 전달했는지 확인했습니다. 다시 말해, 우리는 그 유형이 무엇인지 조차 신경 쓰지 않았습니다.
더 많은 작업을 할 수 있기를 바랍니다. :)
Cody
이 경우 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'));
customcommander
성능
오늘 2020.09.17 저는 선택한 솔루션에 대해 Chrome v85, Safari v13.1.2 및 Firefox v80의 MacOs HighSierra 10.13.6에서 테스트를 수행합니다.
결과
모든 브라우저(두 테스트 케이스 모두)
- 솔루션
typeof||instanceof
(A, I) 및x===x+''
(H)가 가장 빠름/가장 빠름 - 솔루션
_.isString
(lodash lib)은 중간/빠름입니다. - 솔루션 B와 K가 가장 느림
업데이트 :에 대한 2020년 11월 28일 I 갱신 결과 x=123 Chrome
열 - 솔루션을 I
아마 이전에 오류 값이 있었다 (= 69M 너무 낮음) - 내가 테스트를 반복 크롬 86.0를 사용합니다.
세부
솔루션 A B C D E F G H I J K L에 대해 2가지 테스트 케이스를 수행합니다.
- 변수가 문자열일 때 - 여기에서 실행할 수 있습니다.
- 변수가 문자열이 아닌 경우 - 여기에서 실행할 수 있습니다.
아래 스니펫은 솔루션 간의 차이점을 나타냅니다.
// https://stackoverflow.com/a/9436948/860099 function A(x) { return (typeof x == 'string') || (x instanceof String) } // https://stackoverflow.com/a/17772086/860099 function B(x) { return Object.prototype.toString.call(x) === "[object String]" } // https://stackoverflow.com/a/20958909/860099 function C(x) { return _.isString(x); } // https://stackoverflow.com/a/20958909/860099 function D(x) { return $.type(x) === "string"; } // https://stackoverflow.com/a/16215800/860099 function E(x) { return x?.constructor === String; } // https://stackoverflow.com/a/42493631/860099 function F(x){ return x?.charAt != null } // https://stackoverflow.com/a/57443488/860099 function G(x){ return String(x) === x } // https://stackoverflow.com/a/19057360/860099 function H(x){ return x === x + '' } // https://stackoverflow.com/a/4059166/860099 function I(x) { return typeof x == 'string' } // https://stackoverflow.com/a/28722301/860099 function J(x){ return x === x?.toString() } // https://stackoverflow.com/a/58892465/860099 function K(x){ return x && typeof x.valueOf() === "string" } // https://stackoverflow.com/a/9436948/860099 function L(x) { return x instanceof String } // ------------------ // PRESENTATION // ------------------ console.log('Solutions results for different inputs \n\n'); console.log("'abc' Str '' ' ' '1' '0' 1 0 {} [] true false null undef"); let tests = [ 'abc', new String("abc"),'',' ','1','0',1,0,{},[],true,false,null,undefined]; [A,B,C,D,E,F,G,H,I,J,K,L].map(f=> { console.log( `${f.name} ` + tests.map(v=> (1*!!f(v)) ).join` ` )})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script> This shippet only presents functions used in performance tests - it not perform tests itself!
다음은 크롬에 대한 예시 결과입니다.
Kamil Kiełczewski
이 간단한 솔루션을 사용하고 싶습니다.
var myString = "test"; if(myString.constructor === String) { //It's a string }
ScottyG
성능이 중요한 이유를 보여주는 좋은 예입니다.
문자열 테스트와 같이 간단한 작업을 올바르게 수행하지 않으면 비용이 많이 들 수 있습니다.
예를 들어, 무언가가 문자열인지 테스트하는 함수를 작성하려면 다음 두 가지 방법 중 하나로 수행할 수 있습니다.
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
Rob Brander
if (s && typeof s.valueOf() === "string") { // s is a string }
문자열 리터럴 let s = 'blah'
및 객체 문자열 let s = new String('blah')
wheelmaker
lodash에서 가져옴:
function isString(val) { return typeof val === 'string' || ((!!val && typeof val === 'object') && Object.prototype.toString.call(val) === '[object String]'); } console.log(isString('hello world!')); // true console.log(isString(new String('hello world'))); // true
Benj Sicam
@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)
그리고 간단한 번들링으로 당신은 괜찮을 것입니다 (나는 여기에서 클라이언트 코드를 참조합니다).
Erez Cohen
이 함수를 사용하여 모든 유형을 결정할 수 있습니다.
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
다른 유형을 확인하려면:
type(null) //null type(undefined) //undefined type([]) //array type({}) //object type(function() {}) //function type(123) //number type(new Number(123)) //number type(/some_regex/) //regexp type(Symbol("foo")) //symbol
Pato
나는 또한 이것이 잘 작동하고 다른 예보다 훨씬 짧다는 것을 발견했습니다.
if (myVar === myVar + '') { //its string } else { //its something else }
빈 따옴표를 연결하여 값을 문자열로 바꿉니다. myVar
가 이미 문자열이면 if 문이 성공한 것입니다.
Chris Dolphin
이 간단한 기술은 String 유형을 확인하는 데 유용합니다.
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를 확인하는 것은 약간 다릅니다.
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
Mulan
node.js 환경에서 작업하는 경우 utils의 내장 함수 isString을 간단히 사용할 수 있습니다.
const util = require('util'); if (util.isString(myVar)) {}
편집: @Jehy가 언급했듯이 이것은 v4부터 더 이상 사용되지 않습니다.
David
다음 메서드는 변수가 문자열인지 확인합니다( 존재하지 않는 변수 포함 ).
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
Grant Miller
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))
Jake
이 정도면 충분합니다.
경고: 이것은 완벽한 솔루션이 아닙니다. 내 게시물의 하단을 참조하십시오.
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
Tomozma
간단한 해결책은 다음과 같습니다.
var x = "hello" if(x === x.toString()){ // it's a string }else{ // it isn't }
Noris
Typechecker 도우미:
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
)
yaya
여기서 나머지 항목으로 다른 경로로 이동하여 변수가 특정 유형인지 아니면 특정 집합의 구성원인지 알려줍니다.
JS는 덕타이핑을 기반으로 합니다. 무언가가 문자열처럼 돌변한다면, 우리는 그것을 문자열처럼 사용할 수 있고 사용해야 합니다.
7
은 문자열인가요? /\d/.test(7)
작동하는 이유는 무엇입니까?
{toString:()=>('hello there')}
는 문자열인가요? 그렇다면 왜 ({toString:()=>('hello there')}) + '\ngeneral kenobi!'
일하다?
이것은 위의 작업이 작동해야 하는지 에 대한 질문이 아니라 요점은 작동한다는 것입니다.
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===true
아닌 !!x
와 같은 맥락에 있으며 실제 배열을 필요로 하는 대신 배열과 유사한지 테스트합니다.
jQuery 객체; 그들은 배열입니까? 아니요. 충분히 좋은가요? Array.prototype
함수를 통해 잘 실행할 수 있습니다.
JS에 힘을 주는 것은 이러한 유연성이며, 특히 문자열 테스트는 코드의 상호 운용성을 떨어뜨립니다.
위의 출력은 다음과 같습니다.
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"
따라서 무언가가 문자열인지 알고 싶은 이유 에 관한 것입니다.
저와 같이 Google에서 여기로 와서 문자열과 같은 것이 있는지 확인하고 싶다면 여기에 답이 있습니다.
정말 길거나 깊이 중첩된 char 배열로 작업하지 않는 한 비용이 많이 들지 않습니다.
.toString()
과 같은 함수 호출이 없기 때문입니다.
toString()
또는 다중 바이트 문자만 있는 객체가 있는 char 배열인지 확인하려는 경우를 제외하고 이 경우 문자열을 만들고 바이트를 구성하는 문자 수를 계산하는 것 외에는 확인할 다른 방법이 없습니다. , 각각
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(''); } }
옵션이 포함되어 있습니다.
- 어떤 방법이 그것을 string-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"
Hashbrown
@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); }
null
과 undefined
유형도 고려 0
과 같은 문자열이 아닌 유형을 처리합니다.
ahmd0
간단하고 빠른 테스트 방법은 생성자 이름 속성을 사용하는 것입니다.
let x = "abc"; console.log(x.constructor.name === "String"); // true let y = new String('abc'); console.log(y.constructor.name === "String"); // true
성능
Marcel Kohls
lodash 라이브러리에서 구현.
const toString = Object.prototype.toString /** * Gets the `toStringTag` of `value`. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ function getTag(value) { if (value == null) { return value === undefined ? "[object Undefined]" : "[object Null]"; } return toString.call(value); } /** Used as references for various `Number` constants. */ const INFINITY = 1 / 0 /** * Converts `value` to a string. An empty string is returned for `null` * and `undefined` values. The sign of `-0` is preserved. * * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {string} Returns the converted string. * @example * * toString(null) * // => '' * * toString(-0) * // => '-0' * * toString([1, 2, 3]) * // => '1,2,3' */ function isString(value) { const type = typeof value; return ( type === "string" || ( type === "object" && value != null && !Array.isArray(value) && getTag(value) == "[object String]" ) ); }
Filip Seman
string
유형인지 또는 유형에 관계없이 내용이 숫자인지 문자열인지를 알고 있는지 잘 모르겠습니다.
따라서 해당 유형이 문자열인지 확인하려면 이미 답변을 받은 상태입니다.
그러나 내용을 기반으로 문자열 또는 숫자인지 확인하려면 다음을 사용합니다.
function isNumber(item) { return (parseInt(item) + '') === item; }
그리고 몇 가지 예:
isNumber(123); //true isNumber('123'); //true isNumber('123a');//false isNumber(''); //false
Aryeh Beitz
출처 : http:www.stackoverflow.com/questions/4059147/check-if-a-variable-is-a-string-in-javascript
'etc. > StackOverFlow' 카테고리의 다른 글
SQL Server에서 여러 행의 텍스트를 단일 텍스트 문자열로 연결하는 방법 (0) | 2021.12.03 |
---|---|
Git에서 현재 커밋에 대한 해시를 검색하는 방법은 무엇입니까? (0) | 2021.12.03 |
JavaScript에서 두 숫자 사이의 난수 생성 (0) | 2021.12.02 |
TextView에서 텍스트를 가로 및 세로로 가운데에 맞추려면 어떻게 합니까? (0) | 2021.12.02 |
JavaScript에서 배열을 어떻게 비우나요? (0) | 2021.12.02 |