programing

JavaScript에서 변수가 배열인지 확인하려면 어떻게 해야 합니까?

projobs 2023. 2. 3. 21:08
반응형

JavaScript에서 변수가 배열인지 확인하려면 어떻게 해야 합니까?

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.protype은 실제로는 배열입니다.자세한 것은, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray 를 참조해 주세요.

variable instanceof Array

이 방법은 첫 번째 예시와 같이 약 1/3의 속도로 실행됩니다.성능만 중시하고 예쁜 코드를 중시한다면 여전히 견고하고 깔끔해 보입니다.번호 체크는, 다음과 같이 기능하지 않는 것에 주의해 주세요.variable instanceof Number 반환하다false. 업데이트: 이제 속도가 2/3로 향상되었습니다!

그래서 또 다른 업데이트는

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

이 남자는 어레이를 확인하는 데 가장 느립니다.단, 찾으시는 모든 타입의 원스톱 숍입니다.다만, 어레이를 찾고 있는 경우는, 상기의 가장 빠른 방법을 사용해 주세요.

또, 몇개의 테스트도 실시했습니다.http://jsperf.com/instanceof-array-vs-array-isarray/35 그럼, 재미있게 봐 주세요.

주의: jsperf.com 가 다운되어 있기 때문에, @EscapeNetscape 는 다른 테스트를 작성했습니다.http://jsben.ch/ #/QgYAV jsperf가 온라인으로 돌아올 때마다 원래의 링크가 유지되도록 하고 싶었습니다.

다음 항목도 사용할 수 있습니다.

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

이것은 꽤 우아한 해결책으로 보이지만, 저마다의 해결책입니다.

편집:

ES5에서는 다음과 같은 기능도 있습니다.

Array.isArray(value);

그러나 폴리필(기본적으로...)을 사용하지 않는 한 오래된 브라우저에서는 문제가 발생합니다.IE8 등).

여러 가지 해결책이 있지만, 그 나름의 기이한 점이 있습니다. 페이지에는 개요가 기재되어 있습니다.생각할 수 있는 해결책의 하나는 다음과 같습니다.

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

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

Array.isArray(obj)

(Chrome 5, Firefox 4.0, IE 9, Opera 10.5 및 Safari 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)

누군가가 jQuery를 언급하고 있는 것은 알 수 있었지만, 기능이 있는지는 몰랐습니다.버전 1.3에서 추가된 것으로 나타났습니다.

jQuery는 피터가 제안하는 대로 구현합니다.

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

이미 jQuery(특히 브라우저 간 호환성 기술)를 많이 신뢰하고 있기 때문에 버전 1.3으로 업그레이드하여 기능을 사용하거나(업그레이드로 인해 문제가 발생하지 않는 한) 이 권장 방법을 코드에 직접 사용합니다.

제안해 주셔서 감사합니다.

이것은 오래된 질문이지만, 같은 문제를 안고 있는 저는 공유하고 싶은 매우 우아한 해결책을 찾았습니다.

어레이에 프로토타입을 추가하면 매우 심플해집니다.

Array.prototype.isArray = true;

어레이 여부를 테스트하는 오브젝트는 새로운 속성을 확인하는 것만으로 충분합니다.

var box = doSomething();

if (box.isArray) {
    // do something
}

isArray는 어레이일 경우에만 사용할 수 있습니다.

Crockford 경유:

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 이 더 이 됩니다 이 페이지가 부족하면 훨씬 더 정교한 버전이 됩니다.

5 EcmaScript 5를 할 수 .Array.isArray

예.,

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

저는 개인적으로 피터의 제안을 좋아합니다.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; 
    }
}

Guide Edition 7에는 JavaScript The Definitive Guide 6th Edition 7.10으로 .Array.isArray()를 사용하여 합니다.Object.prototype.toString.call()ECMAScript 5는 ECMAScript 5 。 만약에요, 고민할 일이 요.toString()님의 구현이 변경되면 다른 빌트인 방식의 변경도 우려해야 합니다. 「」를 사용하는가?push()★★★★★★★★★★★★★★★★★★★★★★★★★!그런 접근은 어리석다.위의 체크는 다음 문제를 우려하는 사람들에게 제공되는 솔루션입니다.toString()거스름돈은 필요 없지만 수표는 불필요하다고 생각합니다.

