またJSについて話します.これらのJSの中の寒い文法について詳しく話してください.
19457 ワード
議題
ECMA-622には特定の用途を持つキーワードが記述されています.以下はECMAScriptのすべてのキーワードです.*が付いているのは第5版の新しいキーワードです.
この文章は順番に説明します.
またJSについて話します.あまり使われないJS文法です.
with(expression)statement
JSハイレンジ第三版では、With文の役割はコードのスコープを特定のオブジェクトに設定することです.
構文は:with(expression)statement[expression/表現][statement/陳述/expressionに代表される対象の後続コード操作として理解できる]
まず基本的な文法の使い方を見てみます.簡単な例です.
ここでは、
上記の例を少し修正したら、次のようになります.
以上のいくつかの例から、局所変数名と対象属性名が衝突した場合には、with文法を使うと大きな問題が生じ、またJSハイレンジの結び目を参照することができます.
厳密なモードではwith文は使用できません.そうでないと文法エラーと見なされます.with文を大量に使うと性能が低下し、デバッグコードが困難になるため、大きなアプリケーションを開発する際にはwith文は推奨されません.
for(property in expression)statement
JSハイレンジで与えられたfor-inn文の定義は、for-inn文は正確な反復文であり、対象の属性を列挙するために用いることができる.
構文は、for(property in expressition)statement[property/expression中の属性]です.
例えば、次の例:
注意したいのは:
ECMAScriptオブジェクトの属性には順序がありません.したがって、for-i nを循環して出力する属性名の順序は予測できない.具体的には、属性はすべて一回返されますが、戻りの順序はブラウザによって異なるかもしれません.
それでも、私たちはしばしば、次の例のように、配列を順次巡回する目的を達成するために、for-i文を使用することができる.
label文法
labelはキーワードではなく、コードブロックにラベルを付ける方式です.後でマークに戻ることができます.
において、しばしば
後に直接に内側の層から飛び出すか、それとも外側の層の循環を続けますか?
文法は:label:statement
例を見ます-break出力は95 です.-break出力は55 です. 1-continue出力は99 です.-continue出力は95 です.
注意したいのは
label文を使うなら、説明性のラベルを必ず使って、多すぎるループを入れ込まないように提案します.
typeof[検出タイプ]
ある変数を検出したい場合があります.この時は
instance of[検出対象の具体的なタイプ]
reult=variable instance of constructor
ここの
とりあえずここに来て、後期に補充します.
ECMA-622には特定の用途を持つキーワードが記述されています.以下はECMAScriptのすべてのキーワードです.*が付いているのは第5版の新しいキーワードです.
break do instanceof typeof case
else new var catch finally
return void continue for switch
while debugger* function this with
default if throw delete in try
すべてのキーワードを見ても、以下のキーワードはよく分からないかもしれません.あるいは知っていますが、よく使われていません.あるいは全く分かりません.instanceof typeof debugger* with delete in
このほかに、もう一つのlabel
文法があります.Cのgoto語句に似ています.キーワードではないですが、番狂わせの文法です.この文章は順番に説明します.
with
、for in
、label
、typeof
、instanceof
、delete
、debugger*
以下の部分の定義は「JavaScript高級プログラム設計(第三版)」から来ています.またJSについて話します.あまり使われないJS文法です.
with(expression)statement
JSハイレンジ第三版では、With文の役割はコードのスコープを特定のオブジェクトに設定することです.
構文は:with(expression)statement[expression/表現][statement/陳述/expressionに代表される対象の後続コード操作として理解できる]
まず基本的な文法の使い方を見てみます.簡単な例です.
// json
var person = {
name : 'lv',
age : 20
}
// with,
person.name = 'xf';
person.age = 23;
// with,
with(person){
name = 'xf';
age = 23;
}
一つのオブジェクトの中に属性が多い場合、一つのオブジェクトの複数の属性を一括的に修正したり、値付けしたりするときに、with文はコードを簡単にすることができますが、コードが不明瞭で、変数が混同しやすく、コードの読み取りが悪くなるなどの問題もあります.var person = {
name : 'lv',
age : 20
}
var name = 'xf';
with(person){
name = 'shi';
document.write(name);
}
document.write(name);
document.write(person.name);
第一のwriteがページに出力されたのは、shi
、第二のwriteがページに出力されたのは、xf
、第三のwriteがページに出力されたのは、shi
、withで修正されたnameがpersonの属性であることを示す.ここでは、
with
のstatementステートメントブロックで変数の作用領域が変化し、例えば変数としてのnameは、with
のstatementステートメントブロックにアクセスできなくなります.その理由は、この変数名とperson
の属性名が衝突しています.with
でJSはまずexpressionの属性名をstatementにマッピングし、属性リストにないものは変数名として解析します.このような規則は他の人がコードを読む時に曖昧さを生じることになります.対応する注釈がない限り、上記の例を少し修正したら、次のようになります.
var person = {
name : 'lv',
age : 20
}
with(person){
var name = 'xf';
name = 'shi';
document.write(name);
}
document.write(name);
document.write(person.name);
出力の結果は一定ではないです.Edge
ではテストと上記の結果は一致しています.Chrome
ではテストはブラウザが非現実的な第二の出力を無視しています.ですから、with文ブロックでは属性値と競合する変数が現れないようにしてください.そうでないと結果は分かりません.変数名が競合しない場合、変数はwith文ブロックの内部に置くか、それとも外部に置くかは同じです.以上のいくつかの例から、局所変数名と対象属性名が衝突した場合には、with文法を使うと大きな問題が生じ、またJSハイレンジの結び目を参照することができます.
厳密なモードではwith文は使用できません.そうでないと文法エラーと見なされます.with文を大量に使うと性能が低下し、デバッグコードが困難になるため、大きなアプリケーションを開発する際にはwith文は推奨されません.
for(property in expression)statement
JSハイレンジで与えられたfor-inn文の定義は、for-inn文は正確な反復文であり、対象の属性を列挙するために用いることができる.
構文は、for(property in expressition)statement[property/expression中の属性]です.
例えば、次の例:
for(var propName in window){
document.write(propName)
}
windowオブジェクトの中のすべての属性の名前を挙げることができます.注意したいのは:
ECMAScriptオブジェクトの属性には順序がありません.したがって、for-i nを循環して出力する属性名の順序は予測できない.具体的には、属性はすべて一回返されますが、戻りの順序はブラウザによって異なるかもしれません.
それでも、私たちはしばしば、次の例のように、配列を順次巡回する目的を達成するために、for-i文を使用することができる.
var arr = new Array();
for(var i=0;i<10;i++){
arr[i] = i;
}
for(var i in arr){
document.write(i);
}
出力結果は:01234556789label文法
labelはキーワードではなく、コードブロックにラベルを付ける方式です.後でマークに戻ることができます.
において、しばしば
label
は、ループステートメントに合わせて使用され、主にサイクル数を減らすために、条件を満たすために使用される.後に直接に内側の層から飛び出すか、それとも外側の層の循環を続けますか?
文法は:label:statement
例を見ます
var num = 0;
end : for(var i=0;i<10;i++){
for(var j=0;j<10;j++){
if(i==5&&j==5){
break end;
}
num++;
}
}
document.write(num);
end:
を含めて循環する位置を1とし、外部循環の位置を2とすると、以下の4つの組み合わせの出力はそれぞれ次のようになる.注意したいのは
label文を使うなら、説明性のラベルを必ず使って、多すぎるループを入れ込まないように提案します.
typeof[検出タイプ]
ある変数を検出したい場合があります.この時は
typeof
の存在意義があります.var a = 'string';
var b = 1;
var c = true;
var d;
var e = null;
var f = new Object();
var g = function(){};
console.log(typeof a) // string
console.log(typeof b)// number
console.log(typeof c)// boolean
console.log(typeof d)// undefined
console.log(typeof e)// object
console.log(typeof f)// object
console.log(typeof g)// function
しかし、参照の種類については、null
であろうとObject
であろうと、typeof
はいずれもobject
であり、あるオブジェクトがどのタイプのオブジェクトかを検出したいときには、typeof
はすでに私たちを満たしていないので、instanceof
キーワードを使って目的を達成することができます.instance of[検出対象の具体的なタイプ]
var a = /\.vue$/
var b = new Object()
var c = null
var d = new Array()
var e = { name : 'lv'}
console.log(a instanceof RegExp)// true
console.log(b instanceof Object)// true
console.log(c instanceof null)// false
console.log(d instanceof Array)// true
console.log(e instanceof Object)// true
ここで、null
がfalse
に出力されたことに疑問を感じるかもしれません.typeof
がタイプを検出したとき、null
はobject
タイプです.ここではなぜfalse
に出力されますか?instanceof
の文法を見に来ました.reult=variable instance of constructor
ここの
constructor
はコンストラクタの意味であり、これは理解にかたくない.null
はObjectのインスタンスを作成していないことを示しているので、instanceof
はもちろんfalse
であるが、null
はECMAScriptのobject
のタイプと考えられている.とりあえずここに来て、後期に補充します.