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技巧,欢迎分享!
12个非常有用的JavaScript技巧的更多相关文章
- 【转】网上看到的“12个非常有用的JavaScript技巧”
1) 使用!!将变量转换成布尔类型 有时,我们需要检查一些变量是否存在,或者它是否具有有效值,从而将它们的值视为true.对于做这样的检查,你可以使用!!(双重否定运算符),它能自动将任何类型的数据转 ...
- 12个非常有用的JavaScript小技巧
在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是 ...
- 45个有用的JavaScript技巧
众所周知,JavaScript是世界上最流行的变成语言,不管是web网页,手机APP(例如PhoneGap或Appcelerator),还是服务器端(例如NodeJS或Wakanda)还有许多其他的实 ...
- 45 Useful JavaScript Tips, Tricks and Best Practices(有用的JavaScript技巧,技巧和最佳实践)
As you know, JavaScript is the number one programming language in the world, the language of the web ...
- 12个非常实用的JavaScript小技巧
在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是 ...
- 12个JavaScript技巧
转自:http://web.jobbole.com/86146/ 在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操 ...
- 12个常用的JavaScript技巧
在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是 ...
- 12个十分实用的JavaScript小技巧
12个非常实用的JavaScript小技巧 在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候 ...
- [技术翻译]您应该知道的13个有用的JavaScript数组技巧
本次预计翻译三篇文章如下: 01.[译]9个可以让你在2020年成为前端专家的项目 02.[译]预加载响应式图像,从Chrome 73开始实现 03.[译]您应该知道的13个有用的JavaScript ...
随机推荐
- GC算法基础
寻找垃圾对象的算法:1. 引用计数(无法处理循环引用) 2. 根寻法(被广泛引用在gc算法中) 清理垃圾的算法: 1. 标记复制 2. 标记清理 3. 标记整理 分代算法的好处: 1. 分代处理, ...
- 端口转发 Port Forwarding (一)
0x00First 最近发现一些好用的端口转发工具和技巧,计划认真梳理一下 SSH.NC.LCX.EW.FRP 0x01 SSH隧道端口转发 目前利用SSH隧道(SSH tunneling)进行端口转 ...
- 在ASP.NET MVC里对Web Page网页进行权限控制
我们在ASP.NET MVC开发时,有时候还是得设计ASP.NET的Web Page网页(.aspx和.aspx.cs),来实现一些ASP.NET MVC无法实现的功能,如此篇<Visual S ...
- QQ现状深度剖析:你还认为QQ已经被微信打败了吗?
本文来自“人人都是产品经理”公众号作者栗栗粥的原创分享. 1.前言 移动端的时代里,微信占据了社交领域的半壁江山,不得不让人想起曾经PC时代里的王者“QQ”,微信的爆发和QQ的停滞让很多人认为微信 ...
- Inotify+Rsync实现Linux服务器文件同步
做这个功能的时候遇到了好多坑,在此感谢一下这篇博客 http://kerry.blog.51cto.com/172631/734087/ ,大家参照这篇博客就能实现该功能. 另外如果想详细了解一下的 ...
- 移动端video标签默认置顶的解决方案
概述 在移动端上面,比如说微信上面打开一个页面,如果有video标签的话,常常会出现video标签默认置顶的情况,一般的解决方案是在不需要看见它的时候给它加一个display:none进行隐藏.今天在 ...
- soul开源网关项目搭建学习
1. soul开源网关项目搭建学习 1.1. 地址 https://gitee.com/shuaiqiyu/soul 1.2. 介绍 官方介绍:这是一个异步的,高性能的,跨语言的,响应式的API网关. ...
- python 按照一个字典的值来对这个字典进行排序
old_dic = {'a':6, 'b':3, 'c':2, 'd':4, 'e':5, 'f':1}new_dic = sorted(old_dic.items(), key=lambda d:d ...
- MySQL数据库的锁机制
在并发访问情况下,很有可能出现不可重复读等等读现象.为了更好的应对高并发,封锁.时间戳.乐观并发控制(乐观锁).悲观并发控制(悲观锁)都是并发控制采用的主要技术方式. 锁分类 ①.按操作划分:DML锁 ...
- Linux 下 pushd,popd,cd- 用法
一,为何要使用这几个命令? 可能大家会有疑问,为何要使用这几个命令, 难道用cd不就可以切换目录了吗? 没错,使用cd就可以切换到需要访问的目录, 但是有时会是一个路径很长,层次很多的目录 ...