3

配列の長さを出力し、それを削除してから、新しい長さを出力する次のコードがあります。

console.log($scope.adviceList.activeAdvices.length); // *1*
$scope.adviceList.activeAdvices.splice(id,1); // *id is a parameter*
console.log($scope.adviceList.activeAdvices.length); // *0*

console.log($scope.adviceList.activeAdvices.length); // *1*
delete $scope.adviceList.activeAdvices[id];
console.log($scope.adviceList.activeAdvices.length); // *0*
console.log($scope.adviceList.activeAdvices); // *[]*

削除後、配列は空として正しく表示されます。ただし、その長さは 1 のままです。

4

5 に答える 5

11

delete「低レベル」の演算子です。オブジェクトに対して直接動作し、配列について「認識」しません。単に使用deleteしても、配列の長さを再計算するルーチンはトリガーされません。


ここでの他の回答は、プロパティの値がに設定されていると主張していますがundfined、これは正しくありません。簡単なテストで次のことがわかります。

var a = [1]; 
delete a[0]; 
console.dir(a);

実際に値を に設定した場合と比較してくださいundefined

var a = [1]; 
a[0] = undefined; 
console.dir(a);

より確実な証明のために、仕様を見てみましょう:

Oの [[Delete]] 内部メソッドがプロパティ名Pとブール値フラグThrowで呼び出されると、次の手順が実行されます。

  1. プロパティ名PでOの [[GetOwnProperty]] 内部メソッドを呼び出した結果をdescする。
  2. descが定義されていない場合は、 trueを返します。
  3. desc .[[Configurable]] がtrue の場合、a
       . Pという名前の独自のプロパティをOから削除します。
       b. trueを返します。
  4. それ以外の場合、Throw の場合はTypeError例外をスローします。
  5. falseを返します。

プロパティの値が に設定されているとはどこにも書かれていませんundefined


異なるブラウザーのコンソールでは、配列の異なる表現が表示される場合があります。[]この特定の例では、それがまたはであるべきかどうかを議論できます[undefined]

  • [](Chrome)配列には実際には要素がなく、数値名のプロパティがないため、理にかなっているようです。ただし、.lengthプロパティにアクセスする1と、混乱を招く可能性がある が表示されます。
    少し前まで、Chromeは長さ 5 の配列を示すような表現を[undefined x 5]使用していましたが、要素はありませんでした。これは実際には良い解決策だったと思います。

  • [undefined](Firefox) は、配列の長さが 1 であり、arr[0]実際にアクセスすると が返されるため意味がありますundefined(ただし、配列に実際に値が含まれている場合、これだけで長さ 1 の空の配列と区別するにはどうすればよいでしょうかarr[10])。表現(答え:できません)。arr.hasOwnProperty(0)falseundefined

肝心なのは、信頼しconsole.logすぎないことです。console.dir正確な表現が必要な場合は、むしろ使用してください。

于 2013-08-23T07:15:59.803 に答える
2

これは、配列要素の削除が未定義に設定されているため、長さが変わらないためです。splice代わりに関数を使用してください:

a = [1,2,3,4];
a.splice(2,1);
console.log(a.length);
于 2013-08-23T07:01:06.023 に答える
1

配列内のアイテムを「削除」したい場合は、

var a = ["a","b"];
console.log(a);  //a,b
console.log(a.length);//2
a.length = 1;//"delete" all greater than length 1 of items;
console.log(a);//a
console.log(a.length);//1

また

 var a = ["a","b"];
    console.log(a);  //a,b
    console.log(a.length);//2
    a.pop();//"delete" the last in array:"b"
    console.log(a);//a
    console.log(a.length);//1

また

 var a = ["a","b"];
    console.log(a);  //a,b
    console.log(a.length);//2
    a.shift();//"delete" the first in array:"a"
    console.log(a);//b
    console.log(a.length);//1

また

 var a = ["a","b"];
    console.log(a);  //a,b
    console.log(a.length);//2
    a.splice(1,1);//"delete" from index 1(include,first parameter),delete number is 1(second parameter)
    console.log(a);//a
    console.log(a.length);//1
于 2013-08-23T09:58:17.847 に答える
0

私の場合、削除後に長さを再定義しました。

var cars = ["BMW", "Volvo", "Saab", "Ford"];
delete cars[1];

/// 1st option ///
for (var i = 0; i < cars.length; i++){
  if(i in cars)
    document.write(cars[i] + " ");
}
/// return: BMW Saab Ford

/// 2nd option ///
cars.length--;
var realLength = cars.length;
于 2014-01-30T16:29:43.353 に答える