ホームページ  >  記事  >  ウェブフロントエンド  >  Javascript学習ノート ~operator_javascriptスキルの詳細解説~

Javascript学習ノート ~operator_javascriptスキルの詳細解説~

WBOY
WBOYオリジナル
2016-05-16 18:02:321087ブラウズ
1. 判定
構文
prop in objectName
objectName が指すオブジェクトに prop 属性またはキー値が含まれている場合、in 演算子は true を返します。
コードをコピー コードは次のとおりです。

var arr = ['one',' two', 'three','four'];
arr.five = '5';
0 in arr;//true
'one' in arr;配列の判定が可能です
'five' in arr;//true,'five' は arr オブジェクトのプロパティです
'length' in arr;//true

プロトタイプ チェーン
in 演算子 指定された prop 属性

Object.prototype.sayHello = 'hello,world';
var foo = new Object();
'sayHello' in foo;//true; >'toString' in foo;//true;
'hasOwnProperty' in foo;//true;

オブジェクトとリテラル
オブジェクトを扱う場合、in 演算子がうまく機能しませんおよび特定の型のリテラル (文字列、数値)

コードをコピー と同じです。 コードは次のとおりです:
var SayHelloObj = new String('hello,world ');
var SayHello = 'hello,world';
var num = 1; >
'toString'insayHelloObj; //true
'toString'insayHello; //型エラー

'toString'in num; //Type error


その理由は、MDN の String オブジェクトとリテラル変換に関するこの紹介を見つけたためです。これでこの理由が説明されているようです:

JavaScript が自動的に変換するため文字列プリミティブと String オブジェクトの間では、文字列プリミティブで String オブジェクトのメソッドを呼び出すことができます。JavaScript は文字列プリミティブを一時 String オブジェクトに自動的に変換し、そのメソッドを呼び出して、その一時 String オブジェクトを破棄します。文字列リテラルから作成された文字列プリミティブで String.length プロパティを使用できます
次のように理解してください。 in はメソッドではなく演算子であるため、文字列リテラルは String オブジェクトに自動的に変換できません。 in 演算子のクエリ オブジェクトはオブジェクトではなく String (ベテランの Douglas によれば、単なるオブジェクトのような型です) であるため、型エラーが報告されます。


2.


のトラバースは、非常に一般的に使用される for...in ループ ステートメントです。このステートメントの in は、別の文法仕様に従う必要があります。 >for (オブジェクト内の変数)
ステートメント
演算子として in を単独で使用する場合とは異なり、for...in ループ ステートメントは、プロトタイプ チェーンのカスタム属性を含むユーザー定義の属性のみをトラバースします。 toString などの組み込みプロパティが走査されます。

オブジェクト




コードをコピー
コードは次のとおりです。 function Bird (){ this.wings = 2; this.feet = 4;
this.flyable = true;
var チキン = 新しい Bird(); flyable = false ;
for(var p in Chicken){
alert('chicken.' p '=' Chicken[p]);


文字列オブジェクト,テスト済みの Firefox、Chrome、Opera、Safari ブラウザはすべてコメントに結果を表示しますが、IE ブラウザのみ「more」と「world」のみが表示されます




コードをコピー

コードは次のとおりです。
Literal
配列リテラルのキー値と属性を走査します




コードをコピー

コードは次のとおりです:

var arr = ['one','two','three',' four']; arr.five = 'five'; for(var p in arr){ alert(arr[p]);//'one','two','three' ,'four',' four' }
文字列リテラルの前に in 演算子を単独で使用すると型エラーが報告されますが、次のコードは正常に実行できます。このとき、IE ブラウザはサイレントです




コードをコピーします

コードは次のとおりです:

var str = 'hello';
str.more = 'world';
for(var p in str){
alert(p);//0,1,2 ,3,4
alert(str[p]);//'h','e','l','l','o'
}

一般
ECMA にはこの点に関する仕様がありますが、依然としてブラウザー間で違いがあるため、文字列を走査するために for...in を使用することは推奨されません。また、配列を走査することも推奨されません (図に示すように)。例) カスタム属性を配列に追加すると、走査が混乱することを示します)

オブジェクトの走査に関しては、オブジェクトの組み込みメソッド hasOwnProperty() を使用して、オブジェクトのプロパティを除外することもできます。プロトタイプ チェーンを使用してトラバースをさらに高速化し、パフォーマンスを向上させます
コードをコピーします コードは次のとおりです:

関数 each(object, callback, args) {
var prop;
for( prop in object ){
if( object.hasOwnProperty( i ) ){
callback.apply( prop , 引数 );
}
}
}
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。