Open7

bunのECMAScript仕様非準拠の挙動

翠

bunは実行前にトランスパイラをかけることなどによって、ECMAScriptの仕様に準拠していない挙動があるので思いついた限りまとめてみる

翠

Function::nameがつくべきでないときもつく (仕様の該当箇所)
これらのconsole.assertが落ちる

var a = (0, function () {})
console.assert(a.name === '', 'Expected `a.name` to be empty')

var b = true ? function () {} : function () {}
console.assert(b.name === '', 'Expected `b.name` to be empty')

おそらくトランスパイラでvar a = function() {}var b = function () {}にされるため

翠

逆にFunction::nameがつくべきなときにつかないこともある

{
  function foo() {}
  console.assert(foo.name === 'foo', 'Expected foo.name to be "foo"');
}
{
  function foo() {}
  console.assert(foo.name === 'foo', 'Expected foo.name to be "foo"');
}
翠

TDZが存在しないことがある

console.log(Foo)
class Foo {}

これはエラーが起きるべきなはずだが起きない

翠

ほかのケースとしては

using foo = null
console.log(bar)
const bar = ''

エラーが起きるべきだが、undefinedが出力される