12种不宜使用的Javascript语法整理


Posted in Javascript onNovember 04, 2013

1.==
Javascript有两组相等运算符,一组是==和!=,另一组是===和!==。前者只比较值的相等,后者除了值以外,还比较类型是否相同。
请尽量不要使用前一组,永远只使用===和!==。因为==默认会进行类型转换,规则十分难记。如果你不相信的话,请回答下面五个判断式的值是true还是false:

false == 'false'

false == undefined

false == null

null == undefined

0 == ''
前三个是false,后两个是true。

2.with
with的本意是减少键盘输入。比如

obj.a = obj.b;

obj.c = obj.d;
可以简写成

with(obj) { 


a = b; 


c = d; 

}

但是,在实际运行时,解释器会首先判断obj.b和obj.d是否存在,如果不存在的话,再判断全局变量b和d是否存在。这样就导致了低效率,而且可能会导致意外,因此最好不要使用with语句。

3.eval
eval用来直接执行一个字符串。这条语句也是不应该使用的,因为它有性能和安全性的问题,并且使得代码更难阅读。
eval能够做到的事情,不用它也能做到。比如

eval("myValue = myObject." + myKey + ";");
可以直接写成

myValue = myObject[myKey];
至于ajax操作返回的json字符串,可以使用官方网站提供的解析器json_parse.js运行。

4.continue
这条命令的作用是返回到循环的头部,但是循环本来就会返回到头部。所以通过适当的构造,完全可以避免使用这条命令,使得效率得到改善。

5.switch 贯穿
switch结构中的case语句,默认是顺序执行,除非遇到break,return和throw。有的程序员喜欢利用这个特点,比如

switch(n) { 


case 1: 


case 2: 



break; 

}

这样写容易出错,而且难以发现。因此建议避免switch贯穿,凡是有case的地方,一律加上break。
switch(n) { 


case 1: 



break; 


case 2: 



break; 

}

6.单行的块结构
if、while、do和for,都是块结构语句,但是也可以接受单行命令。比如

if (ok) t = true;
甚至写成

if (ok)

t = true;
这样不利于阅读代码,而且将来添加语句时非常容易出错。建议不管是否只有一行命令,都一律加上大括号。

if (ok){

t = true;

}

7.++和--
递增运算符++和递减运算符--,直接来自C语言,表面上可以让代码变得很紧凑,但是实际上会让代码看上去更复杂和更晦涩。因此为了代码的整洁性和易读性,不用为好。

8.位运算符
Javascript完全套用了Java的位运算符,包括按位与&、按位或|、按位异或^、按位非~、左移<<、带符号的右移>>和用0补足的右移>>>。
这套运算符针对的是整数,所以对Javascript完全无用,因为Javascript内部,所有数字都保存为双精度浮点数。如果使用它们的话,Javascript不得不将运算数先转为整数,然后再进行运算,这样就降低了速度。而且“按位与运算符”&同“逻辑与运算符”&&,很容易混淆。

9.function语句
在Javascript中定义一个函数,有两种写法:

function foo() { }

var foo = function () { }
两种写法完全等价。但是在解析的时候,前一种写法会被解析器自动提升到代码的头部,因此违背了函数应该先定义后使用的要求,所以建议定义函数时,全部采用后一种写法。

10.基本数据类型的包装对象
Javascript的基本数据类型包括字符串、数字、布尔值,它们都有对应的包装对象String、Number和Boolean。所以,有人会这样定义相关值:

new String("Hello World"); 

new Number(2000); 

new Boolean(false);

这样写完全没有必要,而且非常费解,因此建议不要使用。
另外,new Object和new Array也不建议使用,可以用{}和[]代替。

11.new语句
Javascript是世界上第一个被大量使用的支持Lambda函数的语言,本质上属于与Lisp同类的函数式编程语言。但是当前世界,90%以上的程序员都是使用面向对象编程。为了靠近主流,Javascript做出了妥协,采纳了类的概念,允许根据类生成对象。
类是这样定义的:

var Cat = function (name) { 


this.name = name; 


this.saying = 'meow' ; 

}

然后,再生成一个对象

