オブジェクトの列挙
for in
配列をトラバースする場合、長さメソッドを使用して配列の長さを認識し、ループの上限をトラバースするように設定できますが、オブジェクトには長さメソッドがないため、forのみを使用できます。でトラバースする方法:
obj={
work:student,
name = "xxx",
sex="male",
proe:123,
}
for (var x in obj){
console.log(x);
}
プログラムの結果は、仕事、名前、性別、およびproeを順番に出力します;属性値を順番に取得したい場合、最初に頭に浮かぶのは次のとおりです:
for (var x in obj){
console.log(obj.x);
}
しかし、結果は私たちの期待を超えるでしょう、彼は4つの未定義を出力します、これはなぜですか?
知っておく必要があるのはobj.x ------> obj ['x']です。各オブジェクトの場合、これら2つの文法は同じです。プロパティ、プログラムは、このような暗黙の変換を行うのに役立ちます。そのため、プログラムでは、objオブジェクトでxプロパティを探していると見なされ、そうでない場合は、未定義が出力されます。これは、初心者がよく犯す間違いです。次のようにコードを変更するだけです。
for (var x in obj){
console.log(obj[x]);
}
このようにして、xは暗黙的に文字列に変換されるのではなく、変数として使用されます。
hasOwnProperty
このメソッドは、それ自体で定義されたすべての属性/メソッドを決定するために使用され、戻り値はブール内部型です。
对象.hasOwnProperty("属性值/方法")
それ自体が定義されている限り、次のように定義してもtrueを返します。Object.prototype.abc=123;
最上位のプロトタイプで属性を定義すると、判断するとtrueが返されますが、必要な場合はtrueが返されます。のトップレベルのプロトタイプを判断するにはtoString()メソッドはシステムによって自動的に定義されるため、trueを返します。
に
ABC in A
このメソッドは前のメソッドと似ています。特定のプロパティまたはメソッドがオブジェクトに存在するかどうかを判断するためにも使用されますが、違いは、自分で定義されているかどうかに関係なく、その検索範囲がプロトタイプチェーン全体にあることです。それが存在する限り、彼は真を返します。
instanceof
この方法は、AのプロトタイプチェーンにBのプロトタイプがあるかどうかを判断するために使用されます。
A instanceof B;
このメソッドを使用して、オブジェクトと配列の違いを判断できます。[] instanceof Arrayはtrueを返し、{} instanceofArrayはfalseを返します。
引数.callee
呼び出し先メソッドは、関数の参照を決定するために引数オブジェクトで定義されます。一部の即時実行関数で再帰を使用する必要がある場合、関数名がないことが判明したため、次のメソッドを使用します。
//递归计算100的阶乘
var test = (
function (n){
if (n === 1)
return;
else
return n * arguments.callee(n-1);
}(100))
fun.caller
現在の呼び出し環境を返すのは、主にそれと呼び出し先メソッドの違いを区別するためです。1つは現在の環境を返し、もう1つは関数参照を返します。
クローン
クローン作成はコピーとも呼ばれます。オブジェクトを別のオブジェクトに完全にコピーするには、関数を使用して元のオブジェクトをトラバースし、新しいオブジェクトを使用して元のオブジェクトのプロパティを1つずつ受け取ります。元のタイプでは、表層のデータのみをコピーしますが、属性が参照値の場合は、参照値のアドレスをコピーします。元の属性を変更すると、コピーされたオブジェクトの対応する属性も影響を受けます。 、したがって、さらに最適化されたクローン作成を行うには、上記の問題を解決するために次の関数を記述します。
obj={
name:"xxx,
a:1,
b:[1,2,3,4],
c:{
c1:1,
c3:3,
c2:2
}
};
obj1={
};
function Clone(target,origin){
var target = target || {
};
var toStr = Object.prototype.toString();
var strRes = "[Object,Array]";
for (var proe in origin){
if(origin.hasOwnProperty(proe)){
if(typeof(origin[proe]) !== 'null' && typeof(origin[proe]) == 'Object'){
if(toStr.call(origin[proe] == strRes)){
target[proe] = [];
}
else{
target[proe] = {
};
}
Clone(origin[proe],target[proe]);
}
else{
target[proe] = origin[proe];
}
}
}
return target;
}
objとobj1は、それぞれクローンオブジェクトとクローンオブジェクトを表します。クローン関数は、主に次の関数を実行します。
- ユーザーが複製するオブジェクトを渡していない場合は、代わりに{}を使用します。
- 複製されたオブジェクトのカスタムプロパティを決定し、1つずつトラバースします
- typeofを使用して、現在の属性が元のエンドタイプであるかどうかを判別し、対応する手順を実行します
- 参照エンドタイプの特定のエンドタイプを判断し、さまざまな結果に従って再帰的に再度クローンを作成します。
このようにして、複製されたオブジェクトは、元のオブジェクトのデータ変更による影響を受けなくなります。
アレイ
配列操作に未定義が存在します。** a = [1,2,3 ,,, 4] **でこのように配列を定義すると、エラーを報告する代わりに、空の値がundefinedに自動的に入力されます。配列は範囲外のアクセスを実行し、未定義を返します。jsでの配列の検査はまだ比較的緩いです。通常、エラーは報告されません。定義する方法は2つあり、1つはリテラル式で、もう1つは定義する配列オブジェクトを作成します。一般的に、前者はほとんどです。
配列に関するいくつかの方法を次に示します。
元の配列を変更します
- pushメソッド
このメソッドは、元の配列の最後にt個の要素を追加でき、追加の数に制限はありません。
Array.prototype.push = function (target){
this[this.length] = target;
this,length++;
}
上記のコードは、配列プロトタイプのpushメソッドです。基礎となる基盤は、クラス配列の属性値を変更する方法を理解するのに役立ちます。
-
popメソッド
このメソッドは、元の配列から最後の要素を削除できます。 -
unshiftメソッド
このメソッドは、元の配列の先頭に要素を順番に追加でき、追加の数は無制限です。 -
shiftメソッド
このメソッドは、元の配列から最初の要素を削除できます。 -
逆の方法
この方法では、元の配列を逆にすることができます。 -
スプライスメソッド
このメソッドは配列をカットするために使用され、負の数は逆数要素を表します。最大3つのパラメータを選択できます。- 最初のパラメータ:切断の開始要素を選択します
- 2番目のパラメータ:カット数を選択します
- 3番目のパラメータ:切断後の充填値を選択します
-
sortメソッド
は配列の並べ替えに使用されますが、配列名.sort()メソッドを使用して呼び出すだけでは、結果が想像とは異なる場合があります。文字エンコードで並べ替えられますが、sortメソッドを使用すると私たちのアイデアに従ってカスタマイズおよびソートする関数。具体的な構文は次のとおりです。
a = [1,4,-3,4,6,7,2,4,5];
a.sort(
//当返回值为正数的时候,保持位序不变
//当返回值为负数的时候,交换两数的位置
//当返回值为0的时候,保持位序不变
function (a,b) {
if(a < b){
return 1;
}
else{
return -1;
}
}
)
上記のコードでは、ポジティブソート方法を定義しています。コメントから、自分で定義した戻り値に基づいて判断できるソート方法を知ることができます。ソートの内部は、バブルソートアルゴリズムと同等です。この関数はステップバイステップで呼び出されます。この関数は判断を下すために渡されます。もちろん、コードには簡略化できる部分がいくつかあります。関数本体を直接変更しreturn a-b;
て、配列を正の順序で並べ替えることができます。それ以外の場合は並べ替えられます。逆の順序で。
- オンデマンドで小さな演習を共有
する配列を毎回順不同で表示する必要がある場合、ソート方法を使用してそれを実現するにはどうすればよいですか?- 実際、ランダムな乱数を使用して並べ替えると、
Math.random()
メソッドを使用して毎回(0、1)の範囲の数値を返すことができるため、0.5を引くと、戻り値は負または正になります。ソートパラメータ関数の戻り値として、私たちのニーズを満たすことができます。
- 実際、ランダムな乱数を使用して並べ替えると、
元の配列を変更しないでください
- concatメソッド
このメソッドは、2つの配列を接続し、元の配列を変更せずに結果を返すために使用されます。 - joinメソッド
このメソッドは、配列を仮パラメーター値と接続し、それらを文字列に変換して返すために使用されます - toStringメソッド
このメソッドは、配列を文字列に変換して返すために使用されます。 - スライスメソッド
このメソッドは、インターセプトの開始位置から終了位置まで、最大2つのパラメーターの配列要素をインターセプトするために使用されます。パラメーターが1つしかない場合、デフォルトでは、この位置から最後の位置までインターセプトします。負の数は逆数の要素を表します
配列のような
よく知られている引数など、配列に非常によく似たオブジェクトは、実際のパラメーターを配列のように格納しますが、配列にあるすべてのメソッドを持っているわけではないため、配列のように呼びます。
var obj = {
"0" : 'a',
"1" : 'b',
"2" : 'c',
"length" : 3,
"push" : Array.prototype.push
}
このように、私たちは率先して配列の長さプロパティとプッシュメソッドを彼に追加し、彼を配列のようにした後、彼のプッシュメソッドを呼び出すことができます。その前に、プッシュメソッドの本質を理解する必要があります。 。クラス配列の属性をプッシュする方法を理解するために、前述しましたが、長さ属性の値に従って追加されます。彼は「3」を追加しました:「2」の後に「d」、そして長さも4になりました。これらはオブジェクトが持つことができないものです。
クラス配列にはいくつかのコンポーネントが必要です。クラス配列の
最良の4つのコンポーネント
- 属性はインデックス(数値)属性である必要があります
- 長さ属性が必要です
- pushメソッドを追加することをお勧めします
- 「スプライス」:Array.prototype.splice
アリババのインタビューのための小さな演習を共有する
28:
var obj = {
"2" : 'a',
"3" : 'b',
"length" : 2,
"push" : Array.prototype.push,
}
obj.push(obj);
this.lengthは2に等しいので、aをcに置き換え、長さは3に等しくなります。2回目にthis.lengthが2に等しい場合、dをdに変更すると、length +1は4になります。
var obj = {
"2" : 'c',
"3" : 'd',
"length" : 2,
"push" : Array.prototype.push,
}
アレイの重複排除方法を共有する
主なアイデアは、同じ名前属性を持つことができないオブジェクトを使用し、配列から値を順番に読み取ってから、オブジェクトに移動して、属性が含まれているかどうかを判断し、含まれていない場合は定義し、含まれている場合は定義します。配列に大きな値があり、フィルターで除外できることを意味します。
Array.prototype.unique=function () {
var len = this.length,obj = {
},arr = [];
for(var i = 0;i < len;i++){
if(!obj[this[i]]){
obj[this[i]] = "xxx";//这里属性值可随意填写
arr.push(this[i]);
}
}
return arr;
}
メソッドがオブジェクトで定義されていない場合はundefinedを返し、そうでない場合はtrueを返し、それを格納します。プロパティ値を読み取ると、プロパティ値を読み取るため、0以外の任意の値に書き込むことができます。 0を返しますが、判断はまだ真です。したがって、アクセスエラーが発生する可能性があります。