提示:该文章是整理别人别人的文章,做者比较多,很难分辨原创做者是谁。正则表达式
1)使用!!将变量转换成布尔类型数组
有时,咱们须要检查一些变量是否存在,或者它是否具备有效值,从而将他们的值视为true。对于这样的检查,你可使用!!(双重否认运算符),他能自动将任何类型的数据转化为布尔值,只有0、null、“”、undefined或NaN才会返回false,其余的都会返回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
2)使用+将变量转化成数字缓存
这个转化比较简单,但它只适合数字字符串,否则就会返回NaN(Not a Number)。看例子:app
function toNumber(strNumber){ return +strNumber; } console.log(toNumber('342')); //342
console.log(toNumber('324s')); //NaN
//也能够用于转化Date,返回结果为时间戳
console.log(+new Date());
3)短路条件dom
在编写代码中常常会遇到这样的代码:函数
if(conected){ login(); }
可使用&&(and链接符)来缩短代码,上面的代码能够缩减为性能
conected&&login();测试
也可使用这种方法来检查对象中是否存在某些属性或者方法this
user&&user.login();
4)使用||设置默认值
在ES6中有默认参数这个功能。为了在旧版浏览器中模拟此功能,可以使用||(or运算符),并把默认值做为他的第二个参数。若是第一个参数返回false,那么第二个参数就会被做为默认值返回
function user(name,age){ this.name = name||'Olive Queen'; this.age = age||27; } var user1 = new user(); console.log(user1.name);//Olive Queen console.log(user1.age);//27 var user2 = new user('liming',25); console.log(user2.name);//liming console.log(user2.age);//25
5)在循环中缓存arr.length
这个技巧很是简单,而且在循环处理大数组时可以避免对性能形成巨大的影响。例如for循环
var arr = [1,2,3,'a','ds',4]; for(var i = 0;i<arr.length;i++){ console.log(arr[i]); }
对于小数组还好,较大数组的话每一次循环都会获取arr.length,这会产生必定的延迟,为了不这种状况,在for循环开始以前缓存arr.length
var arr = [1,2,3,'a','ds',4]; var len = arr.length; for(var i = 0;i<len;i++){ console.log(arr[i]); }
或者
var arr = [1,2,3,'a','ds',4]; for(var i = 0,len = arr.length;i<len;i++){ console.log(arr[i]); }
6)检查对象中的属性
当你须要检查某些属性是否存在的时候,避免运行未定义的函数或者属性时,这个技巧就会很是的有用。解决浏览器兼容问题中也可使用这个技巧。例如经过ID获取元素的完美方法
if('querySelector' in document){ document.querySelector('#id'); }else{ document.getElementById('id'); }
7)获取数组的最后一个元素
Array.prototype.slice(begin,end)能够用来裁剪数组。可是若是没有设置结束参数end的值的话,该函数会自动将end设置为数组长度值。若是将begin的数值设置为复制的话,就会从数组中获取倒数的元素:
var arr = [1,2,3,4,5]; console.log(arr.slice(-1));//[6]
console.log(arr.slice(-2));//[5,6]
console.log(arr.slice(-3));//[4,5,6]
8)数组截断
这个技术能够锁定数组的大小,这对于要删除数组中固定数量的元素是很是有用的。
var arr = [1,2,3,4,5,6,7,8,9,10]; arr.length = 5; console.log(arr);//[1,2,3,4,5] arr.length = 7; console.log(arr);//[1,2,3,4,5,undefined,undefined]
若是arr.length设置的数值大于当前数组长度,超过的元素会分配为undefined
9)替换字符串某段元素
String.replace()
函数容许你使用字符串或正则表达式来替换字符串,自己这个函数只替换第一次出现的字符串,不过你可使用正则表达多中的/g
来模拟replaceAll()
函数功能:
var str = 'john john'; console.log(str.replace(/hn/,'nan'));//jonan john console.log(str.replace(/hn/g,'nan'));//jonan jonan
10)合并数组
通常须要合并数组,使用Array.concat()方法,字符串也能够看作是数组
var str1 = 'hello'; var str2 = 'world'; console.log(str1.concat(str2));//helloworld
var str3 = [1,2,3];
var str4 = [4,5,6];
console.log(str3.concat(str4));//[1,2,3,4,5,6]
可是该方法对于大数组来讲并不合适,由于他会在内部新建一个数组并消耗大量的内存。原做者推荐使用Array.push.apply(arr1,arr2),可是在实践后发现其返回的结果始终是最后数组的长度,而不是数组的各个元素;并且有博主曾经作过Array.concat与Array.push.apply之间性能的测试实验。结果显示Array.concat操做的数组长度没有显示,而Array.oush.apply操做的数组因浏览器不一样而不一样,通常不能超过十万。
脚本之家有位朋友写过一篇《关于JS数组追加数组采用push.apply的问题》,讨论Array.push.apply的问题,最后采用forEach,不只能够避免数组过大的问题,并且从性能考虑forEach也是最快的。
var arr = [1,2,3,4,5,6,7,8,9]; arr.forEach(function(a){ console.log(a); });
可是在IE中该方法不能正常执行,提示Array不支持此属性或此方法,即IE的Array中没有forEach方法。可是能够添加原型方法
//Array.forEach implementation for IE support.. //https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach if (!Array.prototype.forEach) { Array.prototype.forEach = function(callback, thisArg) { var T, k; if (this == null) { throw new TypeError(" this is null or not defined"); } var O = Object(this); var len = O.length >>> 0; // Hack to convert O.length to a UInt32 if ({}.toString.call(callback) != "[object Function]") { throw new TypeError(callback + " is not a function"); } if (thisArg) { T = thisArg; } k = 0; while (k < len) { var kValue; if (k in O) { kValue = O[k]; callback.call(T, kValue, k, O); } k++; } }; }
11)打乱数组内的元素
var list = [1,2,3,4.5,55]; var arr = list.sort(function(){ return Math.random()-0.5; }); console.log(arr);//[4.5,1,2,3,55] console.log(arr[2]);//2
我暂时没有发现这个技巧有什么特别的用处,就只是打乱数组内的元素,生成的是一个新的数组。
12)将Nodelist转换为数组
DOM操做document.querySelectorAll('p'),或者document.getElementsByTagName都会返回一个DOM元素数组,即Nodelist对象,可是这个对象并无一些属于数组的函数,如sort()、reduce()、map()、filter()。为了启用这些函数,以及数组的其余原生函数,须要将Nodelist转化为数组。这就要用到[].slice.call(elements)或者Array.from(elements)
var eles = document.querySelectorAll('div'); var arrEles = [].slice.call(eles);
//var arrEles = Array.from(eles); console.log(arrEles);//[div.big,div#small]
返回的是元素的数组,div.big表示元素div的class为big。