12个非常有用的JavaScript技巧


Posted in Javascript onMay 17, 2017

在这篇文章中,我将分享12个非常有用的JavaScript技巧。这些技巧可以帮助你减少并优化代码。

1) 使用!!将变量转换成布尔类型

有时,我们需要检查一些变量是否存在,或者它是否具有有效值,从而将它们的值视为true。对于做这样的检查,你可以使用||(双重否定运算符),它能自动将任何类型的数据转换为布尔值,只有这些变量才会返回false:0,null,"",undefined或NaN,其他的都返回true。我们来看看这个简单的例子:

function Account(cash) { 
 this.cash = cash; 
 this.hasMoney = !!cash; 
} 
var account = new Account(100.50); 
console.log(account.cash); // 100.50 
console.log(account.hasMoney); // true 
var emptyAccount = new Account(0); 
console.log(emptyAccount.cash); // 0 
console.log(emptyAccount.hasMoney); // false

在这个例子中,如果account.cash的值大于零,则account.hasMoney的值就是true。

2) 使用+将变量转换成数字

这个转换超级简单,但它只适用于数字字符串,不然就会返回NaN(不是数字)。看看这个例子:

function toNumber(strNumber) { 
 return +strNumber; 
} 
console.log(toNumber("1234")); // 1234 
console.log(toNumber("ACB")); // NaN

 这个转换操作也可以作用于Date,在这种情况下,它将返回时间戳:

console.log(+new Date()) // 1461288164385

3) 短路条件

如果你看到过这种类似的代码:

if (conected) { 
 login(); 
}

那么你可以在这两个变量之间使用&&(AND运算符)来缩短代码。例如,前面的代码可以缩减到一行:

conected && login();

你也可以用这种方法来检查对象中是否存在某些属性或函数。类似于以下代码:

user && user.login();

4) 使用||设置默认值

在ES6中有默认参数这个功能。为了在旧版浏览器中模拟此功能,你可以使用||(OR运算符),并把默认值作为它的第二个参数。如果第一个参数返回false,那么第二个参数将会被作为默认值返回。看下这个例子:

function User(name, age) { 
 this.name = name || "Oliver Queen"; 
 this.age = age || 27; 
} 
var user1 = new User(); 
console.log(user1.name); // Oliver Queen 
console.log(user1.age); // 27 
var user2 = new User("Barry Allen", 25); 
console.log(user2.name); // Barry Allen 
console.log(user2.age); // 25

5) 在循环中缓存array.length

这个技巧非常简单,并且在循环处理大数组时能够避免对性能造成巨大的影响。基本上几乎每个人都是这样使用for来循环遍历一个数组的:

for (var i = 0; i < array.length; i++) { 
 console.log(array[i]); 
}

如果你使用较小的数组,那还好,但是如果处理大数组,则此代码将在每个循环里重复计算数组的大小,这会产生一定的延迟。为了避免这种情况,你可以在变量中缓存array.length,以便在循环中每次都使用缓存来代替array.length:

var length = array.length; 
for (var i = 0; i < length; i++) { 
 console.log(array[i]); 
}

为了更简洁,可以这么写:

for (var i = 0, length = array.length; i < length; i++) { 
 console.log(array[i]); 
}

6) 检测对象中的属性

当你需要检查某些属性是否存在,避免运行未定义的函数或属性时,这个技巧非常有用。如果你打算编写跨浏览器代码,你也可能会用到这个技术。例如,我们假设你需要编写与旧版Internet Explorer 6兼容的代码,并且想要使用document.querySelector()来通过ID获取某些元素。 但是,在现代浏览器中,这个函数不存在。所以,要检查这个函数是否存在,你可以使用in运算符。看下这个例子:

if ('querySelector' in document) { 
 document.querySelector("#id"); 
} else { 
 document.getElementById("id"); 
}

在这种情况下,如果在document中没有querySelector函数,它就会使用document.getElementById()作为代替。

7) 获取数组的最后一个元素

Array.prototype.slice(begin,end)可以用来裁剪数组。但是如果没有设置结束参数end的值的话,该函数会自动将end设置为数组长度值。我认为很少有人知道这个函数可以接受负值,如果你将begin设置一个负数的话,你就能从数组中获取到倒数的元素:

var array = [1, 2, 3, 4, 5, 6]; 
console.log(array.slice(-1)); // [6] 
console.log(array.slice(-2)); // [5,6] 
console.log(array.slice(-3)); // [4,5,6]

8) 数组截断

这个技术可以锁定数组的大小,这对于要删除数组中固定数量的元素是非常有用的。例如,如果你有一个包含10个元素的数组,但是你只想获得前五个元素,则可以通过设置array.length = 5来阶段数组。看下这个例子:

var array = [1, 2, 3, 4, 5, 6]; 
console.log(array.length); // 6 
array.length = 3; 
console.log(array.length); // 3 
console.log(array); // [1,2,3]

9) 全部替换

String.replace()函数允许使用String和Regex来替换字符串,这个函数本身只能替换第一个匹配的串。但是你可以在正则表达式末尾添加/g来模拟replaceAll()函数:

