详解JavaScript的另类写法


Posted in Javascript onApril 11, 2016

JavaScript 是属于网络的脚本语言!

JavaScript 被数百万计的网页用来改进设计、验证表单、检测浏览器、创建cookies,以及更多的应用。

JavaScript 是因特网上最流行的脚本语言。

JavaScript 很容易使用!你一定会喜欢它的!

JavaScript一种解释型的脚本语言,语法灵活,让不同的人对同一个功能有很多种不同的写法。怎样组织JavaScript代码才能让别人一眼看出你不简单呢?是否很期待别人在看完你的代码之后感叹一句“原来还可以这样写”呢?

匿名函数的N种写法

Js的匿名函数是未申明函数名的自执行函数,格式如下:

(function(){})();

实际在项目上我们经常是在前面加上“;”:

;function(){}();

因为Js的语法是可以省略分号的,但是这种机制也会导致意外的错误。为了避免代码上线后合并压缩成一个文件造成语法错误,所以加上“;”可以避免未知错误。

但有时我们看见别人的库或是插件里面会这样写匿名函数:

+function(){}();

“+”在这里是运算符,运算符具有极高的优先级,所以右边的函数声明加上括号的部分(实际上就是函数执行的写法)就直接执行了。其实不止前面可以是“+”号,“-”、“!”、“~”、“++”等运算符均可。这里只是做扩展介绍,具体用哪种写法看团队统一规范。

抛弃Math.ceil()和Math.floor取整

也许在别的代码中看到过这两种符号~~和|0,直接看运行结果:

>> var a1 = 1.23
>> ~~a1
1
>> var a2 = 2.345
>> a2|0
2
>> var a3 = -3.45
>> ~~a3
-3
>> var a4 = -4.5
>> a4|0
-4

注明下,这种写法不是原创,只是引用过来分析和说明下这种另类的写法。简单解释,~是按位取反的运算符,可以将浮点数通过舍去小数点后面的所有位来转换为整数。正整数可转换为无符号的十六进制值。然后再取反一次(~~)负负得正,就得到原来的整数。就是这么任性不爱调方法,你说算不算也是一种优化呢。

注意:如果需要做严格的四舍五入运算就要慎用此方法,那就还是得用Math函数。

if和else也不是唯一

用if-else的条件判断是很清晰的逻辑,在处理数据量不大情况下看起就不是很简洁:

if (a===1) { //此处强烈建议用严格等于符号“===”,不会进行类型转换
a=2
} else if (a===3) {
a=4
} else {
a=5
}

看看用||和&&给代码瘦身后:

((a===1)&&(true,a=2))||((a===3)&&(true,a=4))||(a=5)

一行就搞定,瘦身成功。||和&&,很简单的原理就不用说啦,里面用到逗号运算符还不容易理解,可以继续换成三元运算符:

(a===1 )? a=2:( (a===3) ? (a=4) : (a=5) )

这种写法看起来结构是够简化,但是别人看你的代码会有点吃力。

用toString替代烦人的字符串拼接DOM结构

如果要动态生成一个dom结构一般我们是这样实现的 :

var template = "<div>" 
+ "<h2>{title}</h2>"
+ "<div class='content' yAttr=''>{content}</div>"
+ "</div>"

如果再添加各种属性和参数进去,大、小引号混乱很容易报错。然而ES6提供了Template String帮我们解决了这个问题,你可以这样写:

var template = <div> 
<h2>{title}</h2> 
<div class='content' yAttr=''>{content}</div> 
</div>

 可问题是ES6现在还未正式来啊…不怕,function.toString来解决我们青黄不接时的尴尬:

var rComment = /\/\*([\s\S]*?)\*\//;
// multiply string 
function ms(fn){ 
return fn.toString().match(rComment)[1]
}; 
ms(function(){/* 
<div> 
<h2>{title}</h2> 
<div class='content' yAttr=''>{content}</div> 
</div> */
})

这里的输出和前面的字符串输出一样一样滴,前端程序猿们只需要关注自己的dom结构就好了。

添加AMD模块支持,提示代码B格

给你写的代码声明一下AMD(异步模块定义,Asynchronous Module Definition)模块规范,这样别人就可以直接通过AMD的规范来加载你的模块了,如果别人没有通过规范来加载你的模块,你也可以优雅地返回一个常规的全局对象。来看看jQueryUI的写法:

(function( factory ) { 
if ( typeof define === "function" && define.amd ) { 
// AMD模式。且依赖"jQuery"这个插件 
define( [ "jquery" ], factory ); } 
else { 
// 浏览器全局模式 
factory( jQuery ); 
} 
}(function( $ ) { 
// 这里放模块代码 
return $.widget; 
}));

