JavaScript型システム 配列オブジェクト学習メモ_JavaScriptスキル

WBOY
リリース: 2016-05-16 15:20:57
オリジナル
1198 人が閲覧しました

配列は、順序どおりに配置された値のセットです。これとは対照的に、オブジェクトの属性名には順序がありません。基本的に、配列は検索キーとして数値を使用しますが、オブジェクトにはユーザー定義のプロパティ名があります。 JavaScript には真の連想配列はありませんが、オブジェクトを使用して関連関数を実装できます

Array() は Object() の特殊なタイプにすぎません。つまり、Array() インスタンスは基本的に、いくつかの追加機能を備えた Object() インスタンスです。配列はあらゆる種類の値を保持でき、これらの値はいつでも更新または削除でき、配列のサイズは動的に調整されます

1. 配列の作成

Javascript のほとんどのオブジェクトと同様、配列オブジェクトは、Array() コンストラクターと組み合わせて new 演算子を使用するか、リテラル構文

を使用して作成できます。

【1】Array コンストラクターを使用すると (Array コンストラクターを使用する場合は New 演算子を省略することもできます)、配列インスタンスの値をパラメーターとしてカンマで区切ってコンストラクターに渡すことができ、Array()コンストラクターは 4294967295 (約 43 億) 個のパラメーターを受け取ることができます

パラメーターが 1 つだけの場合: 値が渡された場合は、その値が配列の長さの設定に使用されます。別のタイプのパラメーターが渡された場合は、その値を含む項目が 1 つだけ含まれる配列が作成されます。 >

var colors;
console.log(colors = new Array(),colors.length);//[] 0
console.log(colors = new Array('red','blue','green'),colors.length);//['red','blue','green'] 3
console.log(colors = new Array(20),colors.length);//[] 20
console.log(colors = new Array('red'),colors.length);//['red'] 1
ログイン後にコピー
var foo = new Array(1,2,3);
var bar = new Array(100);
console.log(foo[0],foo[2]);//1 3
console.log(bar[0],bar.length);//undefined 100
ログイン後にコピー
【2】配列リテラル表現を使用する

var colors = ['red','blue','green'];
var colors = [];



//Array构造函数
var myArray1 = new Array('blue','green','orange','red');
console.log(myArray1);//['blue','green','orange','red']
//数组字面量表示法
var myArray2 = ['blue','green','orange','red'];
console.log(myArray2);//['blue','green','orange','red']



var colors = [1,2,]; 
//在IE8及以前中会包含一个三个项目,且每个项目为1、2和undefined的数组。在其他浏览器中为只包含1和2的数组
var colors = [,,,];
 //在IE8及以前会创建4项的数组,而在其他浏览器中会创建3项的数组 

ログイン後にコピー

2. 配列演算

配列値の読み取りと設定を行う場合は、角かっこを使用し、対応する値の 0 から始まる数値インデックスを指定します

配列の長さ属性は配列内の値の数を表し、配列の数値インデックスは 0 から始まり、配列の長さ属性を設定することで読み取りと書き込みが可能になります。配列の末尾から項目を削除したり、新しい項目を配列に追加したりできます。長さが配列内の実際の値の数よりも大きく設定されている場合、長さの値の数が配列内の値の数よりも小さく設定されている場合は、未定義の値が配列に追加されます。 、配列内の値は削除される可能性があります


var myArray = ['blue','green','orange','red'];
console.log(myArray.length);//4
myArray.length = 99;
console.log(myArray.length);//99
myArray.length = 1;
console.log(myArray[1]);//undefined
console.log(myArray);//['blue']

 

var colors = ['red','blue','green'];
colors.length = 2;
alert(colors[2]);//undefined
colors.length = 4;
alert(colors[3]);//undefined

ログイン後にコピー
配列のサイズを超える位置に値が配置されると、配列はその長さの値を再計算します。つまり、長さの値は最後の項目のインデックスに 1 を加えた値に等しく、JavaScript は未定義の値を使用します。現在のインデックスの前のすべての項目を埋める値。

