背景:JavaScript在工作中运用的非常广泛,作为一门弱类型语言,在使用JavaScript的时候,很多事情需要coder manual的去完成,这无疑增加了coder的工作量。

扩展:在这样的背景下,很多coder会将JavaScript一些需要自己manual去做的事情单独记录下来,以便在以后的工作中如果再遇到需要manual完成的工作可以轻松一些。

在工作中经常接触JavaScript,也就有了一些积累。就有了toutou.escort.js。即使她现在还不是很完善,也可能有很多问题无法解决。但是既然打算将她"造"出来,我就会在以后的工作 中不断的基类,让她不断的"丰满"起来。

v1.0 Summary

/**

* toutou.escort.js -- js扩展的插件,可以有效的提高js效率,解决js中遇到的某些疑难杂症[注1],为你的程序保驾护航。

*

* @version 1.0

* @author 头头哥

* @requires None

* @createDate 4/30/2014

* @modifyDate 4/30/2014

*

* 注1: 可解决的某些疑难杂症如下(包含如下但不局限于如下,更多疑难杂症需要你的奇思妙想)

* StringBuffer 高效率字符串拼接

* uniqueescort 数组去重用的原型扩展,可以直接使用

* 数组是否包含某一项

* 数组删除制定项

* isFilled/isEmpty字符串检测非空与空

* format 将指定的 String类型的数据中的每个格式项替换为相应对象的值的文本等效项。  类似C# string.format()

* 得到指定范围内的随机数

* 获取JSON的属性  js本身没有反射机制,所以需要自己手动获取

**/

v2.0 Details

2.1.0 StringBuffer

// 高效率字符串拼接

function StringBuffer()  {

this._strings_ =  new Array();

};

StringBuffer.prototype.append =  function  (str)  {

this._strings_.push(str);

};

StringBuffer.prototype.toString =  function  ()  {

return  this._strings_.join('');

};

/*Example:

* var buffer = new StringBuffer();

* buffer.append("hello ");

* buffer.append("world");

* var result = buffer.toString(); */

2.1.1 代码分析

ECMAScript 中最常见的一个问题是字符串连接的性能。与其他语言类似,ECMAScript 的字符串是不可变的,即它们的值不能改变。请考虑下面的代码:


var str = "hello ";
str += "world";

这段字符串拼接代码其实幕后执行的过程是这样的:

  1. 创建存储 "hello " 的字符串。
  2. 创建存储 "world" 的字符串。
  3. 创建存储连接结果的字符串。
  4. 把 str 的当前内容复制到结果中。
  5. 把 "world" 复制到结果中。
  6. 更新 str,使它指向结果。

每次完成字符串连接都会执行步骤 2 到 6,使得这种操作非常消耗资源。如果重复这一过程几百次,甚至几千次,就会造成性能问题。解决方法是用 Array 对象存储字符串,然后用 join() 方法(参数是空字符串)创建最后的字符串。

首先要注意的是 strings 属性,本意是私有属性。它只有两个方法,即 append() 和 toString() 方法。append() 方法有一个参数,它把该参数附加到字符串数组中,toString() 方法调用数组的 join 方法,返回真正连接成的字符串。

By the way: 以上部分解析来自书上,然后加了一些个人的理解把书上的内容简化了一部分。

2.2.0 uniqueescort

// 数组去重

Array.prototype.uniqueescort =  function  ()  {

this.sort();

var re =  [this[0]];

for  (var i =1; i <  this.length; i++)  {

if  (this[i]  !== re[re.length -1])  {

re.push(this[i]);

}

}

return re;

};

/*Example:

* var a=[1,1,2,3,3];

* a=a.uniqueescort(); */

2.2.1 代码分析

JS数组去重百度一下一大堆解决方案,关于JS数组去重也有很多方案

这里我采取的方案是先将源数组排序,然后先建一个空数组,再将空数组与源数组的item逐一比较。若不存在,则push

2.3.0 contains

// 数组是否包含某一项  如果引用了jQuery的话,可以考虑使用$.inArray("item", arr)方法

if  (typeof Array.prototype.contains !=="function")  {

Array.prototype.contains =  function  (item)  {

return  this.indexOf(item)  ==  -1?  false  :  true;

};

}

// 这里判断是否已经存在Array.contains()方法还可以使用 Array.prototype.contains = Array.prototype.contains || function(item) {...}; 看自己取舍吧。

/*Example:

* var a=[1,1,2,3,3];

* a=a.contains(3); true */

2.3.1 代码分析

if (typeof Array.prototype.contains !== "function") {这里之所以有这个判断,是为了防止用原型覆盖了其它引用JS已经存在的contains方法。

一般在用原型的时候,对于可能容易引起"撞衫"的函数名,最好加个这样的判断或者是将名字命的"个性"一点。当然也可以选择就用传统命名,然后原型之前判断一下。

2.4.0 remove

// 数组删除指定项

if  (typeof Array.prototype.remove !=="function")  {

Array.prototype.remove =  function  (item, isRemoveAll)  {

var index =  this.indexOf(item);

if  (index >  -1)  {

this.splice(index,1);

if  (isRemoveAll && index >  -1)  {

this.remove(item, isRemoveAll);

}

}

return  this;

};

}

2.4.1 代码分析

从2.4方法开始,对于比较显而易见的代码段将不再做代码分析,下同。

2.5 isFilled && isEmpty

// 字符串检测非空与空

String.prototype.isFilled =  function  ()  {

return  this  &&  this.length >0;

};

String.prototype.isEmpty =  function  ()  {

return  !this.IsFilled();

};

/*Example:

* var a="1"

* console.log(a.IsFilled());  result: true*/

2.6 format

// 类似C# string.format()

if  (typeof String.prototype.format !=="function")  {

String.prototype.format =  function  ()  {

var args = arguments;

return  this.replace(/{(\d+)}/g,  function  (match, number)  {

return  typeof args[number]  !='undefined'? args[number]  : match;

});

}

}

/*Example:

* var a="{0}的{1}说翻{2}翻"

* console.log(a.format('友谊','小船','就'));  result: 友谊的小船说翻就翻*/

2.7 randomize

// 得到指定范围内的随机数

function randomize(min, max)  {

return Math.floor(Math.random()  *  (max - min +1)  + min);

}

/*Example:

* var a=randomize(1,100);

* console.log(a);*/

2.8 GetProperties

// 获取JSON的属性

function GetProperties(json)  {

var properties =  [];

for  (var prop in json)  {

properties[properties.length]  = prop;

}

return properties;

}

/*Example:

var a = { 'id': '1', 'name': 'ming', 'info': 'like', 'pwd': '123', 'date': '4-20-2016' };

var aa = GetProperties(a);*/

v3.0 Summarize

在前言部分已经说了,这篇博文只是为了筹备toutou.escort.js这么一个开源工具,这里列举的一些
扩展方法或者类也只算是一个抛砖引玉吧。在以后的工作中,如果再有积累的东西,会继续更新到这篇博文,以及对应的更新toutou.escort.jsGithub。如果广大园友愿意给出平常自己积累的一些小扩展的东西,可以在下方评论或者私信我。

作  者:请叫我头头哥

出  处:http://www.cnblogs.com/toutou/

关于作者:专注于微软平台的项目开发。如有问题或建议,请多多赐教!

版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信

声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是作者坚持原创和持续写作的最大动力!

//

高效coder,筹备开源框架toutou.escort.js的更多相关文章

  1. [js高手之路]从零开始打造一个javascript开源框架gdom与插件开发免费视频教程连载中

    百度网盘下载地址:https://pan.baidu.com/s/1kULNXOF 优酷土豆观看地址:http://v.youku.com/v_show/id_XMzAwNTY2MTE0MA==.ht ...

  2. iOS超全开源框架、项目和学习资料汇总(5)AppleWatch、经典博客、三方开源总结篇

    完整项目 v2ex – v2ex 的客户端,新闻.论坛.apps-ios-wikipedia – apps-ios-wikipedia 客户端.jetstream-ios – 一款 Uber 的 MV ...

  3. Pyhton开源框架(加强版)

    info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...

  4. Python开源框架

    info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...

  5. 【转】iOS超全开源框架、项目和学习资料汇总

    iOS超全开源框架.项目和学习资料汇总(1)UI篇iOS超全开源框架.项目和学习资料汇总(2)动画篇iOS超全开源框架.项目和学习资料汇总(3)网络和Model篇iOS超全开源框架.项目和学习资料汇总 ...

  6. 值得学习的C/C++开源框架(转)

    值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的 ...

  7. .Net开源框架列表

    API 框架 NancyFx:轻量.用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台.官网 ASP.NET WebAPI:快捷创建 HTTP 服务 ...

  8. 值得推荐的C/C++开源框架和库

    值得推荐的C/C++开源框架和库  转自:http://www.cnblogs.com/lidabo/p/5514155.html   - 1. Webbench Webbench是一个在Linux下 ...

  9. C++的一些不错开源框架,可以学习和借鉴

    from https://www.cnblogs.com/charlesblc/p/5703557.html [本文系外部转贴,原文地址:http://coolshell.info/c/c++/201 ...

随机推荐

  1. EasyUI-扩大在DataGrid显示次网格的行

    一.下载并引用:datagrid-detailview.js脚本文件 二.添加UrlInfo控制器,添加Index页面代码如下: @{ Layout = null; } <!DOCTYPE ht ...

  2. 一种基于annotation的Spring-mvc权限控制方法

    简介 本文介绍一种采用annotation来对spring-mvc进行权限控制的方法. 通过枚举类来定义权限项. 将annotation标注到需要控制权限的spring-mvc方法上. 然后,在spr ...

  3. java1.8的默认方法的坑

    默认方法: 接口的方法一直都是抽象方法,自从1.8出来了之后,新增了一个默认方法.可以在接口中实现方法 1.默认方法需要用default修饰 2.默认方法不能是静态的 3.子接口继承了2个相同签名的默 ...

  4. 使用Sublime Text作为Markdown编辑器

    Sublime Text 3作为一个优秀的文本编辑器,拥有很多的扩展插件.我们可以利用这些插件为Sublime Text 增加扩展的功能,在这里我们借助两个插件来将Sublime Text 3变成一个 ...

  5. angular学习的一些小笔记(中)之双向数据绑定

    <!doctype html> <html ng-app=""> <head> <script src="https://aja ...

  6. C#如何在DataGridViewCell中自定义脚本编辑器

    上一篇博文探讨了如何自定义DataGridViewColumn实现一个TreeViewColumn来在DataGridView控件中显示TreeView控件,其实我们还可以继续发挥想象,自定义其他的列 ...

  7. Strip JS – 低侵入,响应式的 Lightbox 效果

    Strip  是一个灯箱效果插件,显示的时候只会覆盖部分的页面,这使得侵扰程度较低,并留出了空间与页面上的大屏幕,同时给予小型移动设备上的经典灯箱体验.Strp JS 基于 jQuery 库实现,支持 ...

  8. 10个最好的 JavaScript 动画库和开发框架

    虽然 CSS3 动画功能能够让我们以简单轻松的方式实现动画效果,但是浏览器兼容性问题让人头疼.不过不用担心,我们还有另外的武器——JavaScript,它同样可以帮助你实现各种各样的动画效果,而且借助 ...

  9. Skytte:一款令人印象深刻的 HTML5 射击游戏

    Skytte 是一款浏览器里的 2D 射击游戏.使用 Canvas 元素和大量的 JavaScript 代码实现.Skytte 是用我们的开源和现代的前端技术创造的.经典,快节奏的横向滚动射击游戏,探 ...

  10. 在你设计中可能用到的20个杂志 PSD 原型

    你是否正在为您的印刷产品找一些现成的原型素材?在这里,我们收集了一组免费的杂志 PSD 素材,必将派上用场.这些原型将给你和你的客户一个先睹为快的产品,在现实生活中看起来如何.所有这些原型提供了可以免 ...