`

JavaScript 的死与生

 
阅读更多

JavaScript 的成功得益于在正确的时间出现在正确的地点。JavaScript 的兴起与浏览器的支持息息相关。你瞧,VBScript 就没这么好运气。

JavaScript 很流行,但它有先天缺陷。Brendan Eich 当初只花了 10 天时间就把 JavaScript 设计出来了,作为 JavaScript 之父,BE 如是说。

引用
与其说我爱 JavaScript,不如说我恨它。它是 C 语言和 Self 语言一夜情的产物。十八世纪英国文学家约翰逊博士说得好:“它的优秀之处并非原创,它的原创之处并不优秀。”(摘选自阮一峰的翻译: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);
  });
}
 


上面的代码经常在面试题中出现,解决办法是再包裹一层:

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;
  }
}
 

分享到:
评论

相关推荐

    javascript做简单计算生存小时

    标题 "JavaScript做简单计算生存小时" 指的是利用JavaScript编程语言从用户的身份证号码中提取出生日期,并计算出用户从出生至今已经生存的小时数。这个过程涉及到JavaScript的基础语法、字符串操作、日期处理以及...

    GoLJS:Javascript 生命游戏

    "GoLJS:JavaScript 生命游戏"是一个基于JavaScript实现的经典计算机科学模拟游戏——康威的生命游戏(Conway's Game of Life)。这个项目旨在用JavaScript编程语言为用户呈现一个交互式的、实时渲染的生命游戏界面。...

    GameOfLife:生命游戏的javascript模拟

    这个模拟系统由二维网格上的细胞构成,每个细胞有生与死两种状态。游戏的规则基于细胞周围邻居的状态来决定其下一时刻的状态,这四个基本规则定义了生命游戏的全部逻辑: 1. **孤立**:如果一个细胞周围没有活细胞...

    java学生管理系统,带服务器(本地),写入到本地文件。

    Model层负责与服务器进行数据交互,View层负责界面展示,Controller层处理用户的输入并调用Model层的方法。此外,前端可能使用了HTML、CSS和JavaScript技术,通过AJAX实现页面无刷新的异步更新。 在实现过程中,...

    life-js:康威在 JavaScript 中的生命游戏

    康威的人生游戏生命游戏的宇宙是一个无限的二维正交方格网格,每个方格都处于两种可能的状态之一,生或死。 每个单元格与其八个相邻单元格相互作用,这些单元格是水平、垂直或对角相邻的单元格。 在时间的每一步,...

    用JavaScriptWebAssembly实现的Conway游戏呈现到画布上

    在这个项目中,JavaScript主要用于处理用户交互、更新游戏状态以及与WebAssembly模块通信。它提供了一个灵活的运行环境,能够动态地操作DOM(文档对象模型)和处理事件。 WebAssembly是一种低级字节码格式,设计...

    jsgol:Javascript 中的生命游戏

    在JavaScript环境中实现生命游戏,我们可以称之为“杰斯戈尔”,它提供了一个直观的平台,让任何人都可以轻松地观察和实验这种混沌与秩序并存的现象。 首先,让我们理解生命游戏的基本规则: 1. **出生**:如果一...

    gameoflife:生活游戏在javascript中的实现

    五、扩展与优化 1. 控制面板:添加用户界面,允许用户控制游戏速度,更改网格尺寸,甚至输入自定义初始状态。 2. 性能优化:对于大网格,可以考虑使用WebGL或Canvas进行渲染,以提高性能。 3. 复杂模式:探索不同...

    js-life:康威生命游戏的 JavaScript 实现

    JavaScript是一种广泛应用于Web开发的脚本语言,它在浏览器环境中运行,用于处理用户交互、操作DOM(文档对象模型)以及与服务器进行数据交换。在js-life项目中,JavaScript是实现游戏逻辑的主要工具。 2. **康威...

    gol.js:javascript中简单(未完成)的生活游戏

    标题“gol.js:javascript中简单(未完成)的生活游戏”指的是一个使用JavaScript编写的、基于康威生命游戏(Conway's Game of Life)的项目。康威生命游戏,通常简称为生命游戏,是由数学家约翰·康威在1970年提出的...

    学生宿舍管理系统

    《学生宿舍管理系统——基于ASP.NET技术的实现与详解》 学生宿舍管理系统是高校信息化建设的重要组成部分,它旨在提高宿舍管理的效率,优化资源配置,保障学生的生活秩序。本系统采用先进的ASP.NET技术进行开发,...

    gameOfLife:Conway的《人生游戏》的Javascript实现

    在这个游戏里,二维网格中的每个单元格(细胞)可以是生或死的状态,通过与周围细胞的相互作用来决定其下一代的状态。这种简单的设定却能够产生出令人惊叹的复杂模式。 在JavaScript中实现《生命游戏》通常涉及以下...

    game-of-life:用javascript实现的生命游戏,在画布上呈现世界的一部分

    《生命游戏:JavaScript实现的艺术与科学》 生命游戏,全称为康威生命游戏(Conway's Game of Life),是英国数学家约翰·何顿·康威于1970年提出的一种细胞自动机模型,它以简洁的规则揭示了复杂行为的涌现。在这...

    GameOfLife:我版的Conway的《人生游戏》。 我使用此练习来了解JavaScript和HTML5

    它允许开发者动态地更新内容、处理用户输入、创建动画效果以及与服务器进行交互。在《生命游戏》的实现中,JavaScript负责计算每个细胞的状态变化,根据细胞的邻居状态进行更新,并将结果展示在HTML5画布上。 HTML5...

    GameOfLife:Conway的《人生游戏》的简单Javascript实现

    在这个游戏中,二维平面上的每个格子代表一个细胞,根据一定的规则,细胞在下一代是生还是死。这个简单的系统能展现出极其复杂的动态行为,甚至可以模拟出计算能力。 在给定的项目"GameOfLife: Conway的《人生游戏...

    life-js:Conway的《人生游戏》JavaScript实现以及一些使用元胞自动机的实验

    3. **死亡**:其他情况下,无论是活细胞还是死细胞,都将变为死细胞。这包括活细胞周围的活细胞数量少于2个或多于3个的情况。 JavaScript代码会创建一个二维数组来表示细胞状态,然后根据上述规则进行迭代更新。...

    Art-website:使用HTML5 canvas元素的javascript中的粒子模拟

    JavaScript与canvas交互的核心是`CanvasRenderingContext2D`对象,它提供了各种绘图方法和属性。在这个粒子系统中,我们将用到`clearRect()`清除画布,`fillStyle`和`strokeStyle`设置填充和描边颜色,`save()`和`...

    game-of-life-js:约翰·康威(John Conway)的《人生游戏》JavaScript实现

    每个数组元素代表一个单元格,可以存储其状态(生或死)。然后,我们需要编写一个函数来计算每个单元格的新状态,这通常涉及到遍历整个网格并检查每个单元格的邻居数量。在康威的规则中,如果一个活细胞有2个或3个活...

    工程教育认证背景下的《网页设计与开发技术》课程考核方式改革.docx

    1. **考试形式单一**:传统的考核方式往往采用期末一次性笔试的形式,这种方式虽然能够检验学生对基础知识的掌握情况,但容易导致学生采取死记硬背的方式应对考试,忽略了对学生实际应用能力及创新能力的培养。...

    The-Race:进行中的Javascript游戏

    进行中的Javascript游戏 团队(DiJitech) ? 角色? DJ-团队负责人/游戏程序员Joe-市场营销主管-网站/游戏后端工程师? 陆克文-? Kiara-艺术 扩展文章/市场营销 沙门 布赖恩 比赛-玩家打开了另一个充满动作的无尽...

Global site tag (gtag.js) - Google Analytics