再论JavaScript下字符串连接的性能

前端开发  |  14年前

这是个老话题了,之所以再拿出来说,是因为浏览器一直在进步,以前最好的方法现在不一定是最好的。

1 如何进行字符串连接?

首先让我们来回顾一下字符串连接的两种常用方法:

1.1 使用字符串连接运算符

常用的语言(如Java、C#、PHP等)都有字符串连接运算符,JavaScript也不例外,代码示例:

var str = "";
str = str + "a";

1.2 使用数组

在常用的语言中,字符串连接运算的性能普遍不高,为此在C#中就专门提供了StringBuilder(Java中提供了StringBuffer)用于连接字符串。而在JavaScript中就出现了通过Array模拟StringBuilder的方案

var str = [];
for (var i = 0; i < 100; i++) {
  str[i] = "12345";
}
str = str.join("");
3904次阅读,6条评论

淘宝搜索框研究报告

前端开发  |  14年前

在输入框里面预设一段提示文字,当焦点在输入框的时候清空这段文字,这在目前来说已经不是什么新鲜事了。淘宝的搜索框就用到了这样一种设计:

淘宝搜索框

这种设计一般是用javascript监控了输入框的focus和blur事件:

<input type="text" id="q" value="请输入关键字" />
<script type="text/javascript">//<![CDATA[
$("#q").onfocus = function() {
  if ("请输入关键字" == this.value) {
    this.value = "";
  }
};
$("#q").onblur = function() {
  if ("" == this.value) {
    this.value = "请输入关键字";
  }
};
//]]></script>

这段代码有两个很明显的缺点:

  1. “请输入关键字”这段提示共出现了3次,一旦要改这段文字就得改3个地方,维护显得非常不便
  2. 为了性能优化,我们会把javascript部分放到页面末尾。然而,像门户网站首页这种代码量很大的页面,末尾的javascript很可能会延时1-2秒执行。在这段时间内,即使焦点在输入框内,提示文字也不会消失,用户需要手动删除这段文字再输入内容
1747次阅读,2条评论

使用泛型打造Request工具类

其他开发  |  14年前

在ASP.NET页面中可以使用Request对象获取指定参数的值,例如:

string value = Request["id"];

参数值都是string类型,但是进行处理的时候可能要转换成数字、日期等类型。

string value = Request["id"];
int id = Int32.Parse(value);

实际应用的时候还要考虑异常的情况。

string value = Request["id"];
int id;
Int32.TryParse(value, out id);

如果每个页面都这么写,显得非常麻烦,代码重复也很严重,还是封装成一个工具类吧。

public class ReqHelper
{
	public static string GetString(string paramName) { ... }
	public static int GetInt(string paramName) { ... }
	public static bool GetBool(string paramName) { ... }
	...
}
1405次阅读,1条评论

发现搜搜两个有趣的应用

工作生活  |  14年前

今天在cnbeta的一篇文章《搜搜舞文弄墨上线,会打字就会作诗》中发现了SOSO的一个有趣应用,名为“舞文弄墨”。这个搜索引擎可以方便地搜出藏头诗。

搜索“万剑归宗”

“万剑归宗”藏头诗

顺藤摸瓜,在搜搜实验室又发现了另一个有趣的“名字印象”,输入名字后可以看到该名字的印象分,当然这个分数仅供娱乐,千万别当真,倒是给小孩起名字的时候可以参考参考。

“郭靖”印象分

891次阅读,2条评论

游西湖

工作生活  |  14年前

上周六在杭州参加了D2交流会,由于回程时间是周日下午,所以趁着周日早上有时间就去了逛西湖。

先是打车到了雷峰塔,在外面观摩了一番。

雷峰塔

接着就往西湖的方向走,途中到了一处有很多船的地方,其中最大的是一艘“龙船”。

“龙船”

1079次阅读,1条评论

第四届D2报道

前端开发  |  14年前

本届D2在阿里巴巴一个报告厅内举行,该报告厅内有3个投影屏,确保各个位置的观众都可以看到演示内容。悲剧的是,报告厅内的空调(暖气)坏了,所以室内温度也很低,一天下来膝盖以下都是冷的。

阿里巴巴正门

九点多,会议正式开始,老男致开幕词。同时,前方左侧的小屏幕上也开始直播人间网上的D2讨论。这对我来说是一种很新鲜的讨论方式,好比上面在开大会,下面在开小会,但是小会并没有影响会进行,反而使大会的气氛更加活跃。

人间网D2讨论

1158次阅读,7条评论

parseInt的陷阱

前端开发  |  14年前
var a = parseInt("09"), b = Number("09");

很多人会认为a和b的值都是数字9,但实际上不是。

parseInt的主要作用是把字符串转换为整数,或者把小数转换为整数。一般情况下,我们只用到它的第一个参数。但实际上,它有两个参数:

parseInt(string, radix)

parseInt会根据radix指定的进制进行转换,比如:

alert(parseInt("10", 2)); // outputs '2'

在没有指定radix或者radix为0的情况下,parseInt会按十进制进行转换。然而,这在某些情况下有点特殊:

  • 如果string的值以“0x”开头,parseInt会按十六进制进行转换;
  • 如果string的值以“0”开头,parseInt会按八进制进行转换。

说回开头的代码,由于"09"是以“0”开头,所以parseInt会按八进制进行转换,但是“9”不是合法的八进制值(八进制只有0-7八个数字),所以转换结果是0。

要避免这个陷进,可以强制指定radix:

alert(parseInt("09", 10)); // outputs '9'

 

1009次阅读,1条评论

事件监听兼容处理

前端开发  |  14年前

在事件监听处理方面,IE提供了attachEventdetachEvent两个接口,而Firefox提供的是addEventListenerremoveEventListener。最简单的兼容性处理就是封装这两套接口:

function addEvent(elem, eventName, handler) {
  if (elem.attachEvent) {
    elem.attachEvent("on" + eventName, handler);
  } else if (elem.addEventListener) {
    elem.addEventListener(eventName, handler, false);
  }
}

function removeEvent(elem, eventName, handler) {
  if (elem.detachEvent) {
    elem.detachEvent("on" + eventName, handler);
  } else if (elem.removeEventListener) {
    elem.removeEventListener(eventName, handler, false);
  }
}
1234次阅读,0条评论

EditPlus配置手记

其他开发  |  14年前

最近打算换主IDE,主要原因是现在用的Dreamweaver太慢太占资源,特别是打开大文件的时候。而代替者就是EditPlus。下面简单记录一下如何把EditPlus配置成一个编程IDE。

首选项

无论是什么软件,一般都要先改全局设置,也就是首选项。

常规

常规

  • 还原最近文件的光标/标记/编码方式:这个一定要勾上,否则就不能保存代码折叠
  • 使用XHTML标签:标准化网页。
  • 自动关闭HTML标签:勾上这个以后,输入“<”后就会自动补全“>”,光标在两个字符之间。
7611次阅读,7条评论

IIS 7.5 下PHP(FastCGI模式)配置手记

其他开发  |  14年前

自从有了FastCGI,IIS支持PHP变得非常简单。

版本选择

先到官网下载PHP 5.6,可以发现有4个版本:

  • VC11 x86 Non Thread Safe
  • VC11 x86 Thread Safe
  • VC11 x64 Non Thread Safe
  • VC11 x64 Thread Safe

官网已经注明,x64版本是实验性质的,所以还是用x86版吧。至于Thead Safe(线程安全)/Non Thead Safe(非线程安全),官网并没有说明各自用途何在。Google了一番以后,我找到了答案:FastCGI是单线程执行的,因而不需要线程安全版本,去掉线程安全的防护后可以提高执行效率;而ISAPI方式则是多线程模式,所以需要采用线程安全版本。综上所述,我们应下载 VC11 x86 Non Thread Safe 这个版本。

注意,这四个版本都是通过Visual Studio 2012编译器编译的,所以要先安装Visual C++ Redistributable for Visual Studio 2012,否则无法运行。此外,由于我们选用的是x86的php,所以Visual C++ Redistributable for Visual Studio 2012也要对应地安装x86版,千万不要因为系统是64位的就装了x64版。

5554次阅读,0条评论