理论Coffeescript转换声明难题

时间:2015-05-27 21:15:31

标签: javascript coffeescript switch-statement theory

前言

这可能没有真正的实现,但在阅读another post on coffeescript's 2 switch usages后,我决定玩弄它并发现这个相当奇怪的问题。

的CoffeeScript

type = 'guidance'

s = switch
  when type is 'guidance'
   'g'
  when type is 'vulnerability'
   'v'
  else
   'foo'

console.log s #g

已编译javascript

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表达式如何,结果都是相同的。

2 个答案:

答案 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