JavaScriptの死と生

4290 ワード

JavaScriptの成功は、正しい時間に正しい場所に現れることのおかげです.JavaScriptの登場はブラウザのサポートと密接に関係しています.ほら、VBScriptはこんなに運がいいわけではありません.JavaScriptは流行していますが、先天的な欠陥があります.Brendan Eichは当初10日しかかからずにJavaScriptを設計したが、JavaScriptの父としてBEはそう言った.
参照
JavaScriptが好きというより、嫌いです.それはC言語とSelf言語の一夜の情の産物です.18世紀の英国文学者ジョンソン博士は「その優秀さはオリジナルではなく、オリジナルのところは優秀ではない」と話した.(チェン一峰より抜粋:JavaScript誕生記)
JavaScriptの不足、最も明らかなのは文法です.悪い冗長な構文オプションパラメータとデフォルト値
Javascriptコード
function(a, b, option) {
  option = option || {};
  // ...
}
 
上記のコードではoptionはオプションパラメータである、渡されていない場合のデフォルト値は{}である.しかしながら、渡されるoption値は偽値(falsy値)である可能性がある.厳密に書くと、次のように判断されます.
Javascriptコード
function(a, b, option) {
  option = arguments.length > 2 ? option : {};
  // ...
}
 
注意:option=typeof option!=='undefined' ? option:{}が間違っている可能性もあります.伝わってきたのはundefinedかもしれません.bパラメータを必要とせずに削除するとargumentsに基づく.lengthの判断は、修正を忘れてエラーを起こしやすい.
Javascriptコード
function(a, option) {
  option = arguments.length > 2 ? option : {};
  // ...
}
 
以下の文法を増やしてくれればよかったのに.
Javascriptコード
function(a, b, option = {}) {
  // ...
}
 
Letの閉鎖は強く、怒っています.
Javascriptコード
for (var i=0, ilen=elements.length; i<ilen; i++) {
  var element = elements[i];
  LIB_addEventListener(element, 'click', function(event) {
    alert('I was originally number ' + i);
  });
}
 
上のコードは面接問題でよく出てきますが、解決策はもう1つの層を包むことです.
Javascriptコード
for (var i=0, ilen=elements.length; i<ilen; i++) {
  var element = elements[i];
  (function(num) {
    LIB_addEventListener(element, 'click', function(event) {
      alert('I was originally number ' + num);
    });
  }(i));
}
 
let文法を直接サポートすればいいですね.
Javascriptコード
for (var i=0, ilen=elements.length; i<ilen; i++) {
  var element = elements[i];
  let (num = i) {
    LIB_addEventListener(element, function(event) {
      alert('I was originally number ' + num);
    });
  };
}
 
モジュール・モジュール・モードは、次のような選択をすることはできません.
Javascriptコード
 
var event = (function() {

  // private variables
  var listeners = [];

  function addEventListener(f) {
    listeners.push(f);
  }

  function clearEventListeners() {
    listeners = [];
  }

  // ...

  // export the module's API
  return {
    addEventListener: addEventListener,
    clearEventListeners: clearEventListeners
    // ...
 };
}());
 
もし原生が支持すればどんなにいいだろう.
Javascriptコード
module event {

  // private variables
  var listeners = [];

  export function addEventListener(f) {
    listeners.push(f);
  }

  export function clearEventListeners() {
     listeners = [];
  }

  // ...
}
(function() {

  import event;

  // ...
}());
 
継承JavaScriptはプロトタイプチェーンによって継承されます.
Javascriptコード
function Employee(first, last, position) {
  // call the superclass constructor
  Person.call(this, first, last);
  this.position = position;
};
// inherit from Person
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;

// define an overridding toString() method
Employee.prototype.toString = function() {
  // call superclass's overridden toString() method
  return Person.prototype.toString.call(this) +
         ' is a ' + this.position;
};
 
次のように書くといいですね.
Javascriptコード
class Employee extends Person {
  constructor(first, last, position) {
      super(first, last);
      public position = position;
  }

  update(camera) {
      return super.update() + ' is a ' + position;
  }
}