var myArray = [];
myArray[50] = 'blue';
console.log(myArray.length);//51
var colors = ['red','blue','green'];
colors[99] = 'black';
console.log(colors.length);//100  
ログイン後にコピー
[ヒント] length 属性を使用して、配列の末尾に新しい項目を簡単に追加します

colors[colors.length] = 'black';

3. 継承方法

toString()

配列内の各値の文字列形式を連結したカンマ区切りの文字列

を返します。

valueof()

返されるものは依然として配列です

var colors = ['red','blue','green'];         
console.log(colors.valueOf());//['red','blue','green']
alert(colors.valueOf());//'red,blue,green' 
alert(colors.toString());//'red,blue,green'
alert(colors);//'red,blue,green'[注意]由于alert()要接收字符串参数,它会在后台调用toString()方法,会得到与toString()方法相同的结果

ログイン後にコピー

toLocaleString()

このメソッドを呼び出すと、配列内の各項目の値によって toLocaleString() メソッドが呼び出されます

var person1 = {
  toLocaleString: function(){
    return 'Nikolaos';
  },
  toString: function(){
    return 'Nicholas';
  }
};
var person2 = {
  toLocaleString: function(){
    return 'Grigorios';
  },
  toString: function(){
    return 'Greg';
  }
};

var people = [person1,person2];
alert(people);//Nicholas,Greg
alert(people.toString());//Nicholas,Greg
alert(people.toLocaleString());//Nikolaos,Grigorios
ログイン後にコピー

4. インスタンスメソッド

配列変換


結合()

配列によって継承された toLocaleString()、toString()、および valueOf() メソッドは、デフォルトで配列項目をカンマ区切り文字の形式で返します。join() メソッドは文字列の構築に異なる区切り文字を使用できます。 . の場合、join() メソッドは 1 つのパラメーター (区切り文字として使用される文字列) のみを受け取り、すべての配列項目を含む文字列を返します。 join() メソッドに値が渡されない場合、または未定義が渡された場合は、区切り文字としてカンマが使用されます

var colors = ['red','green','blue'];
console.log(colors.join(','));//'red,green,blue'
console.log(colors.join('||'));//'red||green||blue'
console.log(colors.join());//'red,green,blue'
console.log(colors.join(undefined));//'red,green,blue'[注意]IE7-会使用undefined作为分隔符
ログイン後にコピー
[注意] 配列内の項目の値が null または未定義の場合、その値は、j​​oin()、toLocaleString()、toString()、および valueOf() によって返される結果では空の文字列で表されます。メソッド

配列検出
ES3 の規定以来、オブジェクトが配列であるかどうかを判断するという古典的な問題が発生しました。一般的な方法はインスタンス演算子を使用することですが、この方法には制限があります。ES5 では特に配列
を検出するための isArray() メソッドを追加しています。

var value = [123];
console.log(value instanceof Array);//true
ログイン後にコピー
instanceof 演算子の問題は、Web ページに複数のフレームが含まれている場合、実際には 3 つ以上の異なるグローバル環境が存在し、したがって 3 つ以上の異なるバージョンの配列が存在すると想定していることです。コンストラクタ。配列があるフレームから別のフレームに渡される場合、渡される配列と 2 番目のフレームでネイティブに作成される配列は異なるコンストラクターを持ちます

 //在不同框架中不能共享prototype属性
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
var value = new window.frames[0].Array;
console.log(value instanceof Array);//false
console.log(value.constructor == Array);//false
ログイン後にコピー
ただし、toString() メソッドは、異なるフレームワークのプロトタイプ チェーン全体で呼び出すことができます

var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
var value = new window.frames[0].Array;
console.log(Object.prototype.toString.call(value));//[object Array]
ログイン後にコピー
ES5 は、値が作成されたグローバル環境に関係なく、値が配列であるかどうかを最終的に判断する Array.isArray() メソッドを追加しました

