またJSについて話します.これらのJSの中の寒い文法について詳しく話してください.


議題
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語句に似ています.キーワードではないですが、番狂わせの文法です.
この文章は順番に説明します.withfor in labeltypeofinstanceofdeletedebugger*以下の部分の定義は「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);
    }
出力結果は:01234556789
label文法
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つの組み合わせの出力はそれぞれ次のようになる.
  • -break出力は95
  • です.
  • -break出力は55
  • です.
  • 1-continue出力は99
  • です.
  • -continue出力は95
  • です.
    注意したいのは
    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
    ここで、nullfalseに出力されたことに疑問を感じるかもしれません.typeofがタイプを検出したとき、nullobjectタイプです.ここではなぜfalseに出力されますか?instanceofの文法を見に来ました.
    reult=variable instance of constructor
    ここのconstructorはコンストラクタの意味であり、これは理解にかたくない.nullはObjectのインスタンスを作成していないことを示しているので、instanceofはもちろんfalseであるが、nullはECMAScriptのobjectのタイプと考えられている.
    とりあえずここに来て、後期に補充します.