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不会对此抱怨(它会