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