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

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

  1. function Account(cash) {
  2. this.cash = cash;
  3. this.hasMoney = !!cash;
  4. }
  5. var account = new Account(100.50);
  6. console.log(account.cash); // 100.50
  7. console.log(account.hasMoney); // true
  8. var emptyAccount = new Account(0);
  9. console.log(emptyAccount.cash); // 0
  10. console.log(emptyAccount.hasMoney); // false

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

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

  1. function toNumber(strNumber) {
  2. return +strNumber;
  3. }
  4. console.log(toNumber("1234")); // 1234
  5. console.log(toNumber("ACB")); // NaN

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

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

3) 短路条件 
如果你看到过这种类似的代码:

  1. if (conected) {
  2. login();
  3. }

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

  1. conected && login();

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

  1. user && user.login();

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

  1. function User(name, age) {
  2. this.name = name || "Oliver Queen";
  3. this.age = age || 27;
  4. }
  5. var user1 = new User();
  6. console.log(user1.name); // Oliver Queen
  7. console.log(user1.age); // 27
  8. var user2 = new User("Barry Allen", 25);
  9. console.log(user2.name); // Barry Allen
  10. console.log(user2.age); // 25

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

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

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

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

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

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

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

  1. if ('querySelector' in document) {
  2. document.querySelector("#id");
  3. } else {
  4. document.getElementById("id");
  5. }

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

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

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

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

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

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

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

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

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

  1. var array1 = [1, 2, 3];
  2. var array2 = [4, 5, 6];
  3. 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):

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

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

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

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

12个非常有用的JavaScript技巧的更多相关文章

  1. 【转】网上看到的“12个非常有用的JavaScript技巧”

    1) 使用!!将变量转换成布尔类型 有时,我们需要检查一些变量是否存在,或者它是否具有有效值,从而将它们的值视为true.对于做这样的检查,你可以使用!!(双重否定运算符),它能自动将任何类型的数据转 ...

  2. 12个非常有用的JavaScript小技巧

    在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是 ...

  3. 45个有用的JavaScript技巧

    众所周知,JavaScript是世界上最流行的变成语言,不管是web网页,手机APP(例如PhoneGap或Appcelerator),还是服务器端(例如NodeJS或Wakanda)还有许多其他的实 ...

  4. 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 ...

  5. 12个非常实用的JavaScript小技巧

    在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是 ...

  6. 12个JavaScript技巧

    转自:http://web.jobbole.com/86146/ 在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操 ...

  7. 12个常用的JavaScript技巧

    在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是 ...

  8. 12个十分实用的JavaScript小技巧

    12个非常实用的JavaScript小技巧 在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候 ...

  9. [技术翻译]您应该知道的13个有用的JavaScript数组技巧

    本次预计翻译三篇文章如下: 01.[译]9个可以让你在2020年成为前端专家的项目 02.[译]预加载响应式图像,从Chrome 73开始实现 03.[译]您应该知道的13个有用的JavaScript ...

随机推荐

  1. GC算法基础

    寻找垃圾对象的算法:1. 引用计数(无法处理循环引用) 2. 根寻法(被广泛引用在gc算法中) 清理垃圾的算法: 1. 标记复制  2. 标记清理  3. 标记整理 分代算法的好处: 1. 分代处理, ...

  2. 端口转发 Port Forwarding (一)

    0x00First 最近发现一些好用的端口转发工具和技巧,计划认真梳理一下 SSH.NC.LCX.EW.FRP 0x01 SSH隧道端口转发 目前利用SSH隧道(SSH tunneling)进行端口转 ...

  3. 在ASP.NET MVC里对Web Page网页进行权限控制

    我们在ASP.NET MVC开发时,有时候还是得设计ASP.NET的Web Page网页(.aspx和.aspx.cs),来实现一些ASP.NET MVC无法实现的功能,如此篇<Visual S ...

  4. QQ现状深度剖析:你还认为QQ已经被微信打败了吗?

    本文来自“人人都是产品经理”公众号作者栗栗粥的原创分享. 1.前言   移动端的时代里,微信占据了社交领域的半壁江山,不得不让人想起曾经PC时代里的王者“QQ”,微信的爆发和QQ的停滞让很多人认为微信 ...

  5. Inotify+Rsync实现Linux服务器文件同步

    做这个功能的时候遇到了好多坑,在此感谢一下这篇博客 http://kerry.blog.51cto.com/172631/734087/  ,大家参照这篇博客就能实现该功能. 另外如果想详细了解一下的 ...

  6. 移动端video标签默认置顶的解决方案

    概述 在移动端上面,比如说微信上面打开一个页面,如果有video标签的话,常常会出现video标签默认置顶的情况,一般的解决方案是在不需要看见它的时候给它加一个display:none进行隐藏.今天在 ...

  7. soul开源网关项目搭建学习

    1. soul开源网关项目搭建学习 1.1. 地址 https://gitee.com/shuaiqiyu/soul 1.2. 介绍 官方介绍:这是一个异步的,高性能的,跨语言的,响应式的API网关. ...

  8. 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 ...

  9. MySQL数据库的锁机制

    在并发访问情况下,很有可能出现不可重复读等等读现象.为了更好的应对高并发,封锁.时间戳.乐观并发控制(乐观锁).悲观并发控制(悲观锁)都是并发控制采用的主要技术方式. 锁分类 ①.按操作划分:DML锁 ...

  10. Linux 下 pushd,popd,cd- 用法

    一,为何要使用这几个命令? 可能大家会有疑问,为何要使用这几个命令,   难道用cd不就可以切换目录了吗?   没错,使用cd就可以切换到需要访问的目录,   但是有时会是一个路径很长,层次很多的目录 ...