JavaScript for: i++ vs i–

JavaScript 循环中,i++ 与 i– 那个比较快?相信有不少朋友看过相关的讨论文章,比如这篇。文章解释了开启优化选项后,i– 的 Java 代码节省了 1 条指令,从而可以运行得更快。那么,JavaScript 上运用 i– 是否有同样的表现呢?

这里试图从语言层面分析造成差异的原因,并展示不同 JavaScript 运行环境产生的差异。

7 continue reading

讨论闭包传入参数:window & undefined

引言

最常见的闭包 (Closure) 范式大家都很熟悉了:

(function() {
// ...
})();

很简单,大家都在用。但是,我们需要了解更多。
首先,闭包是一个匿名函数 (Anonymous function), 即是 (function() {}) 这部分。之所以要给 function 添加括弧是为了让它形成一个表达式 (expression), 有了表达式,并且确定它的类型是个函数 (Function 实例), 就可以直接调用它。所以,后面的一对括弧是可以工作的,它的意义是:我要调用 (call) 这个函数。

既然是函数调用,那就可以像一般的函数那样,在调用时传入参数。这就是本次讨论的话题。

..

17 continue reading

响应浏览器地址栏#(hash/fragment)变化

Gmail 作为一个经典的 Web 2.0 应用,在带来革命性的邮件管理体验的同时,以其完整、快速的 AJAX 操作方式,深受用户的推崇和技术人员的追捧。

技术上,Gmail 通过将用户的操作以 #op1/op2 这样的形式(即 hash 或 fragment, 这里称之为 hash)反映在浏览器地址栏,最后得到一个类似这样的 URL: https://mail.google.com/mail/#inbox. 它还允许用户直接粘贴这样的地址到达相同的操作界面,并可以通过浏览器的前进/后退按钮在操作步骤之间跳转。

也想尝试一下?先分析一下,通过获取 hash 的值,执行一些操作,即可恢复到该值表示的场景——非常简单。但是,要处理浏览器前进/后退按钮,跳转到相应场景,则有一定困难。因为浏览器不会告诉你 hash 发生变化了。因此,需要实现一个 JavaScript 浏览器导航按钮处理模块。

网上有些代码实现了类似功能,大多感觉冗长复杂。这里,我们介绍支付宝实际应用中开发的一段代码,它的功能简单实用——允许用户指定 hash 发生变化时要做的事情(回调),也可以随时停止它。简单地说,这个代码的原理是,每隔一段时间检查 hash 有没有发生变化,如果有,就运行用户指定的回调方法。代码如下: ..

5 continue reading

Javascript正则表达式基础

RegExp对象的语义和使用:

  • 检查字符串匹配
  • 获取字符串中的部分内容
  • 在原字符串的基础上构建一个新的字符串(包括添加、删除和修改)

构建一个RegExp对象主要有两种方法:

  • 使用literal,如/\w/g
  • 使用构造函数,如 new RegExp(/\w/)

构建RegExp对象有以下几个注意点:

  • literal常用来构建非runtime产生的静态的RegExp对象
  • literal之后可以直接添加flag用来对匹配字符串的执行结果进行限制,常用flag包括g和i,分别用来表示全局匹配(global)和忽略大小写匹配(case-insensitive)
  • RegExp构造函数的第一个参数提供该对象的pattern,如果pattern是一个RegExp literal,那么就不能提供第二个参数(即指定flag)。如果pattern是一个string,那么可以使用第二个参数
  • RegExp构造函数常用于构建runtime产生的动态RegExp对象
  • RegExp的pattern为string时所有literal中的”\”都必须写成”\\”,因为”\”在string中需要被转义
  • 以上两种方法构建的都一个javascript对象,因此/\w/ == /\w/返回false

..

6 continue reading