Что означают вычисляемые и необязательные значения в узле AST JavaScript MemberExpression?

#javascript #abstract-syntax-tree

Вопрос:

Я должен a.x = b.y быть узлом AST:

 {  "type": "ExpressionStatement",  "start": 122,  "end": 131,  "expression": {  "type": "AssignmentExpression",  "start": 122,  "end": 131,  "operator": "=",  "left": {  "type": "MemberExpression",  "start": 122,  "end": 125,  "object": {  "type": "Identifier",  "start": 122,  "end": 123,  "name": "a"  },  "property": {  "type": "Identifier",  "start": 124,  "end": 125,  "name": "x"  },  "computed": false,  "optional": false  },  "right": {  "type": "MemberExpression",  "start": 128,  "end": 131,  "object": {  "type": "Identifier",  "start": 128,  "end": 129,  "name": "b"  },  "property": {  "type": "Identifier",  "start": 130,  "end": 131,  "name": "y"  },  "computed": false,  "optional": false  }  } }  

Что означает computed «и optional «? Каковы некоторые примеры?

Комментарии:

1. Вычислено означает , что свойство похоже object[property] на, в отличие от object.property , все еще не уверен, что является необязательным, хотя.

Ответ №1:

Вот как a.b[c.d[e].f].g это выглядит:

 {  "type": "Program",  "body": [  {  "type": "MemberExpression",  "object": {  "type": "MemberExpression",  "object": {  "type": "MemberExpression",  "object": {  "type": "Identifier",  "start": 1,  "end": 2,  "name": "a"  },  "property": {  "type": "Identifier",  "start": 3,  "end": 4,  "name": "b"  },  "computed": false  },  "property": {  "type": "MemberExpression",  "object": {  "type": "MemberExpression",  "object": {  "type": "MemberExpression",  "object": {  "type": "Identifier",  "start": 5,  "end": 6,  "name": "c"  },  "property": {  "type": "Identifier",  "start": 7,  "end": 8,  "name": "d"  },  "computed": false  },  "property": {  "type": "Identifier",  "start": 9,  "end": 10,  "name": "e"  },  "computed": true  },  "property": {  "type": "Identifier",  "start": 12,  "end": 13,  "name": "f"  },  "computed": false  },  "computed": true  },  "property": {  "type": "Identifier",  "start": 15,  "end": 16,  "name": "g"  },  "computed": false  }  ] }  

То computed есть для object[property] .