保留的JavaScript


41

如2015年的ECMAScript的,JavaScript有33个保留关键字,诸如breakconstnew,以及10个日后保留关键字,如letawait

您的任务是在编写功能性JavaScript代码3的同时,将最大数量的连续1个不同的保留关键字2链接在一起。

  1. 连续保留关键字-保留关键字,仅由空格和/或括号和/或花括号分隔。
  2. 保留关键字- 自ECMAScript 2015起的任何保留或将来保留的关键字。较早的标准中保留的关键字不包括在内,下面列出了允许的关键字的完整列表。
  3. 功能代码-您的代码应该运行(必要时声明运行时),最终停止运行,并且不会引发任何运行时错误。

如果您的代码需要特定的运行时,则在给定环境中,使用的保留关键字不得为空。

保留关键字列表

计分与范例

您的分数将等于连续的最大不同保留关键字的数量。
如果分数相等,则以字节为单位的最短源代码获胜。带注释的部分和字符串不计入保留关键字,但计入字节数。

// score: 3
if (true) 0; else throw function() {}
             ^------------------^
// score: 2
let foo = typeof typeof void typeof void 0;
                             ^---------^
// score: 0
/* typeof default debugger */

// score: 0, doesn't halt or debugger is no-op, depending on the environment
debugger;

有标准漏洞


沙盒讨论,适合那些感兴趣的人。
Nit

如果您不允许在关键字之间加上括号,我觉得这可能会更有趣。
小麦巫师

可以换行吗?
l4m2

@ l4m2是的,它是空格。
Nit

1
@ l4m2无需换行符,同样的43点解决方案也是可能的,所以也许我根本不理解您要提出的观点?
Nit

Answers:


53

43个字,603个字节

嗯,这是一个漏洞吗?我不知道这到底是什么合法的JS,但是它有效并且使用了每个关键字。

new (class await
{
    break(){}
    case(){}
    catch(){}
    const(){}
    continue(){}
    debugger(){}
    default(){}
    delete(){}
    do(){}
    else(){}
    enum(){}
    export(){}
    extends(){}
    finally(){}
    for(){}
    function(){}
    if(){}
    implements(){}
    import(){}
    in(){}
    instanceof(){}
    interface(){}
    let(){}
    package(){}
    private(){}
    protected(){}
    public(){}
    return(){}
    static(){}
    super(){}
    switch(){}
    this(){}
    throw(){}
    try(){}
    typeof(){}
    var(){}
    void(){}
    while(){}
    with(){}
    yield(){}
})

3
对JS不太熟悉,但是... 在此上下文中使用的是这些关键字吗,还是只是具有与关键字相同的词法结构并且使用糖来避免引号的字符串?
Leushenko '18 -4-4

1
@Leushenko可能是第二个(尽管我对JS也不太熟悉),因为它们在使用方式上看起来像函数名。尽管如此,通常仍然不能将这些关键字用作函数或类名,但是Siguza还是这样做,同时仍然遵守仅使用括号和方括号的挑战规则。一个很好的发现可以用我要说的所有单词来完成这项挑战,尽管实际上使用关键字AS 关键字,其他大多数答案看起来也更令人印象深刻。我仍然+1,看来我们有赢家。
凯文·克鲁伊森

6
@ user202729为什么?为什么可以使它如此简单地使其显得过于复杂?代码查询通常会做的越短越好,但是我个人还是希望在一定程度上保持可读性和简单性(我知道,这不是代码查询的挑战)。一些例子:我更喜欢使用-1i+1i-1上面~0-~i~-i当我可以,只是因为它更清晰,为那些谁是不太熟悉代码的高尔夫球场和读~呢。虽然我当然会一直使用i+~ji-~j高尔夫是单字节i-j-1i+j+1。;)
Kevin Cruijssen