Array.isArray()

var value = [123];
console.log(Array.isArray(value));//true
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
var value = new window.frames[0].Array;
console.log(Array.isArray(value));//true
ログイン後にコピー

栈和队列
push()

  可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度

pop()

  从数组末尾移除最后一项,减少数组的length值,然后返回移除的项

shift()

  移除数组中的第一个项并返回该项,同时数组的长度减1(结合使用shift()和push()可以模拟队列)

unshift()

  在数组前端添加任意个项并返回新数组长度(结合使用unshift()和pop()从相反方向模拟队列)

  [注意]IE7-浏览器unshift()方法返回的总是undefined

var colors = [];
var count = colors.push('red','green');
console.log(colors,count);//['red','green'] 2
var count = colors.pop();
console.log(colors,count);//['red'] 'green'
var count = colors.unshift('white','black');
console.log(colors,count);//["white", "black", "red"] 3
var count = colors.shift();
console.log(colors,count);//["black", "red"] "white"

ログイン後にコピー

排序方法
reverse()

  反转数组的顺序,返回经过排序之后的数组;而原数组顺序也发生改变

var array = [1,2,4,3,5];
console.log(array,array.reverse());//[5,3,4,2,1] [5,3,4,2,1]
var array = ['str',true,3];
console.log(array,array.reverse());//[3,true,'str'] [3,true,'str']
ログイン後にコピー

sort()

  默认情况下,按字符串升序排列数组项,sort方法会调用每个数组项的toString()方法,然后比较得到的字符串排序,返回经过排序之后的数组,而原数组顺序也发生改变

var array = [1,2,4,3,5];
console.log(array,array.sort());//[1,2,3,4,5] [1,2,3,4,5]
var array = ['3str',3,2,'2'];
console.log(array,array.sort());//[2, "2", 3, "3str"] [2, "2", 3, "3str"]
var array = [1,5,10,50];
console.log(array,array.sort());//[1, 10, 5, 50] [1, 10, 5, 50]

ログイン後にコピー
  

[注意]sort()方法可以接受一个比较函数作为参数,以便指定哪个值在哪个值的前面。比较函数接收两个参数,如果第一个参数应该位于第二个参数之前则返回一个负数,如果两个参数相等则返回0,如果第一个参数应该位于第二个参数之后则返回一个正数

[tips]比较函数

 function compare(value1,value2){
  if(value1 < value2){
    return -1;
  }else if(value1 > value2){
    return 1;
  }else{
    return 0;
  }
}
var array = ['5px',50,1,10];
//当数字与字符串比较大小时,字符串'5px'会被转换成NaN,这样结果就是false
console.log(array.sort(compare));//["5px",1, 10, 50]

 

ログイン後にコピー

对于数值类型或valueOf()方法会返回数值类型的对象类型,比较函数可以简化为:

function compare(value1,value2){
  return value1 - value2;
}
var array = ['5px',50,1,10];
console.log(array.sort(compare));//["5px",1,10,50]
var array = [5,50,1,10];
console.log(array.sort(compare));//[1,5,10,50]

ログイン後にコピー

[tips]创建一个随机数组

function compare(){
  return Math.random() - 0.5;
}
var array = [1,2,3,4,5];
console.log(array.sort(compare));//[2,1,5,4,3]
ログイン後にコピー

操作方法
concat()

  基于当前数组中的所有项创建一个新数组,先创建当前数组一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组(concat()不影响原数组)

  如果不给concat()方法传递参数时,它只是复制当前的数组;如果参数是一个或多个数组,则该方法会将这些数组中的每一项都添加到结果数组中;如果传递的值不是数组,这些值就会被简单地添加到结果数组的末尾

var numbers = [1,2];
console.log(numbers,numbers.concat());//[1,2] [1,2]
console.log(numbers,numbers.concat([5,4,3],[3,4,5],1,2));//[1,2] [1,2,5,4,3,3,4,5,1,2]
ログイン後にコピー

