今日、json 文字列の解析を学び、eval() メソッドを使用しました。文字列を解析するときに括弧を追加する必要があるのはなぜですか?困惑した。 JavaScript の {} ステートメント ブロックは曖昧であり、括弧を追加しないとエラーが発生することがわかりました。この曖昧さを理解することは、JavaScript コードを理解するのに非常に役立ちます。
1. {} ステートメント ブロックの 2 つの意味
はステートメントブロック
を表します
a. {} を使用して JavaScript 内のコードを囲み、エディターでのコード管理を容易にすることができます。 JavaScript にはブロックレベルのスコープがないため、このアプローチは無害です。
{ //some code... }
b. JavaScript では、条件ステートメント、ループ ステートメント、関数はすべて、コード
オブジェクトリテラル
var box = { name:'kuoaho', age:21 }
//このとき、[code] は式として使用され、変数に代入できます
//実際、オブジェクト リテラルはオブジェクト値を生成できる式です
2. オブジェクト リテラルが代入式として使用されない場合はどうなりますか?
例:
{name:'kuoao'} //没有报错,但是也没有创建对象 {name:'kuohao',age} //报错
上記からわかるように、オブジェクト リテラルは式としてのみ代入できます。最初の書き方に問題はありませんが、JavaScript はこれをラベル ステートメントとして解析します。
分析:
{name:'kuoao'} //{}一个语句块 // name:'kuohao',一个label语句,用于标记for循环
3. しかし、問題は再び起こります...
{ name:'kuohao', age:21 }
//これによりエラーが発生するのはなぜですか?これがオブジェクトリテラルの書き方ではないでしょうか?
JavaScript の {} には曖昧さがあるため、{} はオブジェクト リテラルであるだけでなく、コード ブロックともみなされます。
analysis: { name:'kuohao', age:21 }
1 つのコード ブロック、2 つのラベル ステートメント、カンマがなければまったく問題ないため、キーはカンマです。2 つのステートメントはセミコロンで区切られている必要があるため、JavaScript はこれが構文であると判断します。エラー
4. 正しい書き方
({ name:'kuohao', age:21 }) //正确的写法
() はステートメントをステートメント式と呼ばれる式に変換します。オブジェクトはリテラル式ではありませんか?変換するにはなぜ () が必要ですか?
括弧を追加すると、括弧内のコードが式の評価に変換されて返されるため、このあいまいさは解消されます。したがって、ステートメント ブロックはオブジェクト リテラルになり、オブジェクト リテラルは次のように存在する必要があると結論付けることもできます。式