답변:
개념적으로 JavaScript의 배열에는 까지 array.length
시작하는 요소가 포함 됩니다. 인덱스 가 있는 배열 요소 는 배열 사이 에 포함 된 경우 배열의 일부로 정의됩니다 . 이 범위에 속하지 않으면 배열에 없습니다.array[0]
array[array.length - 1]
i
i
0
array.length - 1
따라서 개념적으로 배열은 항목이없는 해당 범위 내에 "갭"을 갖지 않는 메커니즘없이 0부터 시작하여 최대 값까지 선형입니다. 주어진 위치 인덱스 (값이 0 또는 양의 정수)에 값이 있는지 확인하려면 문자 그대로
if (i >= 0 && i < array.length) {
// it is in array
}
이제 JavaScript 엔진은 동적 언어에서는 의미가 없으며 특정 코드에는 비효율적이므로 거의 확실하게 배열 공간을 선형 및 연속적으로 할당하지 않습니다. 아마도 해시 테이블이거나 전략의 하이브리드 혼합 일 수 있으며 정의되지 않은 범위의 배열에는 자체 메모리가 할당되지 않았을 수 있습니다. 그럼에도 불구하고, JavaScript는 array.length
n 개의 배열을 n 개의 멤버 를 갖는 것으로 제시하기를 원하며 이름은 0 ~ n-1입니다. ,이 범위에서 아무것도 배열의 일부입니다.
당신은 아마 원하는 것은, 그러나, 배열에 값이 있는지 알고있다 정의 뭔가 실제로 , 그것은 아니다 - undefined
. 아마도 정의되어 있고 아닌지null
알고 싶을 수도 있습니다 . 값을 설정하지 않고 배열에 멤버를 추가 할 수 있습니다. 예를 들어 array.length
속성 을 증가시켜 배열 값을 추가하는 경우 새 값은입니다 undefined
.
주어진 값이 의미가 있는지 또는 정의되었는지 확인 즉 , 또는 아닙니다 .undefined
null
if (typeof array[index] !== 'undefined') {
또는
if (typeof array[index] !== 'undefined' && array[index] !== null) {
흥미롭게도 JavaScript의 비교 규칙으로 인해 마지막 예제는 다음과 같이 최적화 될 수 있습니다.
if (array[index] != null) {
// The == and != operators consider null equal to only null or undefined
}
length
속성이 포함되어 있습니다. 이 경우 나중에 두 예제가 더 적합합니다.
foo !== 'undefined' && foo !== null
과 같이 바꿀 수 있습니다foo != null
0
까지의 모든 요소를 포함한다고 합니다 array.length - 1
. 그러나 이러한 값이 모두 정의 된 값은 아닙니다. 배열 멤버에서 delete 키워드를 사용하면 array.length 매개 변수를 증가시켜 배열을 확장하는 것처럼 새 값이 정의되지 않은 상태로 시작되는 것처럼 해당 멤버를 다시 정의되지 않은 상태로 설정합니다. 실제로, 자바 스크립트 구현은 아마도 어레이 스토리지를 최적화 할 것이며, 정의되지 않은 일부 또는 모든 값은 메모리를 차지하지 않을 수 있습니다.
new Array(1)[0] === undefined
그러나 값은 비어 있습니다. [undefined][0] === undefined
그러나 값이 설정됩니다. 배열 에는 값이 있습니다. 유일한 완벽한 대답은 사용 in
하거나 hasOwnProperty()
- idx in array
또는 array.hasOwnProperty(idx)
이 답변을 --per : stackoverflow.com/a/39171620/3120446을
우리는 이것을 할 수 없습니다 :
if(arrayName.length > 0){
//or **if(arrayName.length)**
//this array is not empty
}else{
//this array is empty
}
if(arrayName.length) {...
어떤 차이가?
if(arrayName.length) {...
실패null
[undefined, undefined]
길이 = 2 인 배열 인 경우 실패합니다 .
사용하는 .length
것은 안전하지 않으며 일부 브라우저에서 오류가 발생합니다. 더 나은 해결책은 다음과 같습니다.
if(array && array.length){
// not empty
} else {
// empty
}
또는 다음을 사용할 수 있습니다.
Object.keys(__array__).length
if(!arrayName[index]){
// do stuff
}
if(arrayName.length > index && arrayName[index] !== null) {
//arrayName[index] has a value
}
x == null
null 또는 undefined에 대해서만 true이며 다른 것은 없습니다. 마찬가지로 x != null
null이 아니거나 정의되지 않은 모든 항목에 대해서도 마찬가지입니다. 특별히 정의되지 않은 것을 찾아야하는 경우가 아니라면, 암시 적 변환의 장점에 기대 어라.
짧고 보편적 인 접근
거짓, 정의되지 않은, null 또는 빈 문자열과 같이 잘못된 값이있는 배열을 확인하려면 다음과 같이 every () 메서드를 사용할 수 있습니다 .
array.every(function(element) {return !!element;}); // returns true or false
예를 들면 다음과 같습니다.
['23', null, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false
['23', '', 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false
['23', true, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns true
잘못된 값의 첫 번째 색인을 가져와야 할 경우 다음과 같이 할 수 있습니다.
let falsyIndex;
if(!['23', true, 2, null, {key: 'value'}].every(function(element, index) {falsyIndex = index; return !!element;})) {
console.log(falsyIndex);
} // logs 3
주어진 인덱스에 대해 잘못된 배열 값을 확인 해야하는 경우 다음과 같이 할 수 있습니다.
if (!!array[index]) {
// array[index] is a correct value
}
else {
// array[index] is a falsy value
}
if(typeof arr ==='object' && arr instanceof Array ){
if(!arr.length){
println 'empty'
}else{
printn 'not Empty'
}
}else{
println 'Null'
}
'Null'-> 요소가 null이거나 ''과 같은 경우,이 경우 : 모든 'null'요소를 필터링 한 후 배열이 비어 있는지 확인하십시오.
if(!arr.clean().length){return 'is null'}
물론, 전에 깨끗한 방법을 추가하십시오 :
Array.prototype.clean=function(){return this.filter(function(e){return (typeof e !=='undefined')&&(e!= null)&&(e!='')})}
다음과 같은 함수를 만드는 것이 좋습니다.
function isEmptyEl(array, i) {
return !(array[i]);
}
다음과 같이 호출 할 수 있습니다.
if (isEmptyEl(arrayName, indexVal)) {
console.log('arrayName[' + indexVal + '] is empty');
}
개발자가 isEmptyEl 인터페이스를 준수하게하면 정의되지 않은 arrayName 또는 indexVal 변수와 같은 입력 오류가 발생합니다.
일반적으로 Javascript로 프로그래밍 할 때는 방어 적으로 프로그래밍하는 것이 좋습니다.
arrayName이 정의되지 않은 경우 다음과 같은 오류가 발생합니다.
Uncaught ReferenceError: arrayName is not defined
at <anonymous>:2:15
at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
at Object.InjectedScript.evaluate (<anonymous>:694:21)
정의되지 않은 indexVal에 대한 비슷한 결과.
배열 또는 인덱스 값이 없으면 오류가 발생합니다.
유효한 입력의 경우 arrayName [indexVal]이 다음 중 하나 일 경우에만 true를 얻습니다.
"빈"의 의미에 따라 다릅니다.
해당 이름의 속성이없는 객체에서 속성의 값을 얻으려고하면 값을 얻습니다. undefined
됩니다.
그것이 희소 배열에서 일어나는 것입니다 : 0
와 사이의 모든 지수는 아닙니다.array.length-1
.
그래서 당신은 확인할 수 있습니다 array[index] === undefined
있습니다.
그러나 속성 index
이 undefined
값으로 존재할 수 있습니다 . 이 경우를 필터링 하려면 객체에 JavaScript의 속성이 있는지 어떻게 확인합니까?에 설명 된대로 in
연산자 또는를 사용할 수 있습니다 .hasOwnProperty
index in array;
array.hasOwnProperty(index);
undefined
또는 null
값이 있는 기존 속성이 존재하지 않는 것을 고려 하려면 느슨한 비교 array[index] == undefined
또는array[index] == null
.
배열이 희박하지 않다는 것을 알고 있다면와 비교할 수 index
있습니다 array.length
. 그러나 안전을 위해 index
실제로 배열 인덱스 인지 확인하고 싶을 수도 있습니다. 속성 이름이 배열 인덱스인지 확인을 참조 하십시오.
자, 배열 값이 JavaScript에 존재하지 않으면 어떻게 될지 먼저 보자. 아래와 같이 배열이 있다면 :
const arr = [1, 2, 3, 4, 5];
이제 6 이 인덱스 5에 있는지 여부를 확인합니다 .
arr[5];
그리고 우리는 얻는다
undefined
...
따라서 기본적으로 대답을 제공 합니다. 정의되지 않은 경우 확인 하는 가장 좋은 방법 은 다음과 같습니다.
if("undefined" === typeof arrayName[index]) {
//array value is not there...
}
이 경우이 작업을 수행 하지 않는 것이 좋습니다 .
if(!arrayName[index]) {
//Don't check like this..
}
이 배열이 있다고 상상해보십시오.
const arr = [0, 1, 2];
그리고 우리는 :
if(!arr[0]) {
//This get passed, because in JavaScript 0 is falsy
}
보시다시피, 0 조차도 인식되지 않으며, 똑같이 할 수있는 다른 것들이 거의 없으며 응용 프로그램을 버그로 만들 수 있으므로 조심스럽게 나열하십시오.
undefined
''
나는 몇 가지 놓친 것 같은 것을 지적하고 싶다. 즉, 배열의 중간에 "빈"배열 위치를 가질 수있다. 다음을 고려하세요:
let arr = [0, 1, 2, 3, 4, 5]
delete arr[3]
console.log(arr) // [0, 1, 2, empty, 4, 5]
console.log(arr[3]) // undefined
자연스럽게 확인하는 방법은 배열 멤버가 정의되어 있지 않은지 확인하는 것입니다. 다른 방법이 있는지 확실하지 않습니다.
if (arr[index] === undefined) {
// member does not exist
}
Lodash를 사용하면 다음을 수행 할 수 있습니다.
if(_.has(req,'documents')){
if (req.documents.length)
_.forEach(req.documents, function(document){
records.push(document);
});
} else {
}
if(_.has(req,'documents'))
요청 객체에 이름이 지정된 속성이 있는지 확인 documents
하고 해당 소품이 있으면 다음 if (req.documents.length)
은 빈 배열이 아닌지 확인 하여 다음 과 같은 다른 항목을 진행할 forEach
수 있습니다.
정의되지 않았거나 삭제되었는지 확인하려면 다음을 수행하십시오.
if(typeof arrayName[index]==="undefined"){
//the index is not in the array
}
또한 일부 색인을 삭제 한 연관 배열 및 배열과 함께 작동합니다.
정의되지 않았는지, 삭제되었는지 확인하거나 널 또는 논리 빈 값 (NaN, 빈 문자열, 거짓)입니다.
if(typeof arrayName[index]==="undefined"||arrayName[index]){
//the index is not defined or the value an empty value
}
라 라벨 데이터 테이블을 사용 하여이 문제에 부딪 쳤습니다. properties
활동 로그에 호출 된 JSON 값을 저장하고 있었고이 값이 비어 있는지 여부에 따라 버튼을 표시하려고했습니다.
글쎄, datatables는 이것을 비어 있으면 배열로 해석하고 그렇지 않은 경우 객체로 해석했기 때문에 다음 해결책이 효과적이었습니다.
render: function (data, type, full) {
if (full.properties.length !== 0) {
// do stuff
}
}
객체에는 길이 속성이 없습니다.
이 결정은 명령형 OOP 또는 절차 적보다 선언적 기능 프로그래밍을 선호하는 사람들에게 적합하다고 생각합니다. 질문에 " 내부에 값이 있습니까? (진실하거나 잘못된 값)"인 경우 .some
방법을 사용 하여 값을 확인할 수 있습니다 .
[].some(el => el || !el);
function isEmpty(arr) { ... }
.[].length
결과 만들어진을로 0
하는 경우에 위험하다.[].length > 0
말은 "0보다 그 길이가 큰가요?"고급 예 :
[ ].some(el => el || !el); // false
[null].some(el => el || !el); // true
[1, 3].some(el => el || !el); // true
Loadsh 라이브러리를 사용하여 다음과 같이보다 효율적으로 수행 할 수 있습니다.
"pets"라는 배열이있는 경우
var pets = ['dog', undefined, 'cat', null];
console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false
_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });
널값 또는 정의되지 않은 값에 대한 모든 배열 값을 확인하려면 다음을 수행하십시오.
var pets = ['dog', undefined, 'cat', null];
console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false
_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
http://underscorejs.org/ 에서 더 많은 예제를 확인하십시오.
fn(){}
는 구문 오류이며 배열 항목이 특정 인덱스에 있는지 여부를 확인하는 데 도움이되는 방법은 명확하지 않습니다.