가 이 때에는 JQuery가 되어 있지 않았습니다.isArray만약 그렇다면, 이 특정 타입 체크를 실행하는 최선의 브라우저 독립적 방법이라고 믿고 이 실장을 사용했을 것입니다.

JQuery가 이 기능을 제공하고 있기 때문에 항상 사용하고 있습니다.

$.isArray(obj);

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

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

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

_.isArray(object) 

개체가 배열인 경우 true를 반환합니다.

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

Crockford의 JavaScript The Good Parts에는 지정된 인수가 배열인지 확인하는 함수가 있습니다.

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

그는 다음과 같이 설명한다.

먼저, 우리는 그 값이 진부한지 묻습니다.null 및 기타 허위 값을 거부하기 위해 이 작업을 수행합니다.두 번째, 값의 유형이 '객체'인지 물어봅니다.이는 오브젝트, 어레이 및 (이상한) 늘에 해당됩니다.셋째, 값에 숫자인 길이 속성이 있는지 확인합니다.이는 어레이에 항상 해당되지만 일반적으로 개체에는 해당되지 않습니다.넷째, 값에 스플라이스 방법이 포함되어 있는지 여부를 묻습니다.이는 모든 어레이에 적용됩니다.마지막으로 length 속성이 열거 가능한지 여부를 묻습니다(length는 for in loop에 의해 생성됩니까?).이는 모든 어레이에 대해 잘못된 것입니다.이것은 지금까지 발견된 어레이 테스트 중 가장 신뢰성이 높은 테스트입니다.그것이 그렇게 복잡해서 유감이다.

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

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

ECMAScript 5 이후 정식 솔루션은 다음과 같습니다.

Array.isArray(arr)

또한 이전 JavaScript libs의 경우 정확도는 떨어지지만 아래 솔루션을 찾을 수 있습니다.

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 에서 입수할 수 있습니다.

코드 골프를 하는 사람에게는 가장 적은 글자로 신뢰할 수 없는 테스트입니다.

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]

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

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

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

이 작은 코드를 만들었습니다. 진짜 유형을 반환할 수 있습니다.

성능에 대해서는 아직 확실하지 않지만, 그 종류를 제대로 파악하기 위한 시도입니다.

https://github.com/valtido/better-typeOf도 여기에 약간의 블로그를 올렸습니다.http://www.jqui.net/jquery/better-typeof-than-the-javascript-native-typeof/

현재의 타입과 비슷합니다.

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

약간의 미세 조정이 필요할 수 있다고 생각되며, 여러 가지 사항을 고려했을 때 제대로 테스트하거나 하지 않았습니다.따라서 퍼포먼스에 적합한지 type Of를 잘못 재포팅하는지에 관계없이, 한층 더 개선되는 것을 환영합니다.

myObj.constructor==Object와 myArray.constructor==Array를 사용하는 것이 가장 좋다고 생각합니다.toString()을 사용하는 것보다 거의 20배 빠릅니다.자신의 생성자를 사용하여 개체를 확장하고 이러한 창작물을 "개체"로 간주하려면 이 작업이 수행되지 않지만, 그렇지 않으면 더 빨라집니다.typeof는 생성자 메서드만큼 빠르지만 type of []=='object'는 종종 바람직하지 않은 true를 반환합니다.http://jsperf.com/constructor-vs-tostring

주의할 점은 null.constructor가 오류를 발생시키기 때문에 null 값을 체크하는 경우 먼저 if(test Thing!)를 수행해야 합니다.==고정){}

w3schools에서:

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

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([]);

저는 여기서 대부분의 해결책을 시도했습니다.근데 아무도 안 먹혔어그리고 나서 간단한 해결책을 생각해 냈어요.누군가에게 도움이 되고 시간을 절약할 수 있기를 바랍니다.

if(variable.constructor != undefined && variable.constructor.length > 0) {
        /// IT IS AN ARRAY
} else {
       /// IT IS NOT AN ARRAY
}

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

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

언더스코어 및 기타 여러 라이브러리는 이 짧고 간단한 방법을 사용합니다.

내가 방금 생각해낸 것:

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

언급URL : https://stackoverflow.com/questions/767486/how-do-i-check-if-a-variable-is-an-array-in-javascript

반응형