JavaScript奇技淫巧45招
JavaScript奇技淫巧45招
撰写于 2015年1月5日 修改于 2016年6月16日 分类 翻译 标签 JavaScript
本文是一篇翻译文章,原文信息如下:
JavaScript是一个绝冠全球的编程语言,可用于Web开发、移动应用开发(PhoneGap、Appcelerator)、服务器端开发(Node.js和Wakanda)等等。JavaScript还是很多新手踏入编程世界的第一个语言。既可以用来显示浏览器中的简单提示框,也可以通过nodebot或nodruino来控制机器人。能够编写结构清晰、性能高效的JavaScript代码的开发人员,现如今已成了招聘市场最受追捧的人。
在这篇文章里,我将分享一些JavaScript的技巧、秘诀和最佳实践,除了少数几个外,不管是浏览器的JavaScript引擎,还是服务器端JavaScript解释器,均适用。
本文中的示例代码,通过了在Google Chrome 30最新版(V8 3.20.17.15)上的测试。
1、首次为变量赋值时务必使用var
关键字
变量没有声明而直接赋值得话,默认会作为一个新的全局变量,要尽量避免使用全局变量。
2、使用===
取代==
==
和!=
操作符会在需要的情况下自动转换数据类型。但===
和!==
不会,它们会同时比较值和数据类型,这也使得它们要比==
和!=
快。
1 |
[10] === 10 // is false |
3、underfined
、null
、0、false、NaN、空字符串的逻辑结果均为false
4、行尾使用分号
实践中最好还是使用分号,忘了写也没事,大部分情况下JavaScript解释器都会自动添加。对于为何要使用分号,可参考文章JavaScript中关于分号的真相。
5、使用对象构造器
1 |
function Person(firstName, lastName){ |
6、小心使用typeof
、instanceof
和contructor
typeof
:JavaScript一元操作符,用于以字符串的形式返回变量的原始类型,注意,typeof null
也会返回object
,大多数的对象类型(数组Array、时间Date等)也会返回object
contructor
:内部原型属性,可以通过代码重写instanceof
:JavaScript操作符,会在原型链中的构造器中搜索,找到则返回true
,否则返回false
1 |
var arr = ["a", "b", "c"]; |
7、使用自调用函数
函数在创建之后直接自动执行,通常称之为自调用匿名函数(Self-Invoked Anonymous Function)或直接调用函数表达式(Immediately Invoked Function Expression )。格式如下:
1 |
(function(){ |
8、从数组中随机获取成员
1 |
var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119]; |
9、获取指定范围内的随机数
这个功能在生成测试用的假数据时特别有数,比如介与指定范围内的工资数。
1 |
var x = Math.floor(Math.random() * (max - min + 1)) + min; |
10、生成从0到指定值的数字数组
1 |
var numbersArray = [] , max = 100; |
11、生成随机的字母数字字符串
1 |
function generateRandomAlphaNum(len) { |
12、打乱数字数组的顺序
1 |
var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411]; |
这里使用了JavaScript内置的数组排序函数,更好的办法是用专门的代码来实现(如Fisher-Yates算法),可以参见StackOverFlow上的这个讨论。
13、字符串去空格
Java、C#和PHP等语言都实现了专门的字符串去空格函数,但JavaScript中是没有的,可以通过下面的代码来为String
对象函数一个trim
函数:
1 |
String.prototype.trim = function(){return this.replace(/^\s+|\s+$/g, "");}; |
新的JavaScript引擎已经有了trim()
的原生实现。
14、数组之间追加
1 |
var array1 = [12 , "foo" , {name "Joe"} , -2458]; |
15、对象转换为数组
1 |
var argArray = Array.prototype.slice.call(arguments); |
16、验证是否是数字
1 |
function isNumber(n){ |
17、验证是否是数组
1 |
function isArray(obj){ |
但如果toString()
方法被重写过得话,就行不通了。也可以使用下面的方法:
1 |
Array.isArray(obj); // its a new Array method |
如果在浏览器中没有使用frame,还可以用instanceof
,但如果上下文太复杂,也有可能出错。
1 |
var myFrame = document.createElement('iframe'); |
18、获取数组中的最大值和最小值
1 |
var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411]; |
19、清空数组
1 |
var myArray = [12 , 222 , 1000 ]; |
20、不要直接从数组中delete
或remove
元素
如果对数组元素直接使用delete
,其实并没有删除,只是将元素置为了undefined
。数组元素删除应使用splice
。
切忌:
1 |
var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ]; |
而应:
1 |
var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ]; |
删除对象的属性时可以使用delete
。
21、使用length
属性截断数组
前面的例子中用length
属性清空数组,同样还可用它来截断数组:
1 |
var myArray = [12 , 222 , 1000 , 124 , 98 , 10 ]; |
与此同时,如果把length
属性变大,数组的长度值变会增加,会使用undefined
来作为新的元素填充。length
是一个可写的属性。
1 |
myArray.length = 10; // the new array length is 10 |
22、在条件中使用逻辑与或
1 |
var foo = 10; |
逻辑或还可用来设置默认值,比如函数参数的默认值。
1 |
function doSomething(arg1){ |
23、使得map()
函数方法对数据循环
1 |
var squares = [1,2,3,4].map(function (val) { |
24、保留指定小数位数
1 |
var num =2.443242342; |
注意,toFixec()
返回的是字符串,不是数字。
25、浮点计算的问题
1 |
0.1 + 0.2 === 0.3 // is false |
为什么呢?因为0.1+0.2等于0.30000000000000004。JavaScript的数字都遵循IEEE 754标准构建,在内部都是64位浮点小数表示,具体可以参见JavaScript中的数字是如何编码的.
可以通过使用toFixed()
和toPrecision()
来解决这个问题。
26、通过for-in循环检查对象的属性
下面这样的用法,可以防止迭代的时候进入到对象的原型属性中。
1 |
for (var name in object) { |
27、逗号操作符
1 |
var a = 0; |
28、临时存储用于计算和查询的变量
在jQuery选择器中,可以临时存储整个DOM元素。
1 |
var navright = document.querySelector('#right'); |
29、提前检查传入isFinite()
的参数
1 |
isFinite(0/0) ; // false |
30、避免在数组中使用负数做索引
1 |
var numbersArray = [1,2,3,4,5]; |
注意传给splice
的索引参数不要是负数,当是负数时,会从数组结尾处删除元素。
31、用JSON来序列化与反序列化
1 |
var person = {name :'Saad', age : 26, department : {ID : 15, name : "R&D"} }; |
32、不要使用eval()
或者函数构造器
eval()
和函数构造器(Function
consturctor)的开销较大,每次调用,JavaScript引擎都要将源代码转换为可执行的代码。
1 |
var func1 = new Function(functionCode); |
33、避免使用with()
使用with()
可以把变量加入到全局作用域中,因此,如果有其它的同名变量,一来容易混淆,二来值也会被覆盖。
34、不要对数组使用for-in
避免:
1 |
var sum = 0; |
而是:
1 |
var sum = 0; |
另外一个好处是,i
和len
两个变量是在for
循环的第一个声明中,二者只会初始化一次,这要比下面这种写法快:
1 |
for (var i = 0; i < arrayNumbers.length; i++) |
35、传给setInterval()
和setTimeout()
时使用函数而不是字符串
如果传给setTimeout()
和setInterval()
一个字符串,他们将会用类似于eval
方式进行转换,这肯定会要慢些,因此不要使用:
1 |
setInterval('doSomethingPeriodically()', 1000); |
而是用:
1 |
setInterval(doSomethingPeriodically, 1000); |
36、使用switch/case
代替一大叠的if/else
当判断有超过两个分支的时候使用switch/case
要更快一些,而且也更优雅,更利于代码的组织,当然,如果有超过10个分支,就不要使用switch/case
了。
37、在switch/case
中使用数字区间
其实,switch/case
中的case
条件,还可以这样写:
1 |
function getCategory(age) { |
38、使用对象作为对象的原型
下面这样,便可以给定对象作为参数,来创建以此为原型的新对象:
1 |
function clone(object) { |
39、HTML字段转换函数
1 |
function escapeHTML(text) { |
40、不要在循环内部使用try-catch-finally
try-catch-finally中catch部分在执行时会将异常赋给一个变量,这个变量会被构建成一个运行时作用域内的新的变量。
切忌:
1 |
var object = ['foo', 'bar'], i; |
而应该:
1 |
var object = ['foo', 'bar'], i; |
41、使用XMLHttpRequests时注意设置超时
XMLHttpRequests在执行时,当长时间没有响应(如出现网络问题等)时,应该中止掉连接,可以通过setTimeout()
来完成这个工作:
1 |
var xhr = new XMLHttpRequest (); |
同时需要注意的是,不要同时发起多个XMLHttpRequests请求。
42、处理WebSocket的超时
通常情况下,WebSocket连接创建后,如果30秒内没有任何活动,服务器端会对连接进行超时处理,防火墙也可以对单位周期没有活动的连接进行超时处理。
为了防止这种情况的发生,可以每隔一定时间,往服务器发送一条空的消息。可以通过下面这两个函数来实现这个需求,一个用于使连接保持活动状态,另一个专门用于结束这个状态。
1 |
var timerID = 0; |
keepAlive()
函数可以放在WebSocket连接的onOpen()
方法的最后面,cancelKeepAlive()
放在onClose()
方法的最末尾。
43、时间注意原始操作符比函数调用快,使用VanillaJS
比如,一般不要这样:
1 |
var min = Math.min(a,b); |
可以这样来代替:
1 |
var min = a < b ? a : b; |
44、开发时注意代码结构,上线前检查并压缩JavaScript代码
可以使用JSLint或JSMin等工具来检查并压缩代码。
45、JavaScript博大精深,这里有些不错的学习资源
- Code Academy资源:http://www.codecademy.com/tracks/javascript
- Marjin Haverbekex编写的Eloquent JavaScript:http://eloquentjavascript.net/
- John Resig编写的Advanced JavaScript:http://ejohn.org/apps/learn/
JavaScript奇技淫巧45招的更多相关文章
- javascript 奇技淫巧45招
教程:http://chensd.com/2015-01/45-useful-javascript-tips-tricks-and-best-practices.html 1.上线前检查和压缩代码:用 ...
- JavaScript技巧45招
原文:45 Useful JavaScript Tips, Tricks and Best Practices作者:Saad Mousliki 在这篇文章里,我将分享一些JavaScript的技巧.秘 ...
- JavaScript技巧45招(转)
原文:45 Useful JavaScript Tips, Tricks and Best Practices作者:Saad Mousliki 在这篇文章里,我将分享一些JavaScript的技巧.秘 ...
- JavaScript奇技淫巧44招
JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发(Node.js和Wakanda)等等.JavaScript还是 ...
- JavaScript奇技淫巧44招(2)
JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发(Node.js和Wakanda)等等.JavaScript还是 ...
- JavaScript的技巧45招
JavaScript奇技淫巧45招 来自仲老师的分享: 原文地址[http://chensd.com/2015-01/45-useful-javascript-tips-tricks-and-best ...
- JavaScript 奇技淫巧
JavaScript 奇技淫巧 这里记录一下以前学习各种书籍和文章里边出现的JS的小技巧,分享给大家,也供自己查阅,同时感谢那些发现创造和分享这些技巧的前辈和大牛们. 1.遍历一个obj的属性到数组 ...
- 几个 JavaScript 奇技淫巧
#1使用双等号给布尔变量赋值,很容易联想到 var a = b || 123; 的写法 var a = b == 123;#2快速转换为布尔值 !!a#3防止页面被 iframe 调用 if(top ...
- javascript奇技淫巧之位运算符
奇技淫巧:指过于奇巧而无益还让人着迷的技艺与制品. And(与) & Or(或) | Exclusive Or(异或) 或者称 Xor ^ Not(非) ~ 位运算符,我们在日常js开发中其实 ...
随机推荐
- 行变列 拼接字符串 MSSQL 一个超级搞的问题
由数据 ThreeLevelSortID KeyWordID KeyWordName key1 key2 key3 key4 得到数据大 ThreeLevelSortID KeyWordName ke ...
- centos安装qt开发环境
- Struts2 三、指定Struts2处理的请求后缀
Action的请求通常情况下默认为以.action结尾,例如:http://localhost:9000/Struts2/hello/helloAction_sayHello.action .a ...
- 配置php中的Oracle扩展
window 1. 从 OTN Instant Client page下载windows客户端安装包,安装包的位数(32/64位)必须和你所使用的操作系统类型.php版本一致.解压安装包至C:\ins ...
- MVC中Json的使用:Controller中Json的处理【转】
一.当查询得到的数据符合前台要求,不需要做任何处理,直接DataList To Json 返回前台. 代码: , out recordCount); return Json(allEntities, ...
- Design Pattern Iterator 迭代器设计模式
这个设计模式感觉很easy,我们平时敲代码的时候也是常常须要调用iterator的,C++和Java都是. 所以感觉没什么特别的.就是须要模仿C++或者Java的iterator类的功能吧. 这里简单 ...
- [置顶] 浅析objc的消息机制
学习ios的同学都知道ojbc一种runtime的语言,runtime表明函数的真正执行的时候来确定函数执行的.这样的好处就是我们能很灵活的设计我们的代码,也能在看似合法的情况下做一些非常有意思的事情 ...
- 后台找到repeater里面的div并添加客户端点击事件
public partial class Inv_SelectWorkservice : System.Web.UI.Page,IPostBackEventHandler{ } 通过OnItemCre ...
- Java面试题之数据库三范式是什么
为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际 ...
- C#中的USB库 WinUSB
NET C#中的USB库WinUSB,的libusb - Win32和的libusb - 1.0.使用公共设备类,应用程序与所有未经修改的操作系统和驱动程序.大量的示例代码. http://sourc ...