JavaScript : 인수가 객체 대신 배열인지 감지 (Node.JS)


87

typeof []반환 하기 때문에 인수가 배열인지 어떻게 감지해야 'object'하며 배열과 객체를 구별하고 싶습니다.

객체가 마치 {"0":"string","1":"string","length":"2"}배열 처럼 보일 수도 있지만 실제로 배열처럼 보이는 객체라면 배열로 나오지 않기를 바랍니다.

JSON.parse그리고 JSON.stringify이 구별을 할 수 있습니다. 어떻게하니?

Chrome과 동일한 V8 기반 Node.JS를 사용하고 있습니다.

답변:


164
  • Array.isArray

기본 V8 기능. 빠르고 항상 정확합니다. 이것은 ES5의 일부입니다.

  • arr instanceof Array

객체가 배열 생성자로 만들어 졌는지 확인합니다.

밑줄의 방법. 다음은 소스에서 가져온 스 니펫입니다.

var toString = Object.prototype.toString,
    nativeIsArray = Array.isArray;
_.isArray = nativeIsArray || function(obj) {
    return toString.call(obj) === '[object Array]';
};

이 메서드는 개체를 가져와 Object.prototype.toString그에 대한 메서드를 호출합니다 . 이것은 항상 [object Array]배열에 대해 반환 됩니다.

내 개인적인 경험에서 나는 toString방법을 묻는 것이 가장 효과적이라는 것을 알지만 그것은 짧거나 읽기 쉽고 instanceof Array빠르지는 Array.isArray않지만 ES5 코드이며 이식성을 위해 사용하지 않는 경향이 있습니다.

저는 개인적 underscore으로 일반적인 유틸리티 메서드가 포함 된 라이브러리 인를 사용해 보는 것이 좋습니다 . 코드를 건조시키는 유용한 기능이 많이 있습니다.


1
node.js util라이브러리 사용 require('util').isArray(arr) -nodejs.org/api/util.html#util_util_isarray_object
Kof

5
참고로, 노드 v4.00 이상에서는 ( 'util'). isArray (arr)를 요구하지 마십시오. 그것은 사용되지 않는 것
선일 Khiatani에게

어쨌든 Node 10.x에서는 arr instanceof Array실패한 것처럼 보입니다 . 그러나 Array.isArray()작품은 훌륭합니다.
Alexis Wilke

71

이 코드를 시도하십시오.

Array.isArray(argument)

8

어때 :

your_object instanceof Array

Chrome의 V8에서는

[] instanceof Array
> true
({}) instanceof Array
> false 
({"0":"string","1":"string","length":"2"}) instanceof Array
> false

7

이 질문에 몇 가지 좋은 답변이있는 것 같지만 완전성을 위해 이전에 제안되지 않은 다른 옵션을 추가합니다.

무언가가 배열인지 확인하기 위해 Node.js util네이티브 모듈과 그 isArray()기능을 사용할 수 있습니다 .

예:

var util = require('util');

util.isArray([]);  // true
util.isArray(new Array); // true
util.isArray({"0":"string","1":"string","length":"2"}); // false

이 방법을 사용하면 항상 올바른 답을 보여주기 때문에 V8에서 구현 한 JS 표준에 대해 걱정할 필요가 없습니다.


5
FWIW, util.isArray()현재 프록시 Array.isArray(): github.com/joyent/node/blob/…
Tom Spencer

0

이 방법을 시도해보십시오 :
console.log (Object.prototype.toString.call (arg) .replace (/ ^ [object (. +)] $ /, '$ 1'). toLowerCase ())

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.