var string = "john john"; 
console.log(string.replace(/hn/, "ana")); // "joana john" 
console.log(string.replace(/hn/g, "ana")); // "joana joana"

10) 合并数组

如果你需要合并两个数组,你可以使用Array.concat()函数:

var array1 = [1, 2, 3]; 
var array2 = [4, 5, 6]; 
console.log(array1.concat(array2)); // [1,2,3,4,5,6];

但是,这个函数对于大数组来说不并合适,因为它将会创建一个新的数组并消耗大量的内存。在这种情况下,你可以使用Array.push.apply(arr1,arr2),它不会创建一个新数组,而是将第二个数组合并到第一个数组中,以减少内存使用:

var array1 = [1, 2, 3]; 
var array2 = [4, 5, 6]; 
console.log(array1.push.apply(array1, array2)); // [1,2,3,4,5,6];

11) 把NodeList转换成数组

如果运行document.querySelectorAll("p")函数,它会返回一个DOM元素数组,即NodeList对象。但是这个对象并没有一些属于数组的函数,例如:sort(),reduce(),map(),filter()。为了启用这些函数,以及数组的其他的原生函数,你需要将NodeList转换为数组。要进行转换,只需使用这个函数:[] .slice.call(elements):

var elements = document.querySelectorAll("p"); // NodeList  
var arrayElements = [].slice.call(elements); // 现在已经转换成数组了 
var arrayElements = Array.from(elements); // 把NodeList转换成数组的另外一个方法

12) 对数组元素进行洗牌

如果要像外部库Lodash那样对数据元素重新洗牌,只需使用这个技巧:

var list = [1, 2, 3];  
console.log(list.sort(function() {  
  return Math.random() - 0.5 
})); // [2,1,3]

结论

现在,你已经学到了一些有用的JS技巧,它们主要用于缩减JavaScript代码量,其中一些技巧在许多流行的JS框架都使用到,如Lodash,Underscore.js,Strings.js等。如果你知道其他JS技巧,欢迎分享!

Javascript 相关文章推荐
js点击页面其它地方将某个显示的DIV隐藏
Jul 12 Javascript
修改file按钮的默认样式实现代码
Apr 23 Javascript
jQuery基于muipicker实现仿ios时间选择
Feb 22 Javascript
javascript瀑布流式图片懒加载实例解析与优化
Feb 23 Javascript
jQuery与js实现颜色渐变的方法
Dec 30 Javascript
Node.js调试技术总结分享
Mar 12 Javascript
javascript算法之二叉搜索树的示例代码
Sep 12 Javascript
关于vue中的ajax请求和axios包问题
Apr 19 Javascript
vue代理和跨域问题的解决
Jul 18 Javascript
js实现unicode码字符串与utf8字节数据互转详解
Mar 21 Javascript
iview实现图片上传功能
Jun 29 Javascript
浅谈实现在线预览PDF的几种解决办法
Aug 10 Javascript
Javascript中的async awai的用法
May 17 #Javascript
ES6入门教程之Iterator与for...of循环详解
May 17 #Javascript
angular.fromJson与toJson方法用法示例
May 17 #Javascript
Node.js编写CLI的实例详解
May 17 #Javascript
ES6入门教程之Class和Module详解
May 17 #Javascript
AngularJS实现动态添加Option的方法
May 17 #Javascript
AngularJS+bootstrap实现动态选择商品功能示例
May 17 #Javascript
You might like
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
2014/06/21 Servers
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
Laravel框架实现多个视图共享相同数据的方法详解
2019/07/09 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
jquery 简单图片导航插件jquery.imgNav.js
2010/03/17 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
2013/03/25 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
jQuery中:focus选择器用法实例
2014/12/30 Javascript
基于JS实现的随机数字抽签实例
2016/12/08 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
ES6学习教程之模板字符串详解
2017/10/09 Javascript
JavaScript实现无限级递归树的示例代码
2019/03/29 Javascript
基于JS实现前端压缩上传图片的实例代码
2019/05/14 Javascript
JavaScript装饰者模式原理与用法实例详解
2020/03/09 Javascript
JS实现前端动态分页码代码实例
2020/06/02 Javascript
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
Windows上使用virtualenv搭建Python+Flask开发环境
2016/06/07 Python
Python中扩展包的安装方法详解
2017/06/14 Python
Python3中类、模块、错误与异常、文件的简易教程
2017/11/20 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
NULL是什么,它是怎么定义的
2015/05/09 面试题
学生顶撞老师的检讨书
2014/09/17 职场文书
2015年派出所工作总结
2015/04/24 职场文书
六一亲子活动感想
2015/08/07 职场文书
基于Redis延迟队列的实现代码
2021/05/13 Redis
Vue3如何理解ref toRef和toRefs的区别
2022/02/18 Vue.js
HTML中的表单元素介绍
2022/02/28 HTML / CSS
Vue Mint UI mt-swipe的使用方式
2022/06/05 Vue.js