阅读更多

3顶
0踩

编程语言

原创新闻 12个非常有用的JavaScript技巧

2017-05-11 15:30 by 副主编 jihong10102006 评论(1) 有4838人浏览
引用
原文:12 Extremely Useful Hacks for JavaScript
作者:Caio Ribeiro Pereira
翻译:雁惊寒

在这篇文章中,我将分享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技巧,欢迎分享!
3
0
评论 共 1 条 请登录后发表评论
1 楼 xierui 2017-05-17 10:33
很有用, 学习了

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 分享:12 个非常有用的 JavaScript 技巧

    在这篇文章中,将分享 12 个非常有用的 JavaScript 技巧,可以帮助你写出简洁且高性能的代码。 1. 过滤唯一值 ES6 引入了 Set 对象和延展(spread)语法…,我们可以用它们来创建一个只包含唯一值的数组。 ...

  • 分享12个特别有用的JavaScript小技巧_.docx

    分享12个特别有用的JavaScript小技巧_.docx

  • 12 个非常有用的 JavaScript 技巧

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

  • 15个有用的神奇JavaScript 技巧

    英文 |https://levelup.gitconnected.com/15-magical-javascript-tips-for-every-web-developer-3301f...

  • 蓝易云:分享12个非常有用的JavaScript技巧

    通过运用这些技巧,您可以更高效、简洁地编写JavaScript代码,提高开发效率并提升代码质量。在实际开发中,根据项目需求和团队风格,灵活运用这些技巧,使代码更加优雅和易于维护。let和const关键字具有块级作用域,...

  • 你喜欢自己吗?

    你喜欢自己吗?      我们都喜欢照镜子。科学家们发现女孩子照镜子和男孩子照镜子时的感觉并不一样。男孩子在镜子面前自我欣赏,而女孩子关心的则是从镜子里看看别人眼中的“我”是什么样的。虽然出发点不同,但在关注自己这一点上却是共同的,不过有的人关注自己,却并不喜欢自己。      那么,喜欢自己是不是很重要呢?答案是肯定的。心理学家告诉我们,除非我们确实喜欢自己,否则我们无法喜欢别人。怨

  • 一位老程序员的通货膨胀教训

           一日不评不奋,今天有些感伤。       唐是一个老程序员,1992年在珠海做排版软件,那时的工资是5000元,不用上个人所得税,奖金另算。  唐跟着的老板叫殷步久,同北大方正的张玉峰、王选、张旋龙这些大腕儿,都是非常熟的朋友。  唐那一年事业有,钱有,会弹钢琴跳芭蕾的太太也有,一居室的房子也有,虽然旧。  炳叔那一年还在首都钢铁公司的职工大学教Basic语言,月工资102元,是当时

  • 好久没来了

       放假了,不经常上网了,好久没有更新我的blog了.今天看了看,好多东西都没有作完呢,努力吧.

  • 关于职业生涯规划的一段对话

    研究生阶段做人生和职业规划还来得及转自心灵沟通论坛http://www.xlgt.com --职业生涯规划网友:自由自在 点评:杜胜祥 我的困惑! 共杜老师:    你好!    我在电脑前坐了整整一天翻看您的网站,还是忍不住想给您写封信。(杜老师:谢谢你对本网站的关注!)    9月份我就要研二了。可是对于未来,实在是没有一点方向的感觉。    其实想想,从小到大,好像就是这

  • 程序员——[小鸟语录]

    我也说说我对程序员的认识吧,从业时间不算长,只有三年,但回想起这三年来的经历,对行业内的一些话,感触颇深。     “做行业的专家”,这是一个10年IT从业的前辈说得一句话,他这句话里在当时所指的行业,并不是指编程,而是比如电信、电力、广电、银行之类的行业,而现在我的理解,这句话的意思是成为一个领域在行业中应用的专家,打个比方,你做电视台的媒体资产管理的,首先得知道媒体资产管理是个什么东西?电视台

  • 观十面埋伏有感(爆强!) (转自猛禽的blog)

          16日晚23:30,我来到新东安影城,放眼望去,空荡荡的商场里角落里,四散着一个个傻小子傻丫头们,空气中弥漫着一股傻气,预示着今夜将是全国所有观看该片的傻子门的先锋队首次出击。售票窗口前更是人声鼎沸,大厅的票售完了!中厅的票售完了!为了把犯傻进行到底,我以70元/人的价格,抢到了小厅第三排的座位!还好,不至于买站票 在一大段广告之后,影片终于正式开演了。从一开始两个主角的名字就预示了将

  • 关注研究生就业状态 (转)

        据复旦、交大、同济、华师大等几所高校公布的数据,今年硕士和博士研究生就业率均超过了95%,个别高校甚至达到了100%。在近乎100%的就业率背后,研究生的就业状态到底如何?企业、猎头等用人方又是如何看待研究生的?   当“唯学历”时代逐渐远去,研究生这群“皇帝的女儿”突然成了“行走在尴尬地带的群体”。媒体时有报道说,因为眼高手低和高不成低不就,用人单位普遍对研究生信心  不足。    不过

  • 论文被录用,发贴庆祝!

       嘻嘻,昨天实验室组织旅游,可惜有事自己没能去成.今天起来正在边郁闷边看书,结果接到杂志社的电话,通知我论文被录用了,马上按照修改意见修改后寄过去.真真是天上掉下个林妹妹,喜出望外啊.看来古人诚不欺我也,塞翁失马焉知祸福啊!

  • 关于某人要求我删除文章的回应

    ?? 首先我并不想骂人,这11篇文章我是从上海交大的bbs上转的,是某个人写的吗?我不知道,若你与原作者是同一个人,我马上删除.?? 再者,我的blog定位于数据收集与学习,所以经常会转载一些别人的文章,但本csdnblog发的文章,我都是收藏的,因为并不想引起纠纷.? 下面是交大文章源出处的连接:http://bbs.sjtu.edu.cn/bbsmain选精华区/语言/c语言/网友

  • 写在午夜之时 ——《doom启示录》读后感(一)

                               写在午夜之时                       ——《doom启示录》读后感     这两天有点感冒,躺在宿舍养病的同时我作了一件事情——读完了《doom启示录》。从清爽的早晨,到星光点点的午夜,我一口气读完了这本书。我的心里久久不能平静,一种不吐不快的感觉促使我在午夜之时来到了实验室,写下这些话。     我是游戏迷,喜欢很多游戏,

  • Dell 电话技术支持工程师答用户问(转载)(暴笑)

    一次一个客户报告:机器键盘进水,他家的猫猫在上面撒尿,然后客户问:”我就是想知道猫尿会不会腐蚀主板”,我答:“关于猫尿的成分我们不是太清楚,所以也没有办法告诉您猫尿是否会腐蚀主板。”       .某notag 用户,于是我习惯性的问:是台式机还是笔记本,结果老兄问:什么是台式机,什么是笔记本...无语....思考10秒种后说:象一块大塑料,可以折叠起来的是笔记本....象一个盒子一样的是台式

  • 艰难人生 ,一个普通IT人的十年回顾(三)

                                               艰难人生 —— 一个普通IT人的十年回顾(中)                                                        作者: CSDN 网友Bitfan (金旭亮)          在上篇中我说到决定考研,从此迈上了一条对我来说到目前为止最难走的路,是一个人生  的炼狱。

  • 请不要做浮躁的人(转)

    请不要做浮躁的人1.不要看到别人的回复第一句话就说:给个代码吧!你应该想想为什么。当你自己想出来再参考别人的提示,你就知道自己和别人思路的差异。2.初学者请不要看太多太多的书那会误人子弟的,先找本系统的学,很多人用了很久都是只对部分功能熟悉而已,本系统还是不够的。3.看帮助,不要因为很难而自己是初学者所以就不看;帮助永远是最好的参考手册,虽然帮助的文字有时候很难看懂,总觉得不够直观。4.不要被对象

Global site tag (gtag.js) - Google Analytics