Javascript 用分号声明类属性时的奇怪行为

Javascript 用分号声明类属性时的奇怪行为,javascript,es6-class,ecmascript-next,Javascript,Es6 Class,Ecmascript Next,为什么代码是可编译的,而c.x的值是未定义的 用:声明类属性会有什么影响?关于x:5部分,虽然这是一个有效的javascript代码,但它没有多大用处。 这是一个javascript,它主要在循环上下文中使用(如果有) 因此,要回答您的问题: 为什么代码是可编译的 因为从技术上讲,这是一个有效的javascript代码(但不是有效的class字段) 但是c.x的值未定义 因为x是一个标签而不是类字段 使用: 您将获得一个标签,而不是一个类字段 附录 另一个常见错误是块代码: class Som

为什么代码是可编译的,而
c.x
的值是未定义的


声明类属性会有什么影响?

关于
x:5
部分,虽然这是一个有效的javascript代码,但它没有多大用处。
这是一个javascript,它主要在循环上下文中使用(如果有)

因此,要回答您的问题:

为什么代码是可编译的

因为从技术上讲,这是一个有效的javascript代码(但不是有效的
class
字段)

但是
c.x
的值未定义

因为
x
是一个标签而不是类字段

使用

您将获得一个标签,而不是一个类字段


附录
另一个常见错误是块代码:

class SomeClass {
  x: 5;
  y = 10;
}

const c = new SomeClass();
alert(c.x + ' : ' + c.y); 
您可能认为
z()
将返回一个带有
x
键的对象:

class SomeClass {
  z = () => {
    x: 5;
  };
}
但实际上,您有一个标签为
x
的函数,它只运行一个
5
表达式

为了完整性起见,修复方法是添加一个显式返回和另一组大括号

`{x:5}`
或者干脆用括号把整件事包起来

() => {return {x: 5}}
编辑
作为以下评论的后续内容:
需要明确的是,您的代码在我测试过的几个环境中编译,以及堆栈片段,如下所示:
class-SomeClass{
x:5;
y=10;
}
常数c=新的SomeClass();

console.log(c.x+':'+c.y)关于
x:5
部分,虽然这是一个有效的javascript代码,但没有多大用处。
这是一个javascript,它主要在循环上下文中使用(如果有)

因此,要回答您的问题:

为什么代码是可编译的

因为从技术上讲,这是一个有效的javascript代码(但不是有效的
class
字段)

但是
c.x
的值未定义

因为
x
是一个标签而不是类字段

使用

您将获得一个标签,而不是一个类字段


附录
另一个常见错误是块代码:

class SomeClass {
  x: 5;
  y = 10;
}

const c = new SomeClass();
alert(c.x + ' : ' + c.y); 
您可能认为
z()
将返回一个带有
x
键的对象:

class SomeClass {
  z = () => {
    x: 5;
  };
}
但实际上,您有一个标签为
x
的函数,它只运行一个
5
表达式

为了完整性起见,修复方法是添加一个显式返回和另一组大括号

`{x:5}`
或者干脆用括号把整件事包起来

() => {return {x: 5}}
编辑
作为以下评论的后续内容:
需要明确的是,您的代码在我测试过的几个环境中编译,以及堆栈片段,如下所示:
class-SomeClass{
x:5;
y=10;
}
常数c=新的SomeClass();

console.log(c.x+':'+c.y)该代码无效ES6


您似乎正在使用babel进行“编译”,并且无意中启用了语法扩展(以及第二行)。在flow中,
x:5
是一个变量。当然,
5
作为一种类型是没有意义的,但显然它们允许相当任意的表达式。

该代码不是有效的ES6


您似乎正在使用babel进行“编译”,并且无意中启用了语法扩展(以及第二行)。在flow中,
x:5
是一个变量。当然,
5
作为一种类型没有意义,但显然它们允许相当任意的表达式。

这不是ES6,我不相信
x:5
甚至是任何类型的建议。这在js中不是有效的类声明语句是的一部分。它可能是某种语言扩展中的类型注释,但它绝对无效。这不是ES6,我不相信
x:5
甚至是任何类型的建议。这在js中不是有效的类声明语句是的一部分。它可能是某些语言扩展中的类型批注,但它在块内绝对无效(
{…}
,看起来像一个对象文字)。它可能是有效的代码,但没有标签作为
体的一部分绝对无效。@Bergi“标签作为类主体的一部分绝对是无效的”我说它在哪里?我写道:“虽然这是一个有效的javascript代码,但它没有多大用处……”。这是有效的javascript代码,因此巴贝尔不会对此抱怨(当然会被忽略).您说它是有效代码,但显然不是。类的
x:5
部分是无效代码。令牌序列“
x:5
“可以是对象文字的有效部分,字符串文字的有效部分,甚至是其本身的有效语句,对于这个问题根本不重要。OP发布的代码是不可编译的。我不想在这里争论,但我想说清楚(也许可以从我的错误中吸取教训)。OP问:“为什么代码是可编译的,而
c.x
的值是未定义的?”。您不能忽略这样一个事实,即代码是可编译的(您也可以检查代码是如何编译的,而不会出现错误)。我仍然认为它是有效的代码,因为没有错误,它是有用的代码吗?当然不是。所以它是一个“有效”的JS代码,在这种上下文中是毫无意义的。编译器/linter应该能够识别上下文并触发错误,而不是默默地忽略它…在块内(
{…}
,看起来像一个对象文字)它可能是有效的代码,但作为
主体的一部分,标签绝对无效。@Bergi“标签作为类主体的一部分绝对无效”我说它在哪里?我写道:“虽然这是一个有效的javascript代码,但它没有多大用处……”。这是有效的javascript代码,因此babel不会对此抱怨(它会