var myCat = new Cat('mimi');
这种利用函数生成类、利用new生成对象的语法,其实非常奇怪,一点都不符合直觉。而且,使用的时候,很容易忘记加上new,就会变成执行函数,然后莫名其妙多出几个全局变量。所以,建议不要这样创建对象,而采用一种变通方法。
Douglas Crockford给出了一个函数:

Object.beget = function (o) { 


var F = function (o) {}; 


F.prototype = o ; 


return new F; 

};

创建对象时就利用这个函数,对原型对象进行操作:
var Cat = { 


name:'', 


saying:'meow' 

}; 

var myCat = Object.beget(Cat);

对象生成后,可以自行对相关属性进行赋值:

myCat.name = 'mimi';

12.void
在大多数语言中,void都是一种类型,表示没有值。但是在Javascript中,void是一个运算符,接受一个运算数,并返回undefined。

void 0; // undefined
这个命令没什么用,而且很令人困惑,建议避免使用。

Javascript 相关文章推荐
JavaScript TO HTML 转换
Jun 26 Javascript
百度 popup.js 完美修正版非常的不错 脚本之家推荐
Apr 17 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
Jun 21 Javascript
jquery动态加载js/css文件方法(自写小函数)
Oct 11 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 Javascript
js实现使用鼠标拖拽切换图片的方法
May 04 Javascript
深入理解jquery自定义动画animate()
May 24 Javascript
BootStrapTable服务器分页实例解析
Dec 20 Javascript
Vue数据驱动模拟实现5
Jan 13 Javascript
JS中mouseup事件丢失的原因与解决办法
Jun 14 Javascript
vue 自定义提示框(Toast)组件的实现代码
Aug 17 Javascript
vue3为什么要用proxy替代defineProperty
Oct 19 Javascript
jquery $.fn $.fx是什么意思有什么用
Nov 04 #Javascript
cookie的复制与使用记住用户名实现代码
Nov 04 #Javascript
jQuery列表拖动排列具体实现
Nov 04 #Javascript
利用cookie记住背景颜色示例代码
Nov 04 #Javascript
判断滚动条到底部的JS代码
Nov 04 #Javascript
js控制不同的时间段显示不同的css样式的实例代码
Nov 04 #Javascript
js实现瀑布流的一种简单方法实例分享
Nov 04 #Javascript
You might like
php debug 安装技巧
2011/04/30 PHP
Javascript Jquery 遍历Json的实现代码
2010/03/31 Javascript
jquery autocomplete自动完成插件的的使用方法
2010/08/07 Javascript
jquery blockUI 遮罩不能消失与不能提交的解决方法
2011/09/17 Javascript
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
jquery.messager.js插件导致页面抖动的解决方法
2013/07/14 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
javascript中为某个元素指定事件的三种方式
2014/08/07 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
Bootstrap零基础入门教程(三)
2016/07/18 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
JS实现带阴历的日历功能详解
2019/01/24 Javascript
vue-cli在 history模式下的配置详解
2019/11/26 Javascript
原生JavaScript实现滑动拖动验证的示例代码
2019/12/06 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
[04:52]2015国际邀请赛LGD战队晋级之路
2015/08/14 DOTA
[55:18]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python二分法搜索算法实例分析
2015/05/11 Python
python+pygame简单画板实现代码实例
2017/12/13 Python
分析Python读取文件时的路径问题
2018/02/11 Python
Python判断中文字符串是否相等的实例
2018/07/06 Python
python经典趣味24点游戏程序设计
2019/07/26 Python
Python Web静态服务器非堵塞模式实现方法示例
2019/11/21 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
AVIS安飞士奥地利租车官网:提供奥地利、欧洲和全世界汽车租赁
2016/11/29 全球购物
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
应届大学生简历中的自我评价
2014/01/15 职场文书
《中彩那天》教学反思
2014/02/22 职场文书
学生检讨书怎么写?
2014/10/10 职场文书
募捐感谢信
2015/01/22 职场文书
小学生表扬稿范文
2015/05/05 职场文书
Django实现翻页的示例代码
2021/05/24 Python
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python
Python3的进程和线程你了解吗
2022/03/16 Python