【转】网上看到的“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);
}
如果你使用较小的数组,那还好,但是如果处理大数组,则此代码将在每个循环里重复计算数组的大小,这会产生一定的延迟。为了避免这种情况,你可以在变量中缓存array.length,以便在循环中每次都使用缓存来代替array.length:
var
length = array.length;
for (var i = 0; i < length; i++) {
console.log(array);
}
为了更简洁,可以这么写:
for (var i = 0, length =
array.length; i < length; i++) {
console.log(array);
}
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]
Fundebug提供JavaScript监控,支持所有主流前端框架,微信小程序监控,微信小游戏监控,后端Node.js监控。
您可能感兴趣的
原文链接:https://juejin.im/post/5af55e6751882542682e43e7
原文:blog.jscrambler.com/12-extremel…
【转】网上看到的“12个非常有用的JavaScript技巧”的更多相关文章
- 12个非常有用的JavaScript技巧
在这篇文章中,我将分享12个非常有用的JavaScript技巧.这些技巧可以帮助你减少并优化代码. 1) 使用!!将变量转换成布尔类型 有时,我们需要检查一些变量是否存在,或者它是否具有有效值,从而将 ...
- 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 ...
- 应该知道的25个非常有用的CSS技巧
在我们的前端CSS编码当中,经常要设置特殊的字体效果,边框圆角等等,还要考虑兼 容性的问题, CSS网页布局,说难,其实很简单.说它容易,往往有很多问题困扰着新 手,在中介绍了非常多的技巧,这些小技巧 ...
- 你应该知道的25个非常有用的CSS技巧
在我们的前端CSS编码当中,经常要设置特殊的字体效果,边框圆角等等,还要考虑兼容性的问题, CSS网页布局,说难,其实很简单. 说它容易,往往有很多问题困扰着新手,在中介绍了非常多的技巧,这些小技巧与 ...
- 12个非常实用的JavaScript小技巧
在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是 ...
- 12个JavaScript技巧
转自:http://web.jobbole.com/86146/ 在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操 ...
- 一些有用的javascript实例分析(三)
原文:一些有用的javascript实例分析(三) 10 输入两个数字,比较大小 window.onload = function () { var aInput = document.getElem ...
随机推荐
- some phrase for oral english
依我看,在我看来 I suppose that, ... As far as i'm concerned, ... As i see it, ... It seems to me that ... 1 ...
- 说说struts2中拦截器的请求流程一(模拟大致流程)
本文可作为北京尚学堂struts2课程的学习笔记. 首先 什么是拦截器?拦截器能干什么? 拦截器,顾名思义就是拦截对象然后做操作的东西,至于是拦截谁?那自然是拦截action了.能做什么操作呢?你想让 ...
- 【一天一道LeetCode】#13. Roman to Integer
一天一道LeetCode系列 (一)题目 Given a roman numeral, convert it to an integer. Input is guaranteed to be with ...
- Gradle 1.12用户指南翻译——第三十一章. FindBugs 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- 【Java编程】Java在dos窗口编译与执行的批处理
最近在Java编程过程中,常用到dos窗口对程序进行编译与运行.但是不方便之处在于每次都要输入命令进入将要编译的程序的目录(其实也有简单的方法,在文章末尾给出).于是编写了一个配置文件,可以一次修改, ...
- Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能
Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...
- linux设备驱动程序--类class的实现
#include <linux/module.h> #include <linux/fs.h> #include <linux/sched.h> #include ...
- Mac OS X版本的sublime text 3安装汇编语言语法支持
sublime是个好东西,小巧.功能强大而且跨平台! 不过默认的语法里没有对asm的支持,这让本猫情何以堪- 下面介绍一下Mac OS X中如何给sublime安装汇编的语法和自动汇编命令补全支持. ...
- 和菜鸟一起学linux之upnp协议的学习记录
UPnP全名是Universal Plug and Play,主要是微软在推行的一个标准.简单的来说,UPnP 最大的愿景就是希望任何设备只要一接上网络,所有在网络上的设备马上就能知道有新设备加入,这 ...
- Oracle12c(12.1)中性能优化&功能增强之通过参数THREADED_EXECTION使用多线程模型
1. 后台 UNIX/Linux系统上,oracle用多进程模型.例如:linux上一个常规安装的数据库会有如下进程列: $ ps -ef | grep [o]ra_ oracle 15356 ...