详解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 相关文章推荐
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
Feb 05 Javascript
jQuery购物网页经典制作案例
Aug 19 Javascript
AngularJS入门教程之MVC架构实例分析
Nov 01 Javascript
微信小程序商城项目之淘宝分类入口(2)
Apr 17 Javascript
解决Vue2.0自带浏览器里无法打开的原因(兼容处理)
Jul 28 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
Mar 28 jQuery
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
Aug 03 Javascript
深入浅析nuxt.js基于ssh的vue通用框架
May 21 Javascript
JAVA面试题 static关键字详解
Jul 16 Javascript
js实现掷骰子小游戏
Oct 24 Javascript
vue.js实现照片放大功能
Jun 23 Javascript
Vue常用API、高级API的相关总结
Feb 02 Vue.js
详解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
星际争霸 Starcraft 编年史
2020/03/14 星际争霸
Javascript与PHP验证用户输入URL地址是否正确
2014/10/09 PHP
简述php环境搭建与配置
2016/12/05 PHP
Python中使用django form表单验证的方法
2017/01/16 PHP
jQuery操作input type=radio的实现代码
2012/06/14 Javascript
通过Javascript创建一个选择文件的对话框代码
2012/06/16 Javascript
jQuery.position()方法获取不到值的安全替换方法
2015/03/13 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
2015/08/24 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
AngularJS模板加载用法详解
2016/11/04 Javascript
Bootstrap导航条学习使用(二)
2017/02/08 Javascript
使用JavaScript实现alert的实例代码
2017/07/06 Javascript
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
[01:20:47]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第一场 1月19日
2021/03/11 DOTA
Python3中常用的处理时间和实现定时任务的方法的介绍
2015/04/07 Python
python实现猜单词小游戏
2020/05/22 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
对python requests的content和text方法的区别详解
2018/10/11 Python
Python二维码生成识别实例详解
2019/07/16 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
HTML5页面直接调用百度地图API获取当前位置直接导航目的地的实现代码
2018/03/02 HTML / CSS
萌新的HTML5 入门指南
2020/11/06 HTML / CSS
酒店开业庆典主持词
2014/03/21 职场文书
学校党委干部个人对照检查材料思想汇报
2014/10/09 职场文书
2014年人事专员工作总结
2014/11/19 职场文书
鲁迅故里导游词
2015/02/05 职场文书
辞职信如何写
2015/02/27 职场文书
廉政承诺书范文
2015/04/28 职场文书
网络舆情信息简报
2015/07/21 职场文书
选对餐饮营销策略,营业额才会上涨
2019/08/27 职场文书
OpenCV-Python使用cv2实现傅里叶变换
2021/06/09 Python
gateway网关接口请求的校验方式
2021/07/15 Java/Android
table设置超出部分隐藏,鼠标移上去显示全部内容的方法
2022/12/24 HTML / CSS