2
是的,我可以进一步将其混搭,并尝试减少字节数...像这样的开始if(this)return void typeof function(){} else debugger并不难,但是在那之后它变得很难看。是的,这完全可以将关键字转换为标识符-但是对于其中的某些关键字,您必须使用它们才能使用(例如enum)。我只是将它推到了极致,但这不是高尔夫球运动的全部代码吗?:P
Siguza

1
@Magic不,提供类方法的名称只是一个语法上下文,其中文字标记被视为属性名称,即使它们是保留字也是如此。这基本上是相同的,在语义上,因为这样做obj["break"] = function (){}
apsillers

53

37个字

if (void this) {
  do {
    with (protected)
      for (public in private)
        typeof static instanceof new (function implements() {
          var let
          try {
            throw (class extends {} {})
          } catch (package) {
            yield
          } finally {
            debugger
          }
          return
        })()
    continue
    break
  } while (interface)
} else {
  switch (delete await) { default : 42 }
}

未使用的关键字:

  • case 要求 :
  • const 要求 =
  • export 需要严格模式
  • import 需要严格模式
  • super 要求 constructor

7
我承认我笑了
nicael

48
看起来像典型的Java样板代码,例如计算1 + 2
埃里克·杜米尼尔

2
@EricDuminil这就是它被称为_Java_Script的真正原因。
wizzwizz4

5
@EricDuminil并不是很简单1 + 2。该代码的全部价值是对生命,宇宙和一切最终问题的答案。太复杂了。:)
tsh

2
这真是太好了。
佩德罗

30

43个词语,302个 299字节

switch(void function(){for(const interface in public)do with(package)try{break}catch(private){if(typeof
this)throw yield static instanceof new class extends await{case(){return}super(){debugger}import(){}export(){}enum(){}}
else continue}finally{delete let}while(protected)var implements}){default:}

理论下限277(每两个字由一个字节分隔)
l4m2 '18年

做得好,目前您只是想念enum
Nit

10

21 24 26字,185字节

+ 1 2感谢阿尔诺的话,和+1 12Me21!

void(function(){do{with({})if(typeof true in this)throw{}instanceof new(class extends{}{})
else return delete{}
try{break}finally{yield}
continue
}while(false)})()
switch({}){case{}:{}}

假设我理解了挑战,那么这个分数为24个单词。没有括号,方括号和空格的单词:

void function do with if typeof true in this throw instanceof new class extends else return delete try break finally yield continue while false switch case

24个字,177字节

如果没有“ true”和“ false”,则根据问题显然不是关键字。

void(function(){do{with({})if(typeof{}in this)throw{}instanceof new(class extends{}{})
else return{}
try{break}finally{yield}
continue
}while(delete{})})()
switch({}){case{}:{}}

话:

void function do with if typeof in this throw instanceof new class extends else return try break finally yield continue while delete switch case

