Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 立即访问对象';s属性_Javascript - Fatal编程技术网

Javascript 立即访问对象';s属性

Javascript 立即访问对象';s属性,javascript,Javascript,给出定义对象然后尝试立即访问其属性的四个示例: {foo: 'bar'}.foo // syntax error: unexpected_token 我希望这会返回'foo'的值,但它会导致语法错误 我能给出的唯一解释是,对象定义尚未执行,因此还不是对象。因此,似乎忽略了对象定义,语法错误源于试图执行以下操作: .foo // results in the same syntax error: unexpected_token 同样地: {foo: 'bar'}['foo'] // retu

给出定义对象然后尝试立即访问其属性的四个示例:

{foo: 'bar'}.foo
// syntax error: unexpected_token
我希望这会返回'foo'的值,但它会导致语法错误

我能给出的唯一解释是,对象定义尚未执行,因此还不是对象。因此,似乎忽略了对象定义,语法错误源于试图执行以下操作:

.foo
// results in the same syntax error: unexpected_token
同样地:

{foo: 'bar'}['foo']
// returns the new Array ['foo']
这似乎是忽略对象文本并执行后续代码的证据

但是,这些方法可以很好地工作:

({foo: 'bar'}).foo
// 'bar'

({foo: 'bar'})['foo']
// 'bar'
圆括号用于运行代码行,由于括号运算符的结果是实例化的对象,因此可以访问属性


那么,为什么对象定义被忽略而没有立即执行?

它没有被忽略,只是在这里没有被识别为对象

语句开头的
{…}
被解析为一组代码

{foo:'bar'}.foo
的情况下,内部代码
foo:“bar”
被解析为

因此,
{foo:'bar'}
正确解析(即使它没有达到预期的效果),但是属性访问语法实际上导致了语法错误,因为访问块上的属性是无效的


正如您所注意到的,解决方案是将对象括在括号中:

({foo: 'bar'}).foo
开头的语句会导致解析器在括号内搜索表达式。
{foo:'bar}
当解析为表达式时,正如您所期望的那样是一个表达式


对于
{foo:'bar'}['foo']
,它实际上被解析为两个独立的语句:一个块(
{foo:'bar'}
和一个数组初始值设定项(
['foo']
):

这是“上下文”的问题,您的前两个示例不是对象文本

它们是语句块,例如:

{ foo: 'bar' }
上面的代码作为一个块进行计算,包含一个(
foo
)指向一个表达式语句(字符串literal
'bar'

当您将其包装在括号中时,代码将在表达式上下文中求值,因此语法与对象文字语法匹配

事实上,还有其他方法可以强制表达式求值,您将看到点属性accesor表示法在直接应用于对象文字时有效,例如:

({foo:'bar'}.foo);  // 'bar'
0, {foo:'bar'}.foo; // 'bar'
0||{foo:'bar'}.foo; // 'bar'
1&&{foo:'bar'}.foo; // 'bar'
// etc...
现在在第二个示例中:

{foo: 'bar'}['foo']
这里发生的事情是对这两条语句求值,首先是块,然后是包含数组文本的表达式语句

与函数表达式与函数声明的语法歧义类似

另见:


如果这是不允许的,为什么javascript在{foo:'bar'}['foo']的情况下不返回语法错误?是的,正如错误所述-这是一个语法错误。正确的语法是使用括号。@elmeurer还注意“在语句开头”(或“语句”上下文中)的措辞。虽然不是很漂亮,但这是有效的:
f={a:“b”}.a
--{…}发生在一个“表达式”上下文中。正如我前面提到的,{foo:'bar'}['foo']案例中没有语法错误。它返回数组['foo'],就像我刚刚运行代码['foo']来实例化一个数组['foo']。这只是好奇吗?或者使用它确实有合法的理由:
{foo:'bar'}.foo
?完全好奇语言如何解释这句话。
{foo: 'bar'}['foo']