programing

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

nasanasas 2020. 9. 20. 10:03
반응형

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


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

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

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

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


  • 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으로 일반적인 유틸리티 메서드가 포함 된 라이브러리 인를 사용해 보는 것이 좋습니다 . 코드를 건조시키는 유용한 기능이 많이 있습니다.


이 코드를 시도하십시오.

Array.isArray(argument)

어때 :

your_object instanceof Array

Chrome의 V8에서는

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

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

무언가가 배열인지 확인하기 위해 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 표준에 대해 걱정할 필요가 없습니다.


다음과 같이 해보십시오 :
console.log (Object.prototype.toString.call (arg) .replace (/ ^ [object (. +)] $ /, '$ 1'). toLowerCase ())

참고 URL : https://stackoverflow.com/questions/5941706/javascript-detect-if-argument-is-array-instead-of-object-node-js

반응형