当我使用evals修复旧代码中的错误时,我意识到表达式评估的确很奇怪。
如果您打开JavaScript控制台并输入
eval ('{"a": "b"}')
或
{"a": "b"}
你得到了
SyntaxError: Unexpected token :
但是如果你输入
var o = {"a": "b"};
语句以期望的结果执行。
如果你输入
(function() {return {"a": "b"};})()
你得到:
Object {a: "b"}
此外,如果您输入{a: "b"}
,则会获得“b”。我根本不明白。
我曾经认为var o = {"a": "b"};
meaned“评估表达式{"a": "b"}
并将结果分配给o
。
但显然它比那更复杂。我试着在语言规范中找到关于这一点的解释,但我认为我没有使用正确的措辞进行搜索。
任何人都可以提供一个线索,说明为什么我可以返回或将不是有效可评估表达式的值的值分配给变量吗?
答案 0 :(得分:5)
原因是花括号在Javascript中用于两个目的:它们包围对象文字,它们也包围代码块。
控制台和eval
将大括号解释为启动代码块,但您输入的是对象文字。这导致错误。
答案 1 :(得分:2)
不,编写var o = {"a":"b"}
表示“创建一个名为a
的成员的对象,其值为b
,并将此对象指定为局部变量o
的值”
括号与评估表达式无关,它们在JavaScript中用于对象表示法:
var a = {
foo:1,
baz:2
}
console.log(a.foo);
console.log(a.baz);
这将输出:
1
2
JS对象表示法。
答案 2 :(得分:2)
您可以使用
eval('({"a":"b"})'); // mind the parens
需要它们的原因与以下答案中描述的相同:What do parentheses surrounding a JavaScript object/function/class declaration mean?
虽然您可能希望使用正确的JSON解析:JSON.parse(str)
。