(我不小心删除了我的评论而不是对其进行编辑,其内容为:“您可以使用delete {}代替
是非

是啊。我对这个规则没有太多注意。
Arnauld

您可以输入case ... :default:末尾(因为:关键字之间不允许使用)
12Me21'4

可以以for(let _;0;);+2个单词结尾(但是您不能再使用case了)。
Arnauld

switch({}){case{}:{}}=> switch({}){case{}:;}?不知道;有时是否必要
l4m2 '18

6

38 39

class await {}
class g extends await {
 constructor() {
  super()
 }
}
switch ({}) {
 case function(){
  for (let in public)
  do with(package){
   try{break}catch(private){
   if(typeof this)
    throw static instanceof new (class extends await {})
   else{continue}}finally{debugger}
  }while(void protected)
  var implements
  return 
  yield delete interface
  const a=0
 }:
}

从“ super”到“ const”的单词

高尔夫球版:

class e{}class g extends e{constructor(){super()}}switch({}){case
function(){for(let in public)do with(package)try{break}catch(private){if(typeof
this)throw static instanceof new(class extends await{})
else{continue}}finally{debugger}while(void protected)
var implements
return 
yield delete interface
const a=0}:}

现在是打高尔夫球的时间吗?
l4m2 '18

我在Uncaught SyntaxError: Unexpected token delete尝试在Google Chrome的Javascript控制台中运行您的答案时遇到问题,如何测试您的解决方案是否有效?
Ferrybig

@Ferrybig我使用Firefox,它工作正常。由于系统原因,我无法安装新版本的Chrome
l4m2 '18年

我在Firefox中收到此错误SyntaxError: yield expression is only valid in generators
TheChetan

我使用ff 52.7.2
l4m2

4

21个字

(不确定letawait

var await=String, let=String;
switch (await) {
    case void typeof new await instanceof let in (function()
{do{try{return this
if((class extends{}{})){}else{break}}finally{(delete {})}}while(false)})():break;
}

, =并且;不允许用作分隔符。
user202729'4

2
他们没有被计算在内
soktinpk

3

43个字,300个字节

with(this)try{let protected}catch(package){if(delete yield)for(const interface in typeof public)do{throw implements instanceof private}while(static)else debugger}finally{switch(void new class extends function(){return}{export(){var await}import(){break}super(){continue}enum(){}case(){}}){default:0}}

更具可读性:

with(this)
    try {
        let protected
    } catch(package){
        if(delete yield)
            for(const interface in typeof public)
                do {
                    throw implements instanceof private
                } while(static)
        else
            debugger
    } finally {
        switch(
          void new class extends function(){return} {
              export(){var await}
              import(){break}
              super(){continue}
              enum(){}
              case(){}
          }
        ){
            default:0
        }
    }

我不得不使用“保留字作为方法名称”来处理

  • case(因为我已经使用default过了swtich),
  • exportimport(由于module-mode始终是严格的,因此不合格with
  • super(因为必须在其后进行属性访问或将其放置在constructor函数中),并且
  • enum (这绝对不能使用,因为它是保留字,没有语法上的有效用法)

我的39个解决方案显示super可能没有名字就可以在开头出现,但是太贵了
l4m2 '18年

3

14 15 16单词中没有括号或换行符

!function(){if(0);else do throw yield new public in void typeof this instanceof class await extends function async(){}{};while(0)}

感谢Bergi +1


您可以将其设为生成器函数并抛出yield吗?
Bergi

我试图弄清楚这是怎么做的,但我的头开始旋转。你能发表一个解释吗?
菲利普

Uncaught SyntaxError: Unexpected token new当我粘贴到我的JavaScript控制台时,我得到了提示
Ferrybig

1
@Ferrybig,替换functionfunction*,因此它将被识别为生成器。
guest-418 '18

2

28个单词,不带括号,234字节

将标识符名称作为方法定义名称太明显了(至少对我来说是如此),因此我一直在代码片段中寻找最长的连续连续的保留字和空白序列。

我希望a之后的return无效代码不会被视为漏洞,但是如果声明了使用的标识符,该代码仍然可以运行。

function*_(){implements:{
let private
var public
return yield typeof static
delete protected
throw new interface in package
break implements
debugger
void this instanceof class await extends function async(){}{}
do
continue
while(0)}}

这利用了一个事实,即某些将来的保留关键字仅在ES5.1的严格模式下才被视为无效(显然是因为引擎没有费心地阻止所有ES3的将来保留字,因此在网络上使用它们的代码太多了)。

同样,ES8中引入的asyncawait标记仅在严格模式下被视为关键字。


可以breakcontinue在那里?
l4m2

当我调用该函数时,得到Uncaught SyntaxError: Undefined label 'implements',您的答案是否需要特定的运行时?
Nit

@Nit Oops,我实际上没有称呼它,我只是检查它是否在语法上是允许的(然后是优化的平淡无奇的:D)。
Bergi

@ l4m2哦,您是对的,他们不能,但这是运行时错误,所以我没有注意到:-(需要一些任意的重新排序才能工作(并带有标签的块)
。– Bergi

在TiO @Bergi在Firefox它的语法错误,它的NodeJS的运行时
l4m2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.