改成AMD模块的结构,让你的代码更适于浏览器端加载脚本依赖,按照这种格式来写代码,保证别人一看代码就知道你是个专业的开发者。

继承最优法

JavaScript的灵活性,大大小小的继承方式有十余种之多。每种写法优缺点各异,各家方法不一一列举,举个常用的继承方法为例,原型继承:

function Parent() {}
function Child() {}
Child.prototype = Parent.prototype
Child.prototype.constructor = Child ;

这种这种方法实际上是将Child.prototype和Parent.prototype中保存的指针指向了同一个对象,所以子对象原型中扩展一些属性以便之后继续继承的话,父对象的原型也会被改写。所以为了解决这个问题,尝试借用一个临时构造器的写法:

function Empty(){}
Empty.prototype = Parent.prototype;
Child.prototype = new Empty();
Child.prototype.constructor = Child;

这样父对象的自身属性和原型方法得到保护。“最优”有点夸大,但是是相比较而言的。相信每个人都有自己的写法,还有借用call和apply实现属性继承的优缺点,篇幅有限不一一介绍。

总结

上述所有的JavaScript的另类写法,一些是为了程序易懂或者效率提高的语法糖,这样的做法是比较可取的,比如前面所说的省略if-else的做法。一些是为了提升我们代码的兼容性和性能,比如AMD和继承的方式。……本人菜鸟一枚,上述内容肯定还有不全和没解释透彻的地方以后再补充。

以上内容是针对JavaScript的另类写法的相关介绍,希望对大家有所帮助!

Javascript 相关文章推荐
JavaScript For Beginners(转载)
Jan 05 Javascript
JS中confirm,alert,prompt函数使用区别分析
Apr 01 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
Apr 01 Javascript
js封装可使用的构造函数继承用法分析
Jan 28 Javascript
javascript中setInterval的用法
Jul 19 Javascript
jquery+php实现滚动的数字特效
Nov 29 Javascript
理解Javascript文件动态加载
Jan 29 Javascript
JavaScript 函数节流详解及方法总结
Feb 09 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
May 18 Javascript
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
Aug 17 Javascript
Javascript组合继承方法代码实例解析
Apr 02 Javascript
微信小程序实现日历小功能
Nov 18 Javascript
详解jQuery中的empty、remove和detach
Apr 11 #Javascript
JQuery导航菜单选择特效
Apr 11 #Javascript
JavaScript实现图片自动加载的瀑布流效果
Apr 11 #Javascript
javascript冒泡排序小结
Apr 10 #Javascript
javascript原生ajax写法分享
Apr 10 #Javascript
Javascript实现苹果悬浮虚拟按钮
Apr 10 #Javascript
jQuery实现点击水纹波动动画
Apr 10 #Javascript
You might like
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
社区(php&amp;&amp;mysql)四
2006/10/09 PHP
js中将多个语句写成一个语句的两种方法小结
2007/12/08 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
基于PHP+Jquery制作的可编辑的表格的代码
2011/04/10 Javascript
5分钟理解JavaScript中this用法分享
2013/11/09 Javascript
js post提交调用方法
2014/02/12 Javascript
JavaScript中数据结构与算法(四):串(BF)
2015/06/19 Javascript
详解vue 中使用 AJAX获取数据的方法
2017/01/18 Javascript
js Date()日期函数浏览器兼容问题解决方法
2017/09/12 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
还不懂递归?读完这篇文章保证你会懂
2018/07/29 Javascript
JavaScript实现随机点名程序
2020/03/25 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
[05:29]2014DOTA2国际邀请赛 赛后专访:LGDNewbee顺利过关
2014/07/13 DOTA
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
python中对list去重的多种方法
2014/09/18 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
python TK库简单应用(实时显示子进程输出)
2019/10/29 Python
python中的逆序遍历实例
2019/12/25 Python
CSS3实现自定义Checkbox特效实例代码
2017/04/24 HTML / CSS
HTML5 CSS3新的WEB标准和浏览器支持
2009/07/16 HTML / CSS
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
餐饮商业计划书范文
2014/04/29 职场文书
区域销售主管岗位职责
2014/06/15 职场文书
结对共建协议书
2014/08/20 职场文书
个人合伙协议书范本
2014/10/14 职场文书
装修公司工程部经理岗位职责
2015/04/09 职场文书
学校党支部承诺书
2015/04/30 职场文书
大学生志愿者心得体会
2016/01/15 职场文书
创业计划书之网络外卖
2019/10/31 职场文书
MySQL 数据丢失排查案例
2021/05/08 MySQL
python用海龟绘图写贪吃蛇游戏
2021/06/18 Python
《群青的幻想曲》京力秋树角色PV公开
2022/04/08 日漫
vue3语法糖内的defineProps及defineEmits
2022/04/14 Vue.js