Skip to content

Latest commit

 

History

History
106 lines (74 loc) · 6.82 KB

funny_js_syntax.md

File metadata and controls

106 lines (74 loc) · 6.82 KB

備考

(GPT-4)


kekyo

Netscape NavigatorのインタプリタとしてJavaScript言語を設計するとき、scheme言語を土台にしたという記事をどこかで見た気がします。 そのことが記載されている論文はありますか? scheme言語であったかどうかはあやふやなので、もしかしたら違うかもしれません。

chatgpt

JavaScript の開発者である Brendan Eich は、JavaScript 言語の設計を行った際に Scheme 言語からインスピレーションを受けたといわれていますが、 正確に言うと、Scheme がそのまま土台とされたわけではありません。 JavaScript の開発当初の名前は「Mocha」で、後に「LiveScript」を経て「JavaScript」となりました。 JavaScript は多くのプログラミング言語から影響を受けており、その中には Self、Java、Perl、Python、C言語、およびScheme などが含まれています。

JavaScript と Scheme にはいくつかの類似点があります。たとえば、両言語とも第一級関数 (first-class functions) をサポートしており、 これは関数をオブジェクトとして扱い、他の関数に引数として渡したり、戻り値として返したりすることができる機能です。 また、両言語はガーベジコレクション (自動メモリ管理) をサポートしています。

一方で、JavaScript と Scheme の違いも多くあります。例えば、JavaScript はプロトタイプベースのオブジェクト指向を採用していますが、 Scheme は伝統的なオブジェクト指向プログラミングには基づいていません。 また、JavaScript には C 言語や Java からの構文的な要素が多く含まれていますが、Scheme は Lisp の方言であり、全く異なる構文を持っています。

Brendan Eich のインタビューや彼が書いたブログ記事で、彼が Scheme などから影響を受けたことが語られていますが、 Scheme が JavaScript の設計の土台として使われたと主張する論文は、私の知る限り存在しません。

kekyo

JavaScriptには、奇妙なふるまいを行う式が数多く指摘されています。 例えば、NaN === NaNはfalseを示す、などです。このような奇妙さは、JavaScriptのどこから発生すると推測しますか? 例えば、それは後から拡張された構文仕様の矛盾を解消するためですか? あるいは、Wikipediaに記載されているような、プロダクトマネージャによる要望を実現するために、しわ寄せが来たのでしょうか?

chatgpt

JavaScript の奇妙な振る舞いや矛盾は、いくつかの理由から生じています。主な理由の一つは、JavaScript が当初急いで開発されたことです。 Brendan Eich は、当時の Netscape Communications 社でプロトタイプを開発するために、わずか 10 日間しか与えられませんでした。 そのため、言語設計に関して十分な時間がかけられず、一部の機能や振る舞いに問題が生じました。

加えて、JavaScript が成長し、様々な機能が追加される中で、後方互換性を維持するために、一部の振る舞いがそのまま残されたことも、奇妙な振る舞いの原因となっています。 例えば、NaN === NaN が false を返す振る舞いは、IEEE 754 標準の浮動小数点演算の仕様に基づいています。 これは、JavaScript だけでなく、他のプログラミング言語でも同様の振る舞いが見られるため、特に JavaScript のみの問題ではありません。

また、言語が成長する過程で、プロダクトマネージャや利用者の要望を取り入れることも、一部の振る舞いに影響を与えました。 例えば、== と === のような異なる等価演算子が導入されたのは、型変換を伴う比較と厳密な比較を区別するためです。 しかし、このような選択肢が与えられたことで、開発者にとってコーディング時に注意が必要となり、矛盾や混乱を招くことがあります。

総じて、JavaScript の奇妙な振る舞いは、急速な開発スケジュール、後方互換性の維持、様々な利用者の要望の反映、 そして他のプログラミング言語や仕様との互換性の維持によるものと言えます。これらの要因が複雑に絡み合って、言語の特性として現れています。

kekyo

他にも、JavaScriptの奇妙なふるまいの例を知っていれば、いくつか挙げてください。

chatgpt

JavaScriptにはいくつかの奇妙な振る舞いが存在します。以下にそのいくつかを挙げます。

  1. 加算演算子と文字列の結合: JavaScriptでは、加算演算子(+)は数値の加算だけでなく、文字列の結合にも使用されます。これによって、意図しない型変換が発生することがあります。
console.log("3" + 4); // "34" と出力されます。数値 4 が文字列に変換されて結合されます。
  1. 型変換による比較の不一致: == 演算子は、型変換を伴う比較を行います。これにより、意図しない結果が返されることがあります。
console.log("5" == 5); // true と出力されます。文字列 "5" が数値に変換されて比較されます。
  1. 配列とオブジェクトの比較: JavaScriptでは、配列とオブジェクトの比較が一貫性に欠けることがあります。
console.log([] == false); // true と出力されます。
console.log([] == ![]);   // true と出力されます。
console.log({} == false); // false と出力されます。
  1. 数値の丸め誤差: JavaScriptでの数値計算は、IEEE 754標準に従った浮動小数点数を使用しており、丸め誤差が発生することがあります。
console.log(0.1 + 0.2); // 0.30000000000000004 と出力されます。
  1. undefinednull の扱い: JavaScriptでは、undefinednull は異なる値ですが、== 演算子を使って比較すると等しいと判定されます。
console.log(undefined == null); // true と出力されます。
console.log(undefined === null); // false と出力されます。

これらの奇妙な振る舞いは、JavaScriptの言語仕様や型変換、演算子の振る舞いに関連していることが多いです。 開発者は、これらの振る舞いを理解し、コーディング時に注意を払うことが重要です。