Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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 JS何时将{}解释为空块而不是空对象?_Javascript_Node.js_Firebug - Fatal编程技术网

Javascript JS何时将{}解释为空块而不是空对象?

Javascript JS何时将{}解释为空块而不是空对象?,javascript,node.js,firebug,Javascript,Node.js,Firebug,我读到了答案(关于“wat”视频),它说: {}+[] 这被解释为一个空代码块、一元加号和空数组。第一部分什么也不做,数组被转换成以逗号分隔的元素字符串(空数组为空字符串),然后转换成一个数字(空字符串被转换成0),因此为0 我目前正在从《权威指南》学习JS,所以我试图真正理解类似的东西 我的问题是,JS何时决定将{}解释为空代码块,而不是空对象 另外,Node.js和Firebug之间存在一些不一致之处,我想了解一下 萤火虫: {}[]和({}[])“> Node.js: {}[]和({}[]

我读到了答案(关于“wat”视频),它说:

  • {}+[]

    这被解释为一个空代码块、一元加号和空数组。第一部分什么也不做,数组被转换成以逗号分隔的元素字符串(空数组为空字符串),然后转换成一个数字(空字符串被转换成0),因此为0
  • 我目前正在从《权威指南》学习JS,所以我试图真正理解类似的东西

    我的问题是,JS何时决定将
    {}
    解释为空代码块,而不是空对象

    另外,Node.js和Firebug之间存在一些不一致之处,我想了解一下

    萤火虫:

    {}[]和
    ({}[])
    “>

    Node.js:


    {}[]和
    ({}[])
    “>

    当新语句中的第一个标记是
    {
    ,则
    {}
    被解释为空块

    (实际上,当
    {
    出现在类似
    的头子句后面时,如果
    while
    ,那么
    {}
    也是一个空块,但这不是有趣的情况。)

    因此,在任何其他上下文中,比如说函数的参数:

    foo({});
    
    {}
    被解释为空对象文本


    这种情况类似于
    函数
    关键字作为语句中的第一项时被区别对待的方式。语法有歧义,解析器用固定的规则解决问题。

    让我们看看语言语法,好吗?:

    这是一种非常奇特的说法,语句可以是块、变量语句、空语句、表达式语句或许多其他内容。请注意,第一个选项是“块”:

    Block :
        { StatementList(opt) }
    
    StatementList :
        Statement
        StatementList Statement
    
    这也是说块是一个
    {
    ,可选地后跟一组语句,后跟一个
    }

    这就是您在示例中看到的:在JavaScript解析器认为您拥有的可能是对象文字(在
    ExpressionStatement
    下定义,这是“Statement”可能是的第四个东西)之前,它首先认为您拥有一个“Block”

    编辑:如果您愿意,您可以在JavaScript引擎的源代码中看到它:

    • 在Chrome的JavaScript引擎V8中,我们进入。问题是我们是否在
      {
      上,如果在
      {
      上,则解析为块
    • 在Firefox的JavaScript引擎SpiderMonkey中,我们从一个到另一个看到反对
      {
      并将其解析为块语句

    关于你的第二个问题,我们已经非常详细地讨论过了。总结一句话:Node.js将你的输入视为一个表达式(因此它不能是一个“块”),而Firebug/Chrome开发工具将其视为“语句”。

    如何解释第一个Node.js示例?谢谢!@EllaShar我对Node不太熟悉,但它基本上只是将您键入的字符串传递给
    eval()
    ,但它以某种方式改变了语法上下文。如果您键入
    ;{}+[]
    在节点中,然后你会得到
    0
    就像在Firebug中一样。我认为这不是重复,因为它明确地引用了另一个问题并询问了一个细节。@Pointy-它引用了一个不同的问题。链接的问题清楚地解释了行为。正如重复中所指出的,[]和{}都转换为它们的基元值。
    .join
    在空数组上是一个空字符串。toString.call({})是“[Object Object]”。表达式导致连接,例如(“1”+0)=10或“[Object Object]”“+”=“[Object Object]””@TravisJ我同意这是一个关于它是否真的是一个复制品的意见问题。我对复制品没有太大的问题,但我理解如果你对它有强烈的感觉,其他人也会这么做。去吧,把它关上,我不会碰它:)@TravisJ我也不知道我有上帝般的力量,可以不经表决就重新打开:)我认为这是不对的t节点REPL将输入视为一个表达式-例如,您可以在REPL中键入一个
    for
    循环。这就是摘要出现在句子中的原因。Benjamin Gruenbaum的回答更详细:REPL首先尝试将其作为表达式执行,如果抛出一个语法错误,它将直接执行
    eval
    。为什么?sh我现在看到了rugOK-Node显式地检查对象文本的大小写(前导
    {
    )。我不认为我会这样做(最基本的是不让人惊讶)但不管怎样。谢谢你有趣的引用!我仍然不明白Node.js示例中的分号为什么重要。好吧,表达式中不允许使用分号,因此它不能作为表达式计算,而只能作为语句计算。
    Block :
        { StatementList(opt) }
    
    StatementList :
        Statement
        StatementList Statement