etc./StackOverFlow

JavaScript에서 변수가 배열인지 어떻게 확인합니까? [복제하다]

청렴결백한 만능 재주꾼 2021. 12. 21. 22:08
반응형

질문자 :Andy McCluggage


JavaScript에서 변수가 배열인지 단일 값인지 확인하고 싶습니다.

가능한 해결책을 찾았습니다...

 if (variable.constructor == Array)...

이것이 이것이 가능한 최선의 방법입니까?



변수가 배열인지 아닌지 확인하는 방법에는 여러 가지가 있습니다. 가장 좋은 솔루션은 선택한 솔루션입니다.

 variable.constructor === Array

이것은 Chrome 및 다른 모든 브라우저에서 가장 빠른 방법입니다. 모든 배열은 객체이므로 생성자 속성을 확인하는 것은 JavaScript 엔진의 빠른 프로세스입니다.

객체 속성이 배열인지 확인하는 데 문제가 있는 경우 먼저 속성이 있는지 확인해야 합니다.

 variable.prop && variable.prop.constructor === Array

다른 방법은 다음과 같습니다.

 Array.isArray(variable)

2019년 5월 23일 Chrome 75를 사용하여 업데이트합니다. @AnduAndrici의 질문으로 이 질문을 다시 살펴보게 해주셔서 감사합니다. 이 질문은 제 생각에 가장 추하고 가장 느린 질문 중 하나입니다. 첫 번째 예와 같이 약 1/5의 속도를 실행합니다. 이 녀석은 약 2-5% 느리지만 말하기가 꽤 어렵습니다. 사용하기 딱! 결과에 상당히 감동했습니다. Array.prototype은 실제로 배열입니다. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray에서 자세한 내용을 읽을 수 있습니다.

 variable instanceof Array

이 방법은 첫 번째 예와 같이 약 1/3의 속도로 실행됩니다. 여전히 꽤 견고하고 더 깔끔해 보입니다. 예쁜 코드만 중요하게 생각하고 성능은 그다지 중요하지 않습니다. 숫자 확인은 variable instanceof Number false 반환합니다. 업데이트: instanceof 이제 2/3의 속도를 냅니다!

그래서 또 다른 업데이트

 Object.prototype.toString.call(variable) === '[object Array]';

이 사람은 배열을 확인하는 데 가장 느립니다. 그러나 이것은 당신이 찾고 있는 모든 유형을 위한 원스톱 상점입니다. 그러나 배열을 찾고 있으므로 위의 가장 빠른 방법을 사용하십시오.

또한 다음과 같은 몇 가지 테스트를 실행했습니다. http://jsperf.com/instanceof-array-vs-array-isarray/35 따라서 재미를 보고 확인하십시오.

참고: @EscapeNetscape는 jsperf.com이 다운됨에 따라 또 다른 테스트를 생성했습니다. http://jsben.ch/#/QgYAV jsperf가 다시 온라인 상태가 될 때마다 원래 링크가 유지되도록 하고 싶었습니다.


jemiloii

다음을 사용할 수도 있습니다.

 if (value instanceof Array) { alert('value is Array!'); } else { alert('Not an array'); }

이것은 나에게 꽤 우아한 솔루션으로 보이지만 각자에게는 자신의 것입니다.

편집하다:

ES5부터는 다음도 있습니다.

 Array.isArray(value);

그러나 이것은 폴리필(기본적으로... IE8 또는 이와 유사한 것)을 사용하지 않는 한 이전 브라우저에서 중단됩니다.


Brett Bender

고유한 단점이 있는 여러 솔루션이 있습니다. 이 페이지 는 좋은 개요를 제공합니다. 한 가지 가능한 솔루션은 다음과 같습니다.

 function isArray(o) { return Object.prototype.toString.call(o) === '[object Array]'; }

Peter Smit

누군가 jQuery를 언급한 것을 보았지만 isArray() 함수가 있는지 몰랐습니다. 버전 1.3에 추가된 것으로 나타났습니다.

