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。浏览器
+
将变量转换成数字这个转换超级简单,但它只适用于数字字符串,否则就会返回NaN
(不是数字)。看看这个例子:缓存
function toNumber(strNumber) { return +strNumber; } console.log(toNumber("1234")); // 1234 console.log(toNumber("ACB")); // NaN
这个转换操做也能够做用于Date
,在这种状况下,它将返回时间戳:app
console.log(+new Date()) // 1461288164385
若是你看到过这种相似的代码:框架
if (conected) { login(); }
那么你能够在这两个变量之间使用&&
(AND运算符)来缩短代码。例如,前面的代码能够缩减到一行:dom
conected && login();
你也能够用这种方法来检查对象中是否存在某些属性或函数。相似于如下代码:函数
user && user.login();
||
设置默认值在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
array.length
这个技巧很是简单,而且在循环处理大数组时可以避免对性能形成巨大的影响。基本上几乎每一个人都是这样使用for
来循环遍历一个数组的:this
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]); }
当你须要检查某些属性是否存在,避免运行未定义的函数或属性时,这个技巧很是有用。若是你打算编写跨浏览器代码,你也可能会用到这个技术。例如,咱们假设你须要编写与旧版Internet Explorer 6兼容的代码,而且想要使用document.querySelector()
来经过ID获取某些元素。 可是,在现代浏览器中,这个函数不存在。因此,要检查这个函数是否存在,你可使用in
运算符。看下这个例子:
if ('querySelector' in document) { document.querySelector("#id"); } else { document.getElementById("id"); }
在这种状况下,若是在document
中没有querySelector
函数,它就会使用document.getElementById()
做为代替。
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]
这个技术能够锁定数组的大小,这对于要删除数组中固定数量的元素是很是有用的。例如,若是你有一个包含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]
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"
若是你须要合并两个数组,你可使用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];
若是运行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转换成数组的另一个方法
若是要像外部库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技巧,欢迎分享!