12个好用的JS技巧

无聊时看到了一篇公众号的推送介绍了12个非常有用的JS技巧,所以决定自己也整理一下。

一、使用!!将变量转换成布尔类型

有时,需要检查一些变量是否存在,或者说他是否具有有效值,从而将它的值视为true。

对于这样的检查,可以使用!!(双重否定运算符),它能自动的将任何类型的数据转换为布尔值,只有这些变量才会返回false:null,undefined,Nan,0,"",其他的都会返回true。

例:

function Djw(str){

   this.cash=str;

   this.hasMoney=!!str;

}

var djw =new Djw(18);

console.log(djw.cash);//18

console.log(djw.hasMoney);//true

var emptyDjw =new Djw(0);

console.log(emptyDjw .cash);//0

console.log(emptyDjw .hasMoney);//false

二、使用+将变量转换成数字

这个转换,只适用于数字字符串的转换,不然就会返回NaN;

function toNumber(strNumber){

   return +strNumber;

}

console.log(toNumber("1234")); // 1234

console.log(toNumber("ACB")); // NaN  

这个转换操作也可以作用于Date,在这种情况下,它将返回时间戳:

console.log(+new Date()) // 1461288164385

三、短路条件

if(conected){

   login();

}

那么可以用 &&  来缩短代码。例:

conected && login();

也可以用这种方法来检查对象中是否存在某些属性或函数。

user &&  user.login();

四、使用|| 设置默认值

在ES6中有默认参数这个功能,但是之前没有,可以使用||,并把默认值作为第二个参数,例:

name || "default"

如果第一个参数返回false,那么第二个参数将会被作为默认值返回

五、在循环中缓存array.length

在循环处理大数组时能避免对性能造成巨大的影响,如果像传统写法那么写则代码在每个循环里重复计算数组的大小,会有一定的延迟。所以在变量中缓存array.length,以便在循环中每次都使用缓存来代替array.length;

var length=array.length;

for(var i=0;i<length;i++){

}

也可以for(var i=0,length=array.length;i<length;i++){}

六、检测对象中的属性

当你需要检查某些属性是否存在,避免运行未定义的函数或属性时,这个技巧非常有用。如果你打算编写跨浏览器代码,你也可能会用到这个技术。例如,我们假设你需要编写与旧版Internet Explorer 6兼容的代码,并且想要使用document.querySelector()来通过ID获取某些元素。 但是,在现代浏览器中,这个函数不存在。所以,要检查这个函数是否存在,你可以使用in运算符。看下这个例子:

if ('querySelector' in document) {  

    document.querySelector("#id");

} else {

    document.getElementById("id");

}

在这种情况下,如果在document中没有querySelector函数,它就会使用document.getElementById()作为代替。

七、获取数组的最后一个元素

var array = [1, 2, 3, 4, 5, 6];  

console.log(array.slice(-1)); // [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];  

十一、把NodeList转换成数组

如果运行document.querySelectorAll("p")函数,返回一个DOM元素数组,即NodeList对象。但是这个对象并没有一些属于数组的函数,例如:sort(),reduce(),map(),filter(),为了启用这些函数,以及数组的其他原声函数,需要将NodeList转换成数组,要进行转换,只需要使用这个函数:[].slice.call(element);

var elements=document.querySelectorAll("p");//NodeList

var arrEle=[].slice.call(elements);//已经转换成数组了

还有一种方法:

var arrEle=Array.form(elements);

十二、对数组元素进行洗牌

如果要像外部库Lodash那样对数据元素重新洗牌,只需使用这个技巧:

var list = [1, 2, 3];  

console.log(list.sort(function() {  

    return Math.random() - 0.5

})); // [2,1,3]

猜你喜欢

转载自355504677.iteye.com/blog/2375026