这可能没有真正的实现,但在阅读another post on coffeescript's 2 switch usages后,我决定玩弄它并发现这个相当奇怪的问题。
type = 'guidance'
s = switch
when type is 'guidance'
'g'
when type is 'vulnerability'
'v'
else
'foo'
console.log s #g
var s, type;
type = 'guidance';
s = (function() {
switch (false) {
case type !== 'guidance':
return 'g';
case type !== 'vulnerability':
return 'v';
default:
return 'foo';
}
})();
console.log(s); //g
我没有得到的是案例表达式被编译为相反的值。 Coffeescript when type is 'guidance'
应转换为以下javascript case type === 'guidance'
吗?
如果您使用s = switch true
,则会正确呈现案例表达式case type === 'guidance'
。无论渲染的javaScript case表达式如何,结果都是相同的。
答案 0 :(得分:3)
我不会将此称为问题,因为它按预期工作: - )
由于这个原因,我只能猜测(可能在编译器中有一些注释)。他们很可能需要将所有这些表达式转换为布尔值 - 他们希望它像switch
语句一样工作,但===
确实使用switch (true) {
case 1: …
case []: …
case "true": …
}
运算符来比较给定的价值。所以你不能做
switch (true) {
case !!( 1 ): …
case !!( [] ): …
case !!( "true" ): …
}
因为这些都不起作用,而所有这些都是真实的价值观。所以你可以使用toLocaleFormat()
:
true
,其中任何一个表达式都匹配!
。但是,您可以通过将外部!true
移动到比较的另一侧(switch (false) {
case !( 1 ): …
case !( [] ): …
case !( "true" ): …
}
)来减少代码大小,并获得等效的
!
您可以在datejs中看到这种确切的模式。现在,显然编译器足够聪明,可以将==
或===
表达式上的!=
组合为!==
或if else
,但这并不是为任意表达而努力。
如果你问我,他们应该把它编成一系列{{1}} s。
答案 1 :(得分:1)
无论出于何种原因,Coffeescript转换器都会生成一个switch
语句,以匹配显式值false
,而不是true
。因此,case
表达式与when
子句所说的相反。当when
子句中的表达式为true
时,生成的switch
语句将选择case
,因为它正在寻找相反的条件false
。