slice()

  基于当前数组中的一个或多个项创建一个新数组,接受一个或两个参数,即要返回项的起始和结束位置,最后返回新数组(slice()不影响原数组)

  如果没有参数,则返回原数组;如果只有一个参数时,slice()方法返回从该参数指定位置开始到当前数组末尾的所有项;若有两个参数时,该方法返回起始位置和结束位置之间的项,但不包括结束位置的项;若参数为负数时,则用数组长度加负数作为参数;若结束位置小于开始位置,则返回空数组

var numbers = [1,2,3,4,5];
console.log(numbers.slice());//[1,2,3,4,5]
console.log(numbers.slice(2));//[3,4,5]
console.log(numbers.slice(2,3));//[3]
console.log(numbers.slice(-3));//-3+5=2 -> [3,4,5]
console.log(numbers.slice(2,1));//[]

ログイン後にコピー

splice()

  原数组变为修改后的数组,而splice()返回从原数组中删除的项组成的数组,若无删除项则返回空数组。若第一个参数为负数时,则用数组长度加负数作为参数;若第二个参数为负数时,则用0作为参数

  [1]删除:两个参数为要删除的第一项的位置、要删除的项数

  [2]插入:三个参数为起始位置、0(要删除的基数)、要插入的项

  [3]替换:三个参数为起始位置、要删除的项数、要插入的项

 var numbers = [1,2,3,4,5];
console.log(numbers.splice(),numbers);//[] [1, 2, 3, 4, 5]
console.log(numbers.splice(0,2),numbers);//[1,2] [3,4,5]
var numbers = [1,2,3,4,5];
console.log(numbers.splice(1,0,11,12),numbers);//[] [1,11,12,2,3,4,5]
var numbers = [1,2,3,4,5];
console.log(numbers.splice(1,3,11,12),numbers);//[2,3,4] [1,11,12,5] 
var numbers = [1,2,3,4,5];
console.log(numbers.splice(-4,3,11,12),numbers);//-4+5=1 -> [2,3,4] [1,11,12,5] 
var numbers = [1,2,3,4,5];
console.log(numbers.splice(-4,-3,11,12),numbers);//-4+5=1 -> [] [1,11,12,2,3,4,5]

ログイン後にコピー

位置方法
  ES5为数组实例添加了两个位置方法indexOf()、lastIndexOf()。这两个方法都接收两个参数:要查找的项、表示查找起点位置的索引(可选)。返回第一个满足条件的查找项在数组中的位置,如果没有找到则返回-1(位置方法不会影响原数组)

  [注意]方法在比较参数时,使用的是全等操作符

indexOf()     从前向后查找
lastIndexOf()   从后向前查找

var numbers = [1,2,3,4,5,4,3,2,1];
console.log(numbers.indexOf(4));//3
console.log(numbers.lastIndexOf(4));//5
console.log(numbers.indexOf(4,4));//5
console.log(numbers.lastIndexOf(4,4));//3

 

var person = {name: 'Nicholas'};
var people = [{name: 'Nicholas'}];
var morePeople = [person];
alert(people.indexOf(person));//-1,因为person和people[0]虽然值相同,但是是两个引用
alert(morePeople.indexOf(person));//0,因为person和morepeople[0]是同一个引用
alert(morePeople.indexOf({name: 'Nicholas'}));//-1,因为不是同一个引用

ログイン後にコピー

[tips]返回满足条件的项的所有索引值

function allIndexOf(array,value){
  var result = [];
  var pos = array.indexOf(value);
  if(pos === -1){
    return -1;
  }
  while(pos > -1){
    result.push(pos);
    pos = array.indexOf(value,pos+1);
  }
  return result;
}
var array = [1,2,3,3,2,1];
console.log(allIndexOf(array,1));//[0,5]
ログイン後にコピー

以上就是本文的详细内容,希望对大家的学习javascript程序设计有所帮助。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート