高效coder,筹备开源框架toutou.escort.js
背景: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";
这段字符串拼接代码其实幕后执行的过程是这样的:
- 创建存储 "hello " 的字符串。
- 创建存储 "world" 的字符串。
- 创建存储连接结果的字符串。
- 把 str 的当前内容复制到结果中。
- 把 "world" 复制到结果中。
- 更新 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.js的Github。如果广大园友愿意给出平常自己积累的一些小扩展的东西,可以在下方评论或者私信我。
作 者:请叫我头头哥
出 处:http://www.cnblogs.com/toutou/
关于作者:专注于微软平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
//
高效coder,筹备开源框架toutou.escort.js的更多相关文章
- [js高手之路]从零开始打造一个javascript开源框架gdom与插件开发免费视频教程连载中
百度网盘下载地址:https://pan.baidu.com/s/1kULNXOF 优酷土豆观看地址:http://v.youku.com/v_show/id_XMzAwNTY2MTE0MA==.ht ...
- iOS超全开源框架、项目和学习资料汇总(5)AppleWatch、经典博客、三方开源总结篇
完整项目 v2ex – v2ex 的客户端,新闻.论坛.apps-ios-wikipedia – apps-ios-wikipedia 客户端.jetstream-ios – 一款 Uber 的 MV ...
- Pyhton开源框架(加强版)
info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...
- Python开源框架
info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...
- 【转】iOS超全开源框架、项目和学习资料汇总
iOS超全开源框架.项目和学习资料汇总(1)UI篇iOS超全开源框架.项目和学习资料汇总(2)动画篇iOS超全开源框架.项目和学习资料汇总(3)网络和Model篇iOS超全开源框架.项目和学习资料汇总 ...
- 值得学习的C/C++开源框架(转)
值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的 ...
- .Net开源框架列表
API 框架 NancyFx:轻量.用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台.官网 ASP.NET WebAPI:快捷创建 HTTP 服务 ...
- 值得推荐的C/C++开源框架和库
值得推荐的C/C++开源框架和库 转自:http://www.cnblogs.com/lidabo/p/5514155.html - 1. Webbench Webbench是一个在Linux下 ...
- C++的一些不错开源框架,可以学习和借鉴
from https://www.cnblogs.com/charlesblc/p/5703557.html [本文系外部转贴,原文地址:http://coolshell.info/c/c++/201 ...
随机推荐
- PHP storm快捷键
左边文件路径看不到了,按alt+1就出来了 ctrl+j 插入活动代码提示 ctrl+alt+t 当前位置插入环绕代码 alt+insert 生成代码菜单 ctrl+q 查看代码注释 ctrl+d 复 ...
- C#语言的基础
一.C#的引入 01..net和C#的区别 1)大概在2000年,微软推出了一种革命性的产品--.NET(战略) 目标:任何人,在任何地方,使用任何终端设备,都可以访问微软提供的服务. 2).net ...
- 20款高质量的 HTML5 网站模板【免费下载】
下面的列表集合了20款高质量的免费 HTML5 网站模板,这些专业的模板能够让你的网站吸引很多的访客.这些免费的 HTML5 模板虽然不是响应式的,不过都很实用.赶紧来看看. 您可能感兴趣的相关文章 ...
- 经典网页设计:20个华丽的 iPhone 应用程序演示网站
一个物品销售很好,重要的原因之一是它的包装,因为这是最重要的细节,可以把一个人转变成购买者.一个好的包装设计和良好的表现比产品本身更重要,因此被分配了大量的金钱和资源,以创造伟大的东西. 因此,为了销 ...
- go语言 类型:基础类型和复合类型
Go 语言中包括以下内置基础类型:布尔型:bool整型:int int64 int32 int16 int8 uint8(byte) uint16 uint32 uint64 uint浮点型:floa ...
- jQuery原型方法.pushStack源码分析
这次分析的方法跟前面不同,虽然pushStack也是原型方法之一,但是我们几乎从不用在页面调用,在参考手册里面也没有这个方法的使用说明,但是这个方法还是非常重要的,在使用很多jQuery的其他方式都会 ...
- SVN源码泄露漏洞
SVN(subversion)是源代码版本管理软件,造成SVN源代码漏洞的主要原因是管理员操作不规范.“在使用SVN管理本地代码过程中,会自动生成一个名为.svn的隐藏文件夹,其中包含重要的源代码信息 ...
- 关于asp.net impersonation的一些谣传
以下皆是理论知识,未经证实. system.web下面的配置节 <identity impersonate="true" /> 或者<identity imper ...
- ASP和ASP.NET发送邮件笔记
这两天因公司网站邮件发不出去,然后研究了在asp网站发送邮件和在asp.net网站发送邮件的代码,把碰到的问题这里记录一下. 1.先说在asp.net中发送邮件吧, 刚开始只有126邮箱可以发出邮件, ...
- iOS小型计算器
// // ViewController.m // 计算器 //屏幕的宽和高 #define SCREEN_W self.view.frame.size.width #define SCREEN_ ...