jQuery는 Peter가 제안한 대로 이를 구현합니다.

 isArray: function( obj ) { return toString.call(obj) === "[object Array]"; },

jQuery(특히 브라우저 간 호환성을 위한 기술)를 이미 많이 믿었기 때문에 버전 1.3으로 업그레이드하고 해당 기능을 사용하거나(업그레이드가 너무 많은 문제를 일으키지 않는다는 전제 하에) 이 제안된 방법을 내 암호.

제안에 감사드립니다.


Andy McCluggage

최신 브라우저(및 일부 레거시 브라우저)에서는 다음을 수행할 수 있습니다.

 Array.isArray(obj)

( 지원 크롬 5, 파이어 폭스 4.0, IE 9, 오페라 10.5 사파리 5)

이전 버전의 IE를 지원해야 하는 경우 es5-shim 을 사용하여 Array.isArray를 폴리필할 수 있습니다. 또는 다음을 추가하십시오

 # only implement if no native implementation is available if (typeof Array.isArray === 'undefined') { Array.isArray = function(obj) { return Object.prototype.toString.call(obj) === '[object Array]'; } };

jQuery를 사용하는 경우 jQuery.isArray(obj) 또는 $.isArray(obj) 사용할 수 있습니다. 밑줄을 사용하는 경우 _.isArray(obj)

다른 프레임에서 생성된 배열을 감지할 필요가 없다면 instanceof

 obj instanceof Array

