网上看到的“12个非常有用的JavaScript技巧”
记录一下,自己以后可能用的到。
原文:blog.jscrambler.com/12-extremel…
网上看到的。
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); }
当你需要检查某些属性是否存在,避免运行未定义的函数或属性时,这个技巧非常有用。如果你打算编写跨浏览器代码,你也可能会用到这个技术。例如,我们假设你需要编写与旧版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];
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]
原文作者: PY2706
本文来源: 掘金 如需转载请联系原作者
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
剥开比原看代码06:比原是如何把请求区块数据的信息发出去的
作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 在前一篇中,我们说到,当比原向其它节点请求区块数据时,BlockKeeper会发送一个BlockRequestMessage把需要的区块height告诉对方,并把该信息对应的二进制数据放入ProtocolReactor对应的sendQueue通道中,等待发送。而具体的发送细节,由于逻辑比较复杂,所以在前一篇中并未详解,放到本篇中。 由于sendQueue是一个通道,数据放进去后,到底是由谁在什么情况下取走并发送,BlockKeeper这边是不知道的。经过我们在代码中搜索,发现只有一个类型会直接监视sendQueue中的数据,它就是前文出现的MConnection。MConnection的对象在它的OnStart方法中,会监视sendQueue中的数据,然后,等发现数据时,会将之取走并放入一个叫sending的通道里。 事情变得有点复杂了: 由前篇我们知道,一个MConnec...
- 下一篇
ReactNative开发必备ES6知识
引言 现代前端应用通常都会使用ES6进行开发,ReactNative项目同样也会使用ES6进行开发,对于现代前端项目开发来说,掌握ES6成为一件十分必要的事情。对于ES6的学习,通常都会阅读阮一峰的《ECMAScript 6 入门》,以下这本书中开发ReactNative必备的知识点。 ECMAScript 6简介 ECMAScript6(以下简称ES6)是JavaScript语言的下一代标准,它的目标是让JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。 let和const命令 ES6新增了let命令,用来声明变量,它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。const声明一个只读的常量,一旦声明,常量的值就不能变化。 变量的解构赋值 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。 函数的扩展 ES6能直接为函数的参数指定默认值 参数默认值可以与解构赋值的默认值,结合起来使用。 通常情况下,定义了默认值的参数,应该是函数的尾参数 指定了默认值以后,函数的length属性,将返回没有指定默认值的参数个...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7安装Docker,走上虚拟化容器引擎之路