참고 : arguments 키워드는 (일반적으로) 다음과 같이 동작하더라도 배열이 아닙니다.

 var func = function() { console.log(arguments) // [1, 2, 3] console.log(arguments.length) // 3 console.log(Array.isArray(arguments)) // false !!! console.log(arguments.slice) // undefined (Array.prototype methods not available) console.log([3,4,5].slice) // function slice() { [native code] } } func(1, 2, 3)


Fela

이것은 오래된 질문이지만 동일한 문제가 있어 공유하고 싶은 매우 우아한 솔루션을 찾았습니다.

Array에 프로토타입을 추가하면 매우 간단합니다.

 Array.prototype.isArray = true;

이제 한 번만 개체가 배열인지 확인하기 위해 테스트하려는 개체가 있는 경우 새 속성을 확인하기만 하면 됩니다.

 var box = doSomething(); if (box.isArray) { // do something }

isArray는 배열인 경우에만 사용할 수 있습니다.


Ibu

크록포드 경유:

 function typeOf(value) { var s = typeof value; if (s === 'object') { if (value) { if (value instanceof Array) { s = 'array'; } } else { s = 'null'; } } return s; }

Crockford가 언급한 주요 실패 사례는 다른 컨텍스트(예: window 에서 생성된 배열을 올바르게 결정할 수 없다는 것입니다. 이 페이지가 충분하지 않은 경우 해당 페이지에는 훨씬 더 정교한 버전이 있습니다.


Hank Gay

EcmaScript 5 이상만 다루는 경우 내장된 Array.isArray 함수를 사용할 수 있습니다.

예,

 Array.isArray([]) // true Array.isArray("foo") // false Array.isArray({}) // false

JaredMcAteer

저는 개인적으로 Peter의 제안을 좋아합니다: https://stackoverflow.com/a/767499/414784 (ECMAScript 3의 경우. ECMAScript 5의 경우 Array.isArray() )

그러나 게시물에 대한 댓글에 따르면 toString() 이 전혀 변경되면 배열을 확인하는 방법이 실패합니다. 정말로 구체적이고 toString() 이 변경되지 않았는지 확인하고 객체 클래스 속성( [object Array] 은 배열인 객체의 클래스 속성임)에 문제가 없는지 확인하려면 다음을 수행하는 것이 좋습니다. 이 같은:

 //see if toString returns proper class attributes of objects that are arrays //returns -1 if it fails test //returns true if it passes test and it's an array //returns false if it passes test and it's not an array function is_array(o) { // make sure an array has a class attribute of [object Array] var check_class = Object.prototype.toString.call([]); if(check_class === '[object Array]') { // test passed, now check return Object.prototype.toString.call(o) === '[object Array]'; } else { // may want to change return value to something more desirable return -1; } }

하는 것으로는 자바 스크립트 확실한 가이드 6 판, 7.10, 그것은 말한다 Array.isArray() 사용하여 구현됩니다 Object.prototype.toString.call() 또한 걱정할 거라면 참고 인 ECMAScript 5에서 toString() ' 구현이 변경되면 다른 모든 내장 메소드도 변경되는 것에 대해 걱정해야 합니다. 왜 push() 합니까? 누군가는 그것을 바꿀 수 있습니다! 그러한 접근은 어리석은 것입니다. toString() 변경이 걱정되는 분들을 위한 솔루션이지만 체크는 불필요하다고 생각합니다.


Brian

이 질문을 게시했을 때 내가 사용하고 있던 JQuery 버전에는 isArray 함수가 포함되어 있지 않았습니다. 있었다면 아마도 이 특정 유형 검사를 수행하기 위한 최상의 브라우저 독립적인 방법으로 구현을 신뢰하여 사용했을 것입니다.

JQuery는 이제 이 기능을 제공하므로 항상 사용할 것입니다...

 $.isArray(obj);

(버전 1.6.2 현재) 여전히 다음 형식의 문자열에 대한 비교를 사용하여 구현됩니다.

 toString.call(obj) === "[object Array]"

Andy McCluggage

스크립트에서 Underscore.js 라이브러리를 이미 사용하고 있는 사람들을 위해 다른 옵션을 추가할 생각입니다. Underscore.js에는 isArray() 함수가 있습니다( http://underscorejs.org/#isArray 참조).

 _.isArray(object)

객체가 배열이면 true를 반환합니다.


Benjen

Angular를 사용하는 경우 angular.isArray() 함수를 사용할 수 있습니다.

 var myArray = []; angular.isArray(myArray); // returns true var myObj = {}; angular.isArray(myObj); //returns false

http://docs.angularjs.org/api/ng/function/angular.isArray


joseph.l.hunsaker

Crockford의 JavaScript Good Parts 에는 주어진 인수가 배열인지 확인하는 함수가 있습니다.

 var is_array = function (value) { return value && typeof value === 'object' && typeof value.length === 'number' && typeof value.splice === 'function' && !(value.propertyIsEnumerable('length')); };

그는 다음과 같이 설명합니다.

먼저 값이 참인지 묻습니다. null 및 기타 거짓 값을 거부하기 위해 이 작업을 수행합니다. 둘째, typeof 값이 'object'인지 묻습니다. 이것은 객체, 배열 및 (이상하게) null에 대해 사실입니다. 셋째, 값에 숫자인 길이 속성이 있는지 묻습니다. 이것은 항상 배열에 해당되지만 일반적으로 객체에는 해당되지 않습니다. 넷째, 값에 splice 메서드가 포함되어 있는지 묻습니다. 이것은 모든 어레이에 대해 다시 사실이 될 것입니다. 마지막으로 길이 속성이 열거 가능한지 묻습니다(길이는 for in 루프에 의해 생성됩니까?). 모든 배열에 대해 false가 됩니다. 이것은 내가 찾은 배열성에 대한 가장 신뢰할 수 있는 테스트입니다. 너무 복잡해서 아쉽습니다.


Yunzhou

범용 솔루션은 다음과 같습니다.

 Object.prototype.toString.call(obj)=='[object Array]'

ECMAScript 5부터 정식 솔루션은 다음과 같습니다.

 Array.isArray(arr)

또한 이전 JavaScript 라이브러리의 경우 정확하지는 않지만 아래 솔루션을 찾을 수 있습니다.

 var is_array = function (value) { return value && typeof value === 'object' && typeof value.length === 'number' && typeof value.splice === 'function' && !(value.propertyIsEnumerable('length')); };

솔루션은 http://www.pixelstech.net/topic/85-How-to-check-whether-an-object-is-an-array-or-not-in-JavaScript 에서 제공됩니다.


PixelsTech

https://github.com/miksago/Evan.js/blob/master/src/evan.js 에서 참조한 코드

 var isArray = Array.isArray || function(obj) { return !!(obj && obj.concat && obj.unshift && !obj.callee);};

didxga

이 코드 줄을 사용하고 있었습니다.

 if (variable.push) { // variable is array, since AMAIK only arrays have push() method. }

Saeed Neamati

코드 골프를 하는 사람들을 위해, 가장 적은 수의 문자로 신뢰할 수 없는 테스트:

 function isArray(a) { return a.map; }

계층 구조를 순회/평탄화할 때 일반적으로 사용됩니다.

 function golf(a) { return a.map?[].concat.apply([],a.map(golf)):a; } input: [1,2,[3,4,[5],6],[7,[8,[9]]]] output: [1, 2, 3, 4, 5, 6, 7, 8, 9]

Joe Frambach

w3schools에서 :

 function isArray(myArray) { return myArray.constructor.toString().indexOf("Array") > -1; }

Jahid

나는 Brian의 대답을 좋아했습니다.

 function is_array(o){ // make sure an array has a class attribute of [object Array] var check_class = Object.prototype.toString.call([]); if(check_class === '[object Array]') { // test passed, now check return Object.prototype.toString.call(o) === '[object Array]'; } else{ // may want to change return value to something more desirable return -1; } }

하지만 다음과 같이 할 수 있습니다.

 return Object.prototype.toString.call(o) === Object.prototype.toString.call([]);

zeageorge

실제 유형을 반환할 수 있는 이 약간의 코드를 만들었습니다.

아직 성능에 대해서는 잘 모르겠지만 typeof를 제대로 식별하려는 시도입니다.

https://github.com/valtido/better-typeOf 또한 여기에 대해 약간의 블로그를 작성했습니다. http://www.jqui.net/jquery/better-typeof-than-the-javascript-native-typeof/

현재 typeof와 유사하게 작동합니다.

 var user = [1,2,3] typeOf(user); //[object Array]

그것은 약간의 미세 조정이 필요할 수 있다고 생각하고, 나는 그것을 제대로 접하거나 테스트하지 않은 것을 고려합니다. 따라서 성능 측면에서든 typeOf를 잘못 보고하든 추가 개선을 환영합니다.


Val

myObj.constructor==Object 및 myArray.constructor==Array를 사용하는 것이 가장 좋은 방법이라고 생각합니다. toString()을 사용하는 것보다 거의 20배 빠릅니다. 자신의 생성자로 객체를 확장하고 해당 생성이 "객체"로 간주되기를 원하면 이것이 작동하지 않지만 그렇지 않으면 더 빠릅니다. typeof는 생성자 메서드만큼 빠르지만 typeof []=='object'는 종종 바람직하지 않은 true를 반환합니다. http://jsperf.com/constructor-vs-tostring

한 가지 유의할 점은 null.constructor가 오류를 발생시키므로 null 값을 확인하는 경우 먼저 if(testThing!==null){}을 수행해야 한다는 것입니다.


user1585789

.length 속성은 javascript의 배열에 대해 특별하기 때문에 간단히 말할 수 있습니다.

 obj.length === +obj.length // true if obj is an array

Underscorejs 및 기타 여러 라이브러리는 이 짧고 간단한 트릭을 사용합니다.


TypingTurtle

방금 생각해낸 것:

if (item.length) //This is an array else //not an array


trololol

출처 : http:www.stackoverflow.com/questions/767486/how-do-you-check-if-a-variable-is-an-array-in-javascript

반응형