1. 将arguments转为数组:
Array.prototype.slice.call(arguments);
备注:该方法也可以将getElementsByTagName()方法返回的NodeList转化为数组。像运行document.querySelectorAll("p")函数时,它可能返回DOM元素的数组,即NodeList对象。但这个对象不具有数组的函数功能,比如sort()、reduce()、map()、filter()等。为了让这些原生的数组函数功能也能用于这些类数组,就可以用以上的方法来讲节点列表转换成数组,或者使用Array.from()的方法。
2. 使用JS实现获取文件的扩展名:
function getFileExtension(filename) {
return filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
}
String.lastIndexOf() 方法返回指定值(本例中的'.')在调用该方法的字符串中最后出现的位置,如果没找到则返回-1。对于'filename'和'.hiddenfile',lastIndexOf 的返回值分别为0 和-1 无符号右移操作符(>>>) 将-1 转换为4294967295,将-2 转换为4294967294,这个方法可以保证边缘情况时文件名不变。String.prototype.slice() 从上面计算的索引处提取文件的扩展名。如果索引比文件名的长度大,结果为" "。
3. 使用!!操作符转换布尔值
在检查一个变量是否存在或者检查值是否为一个有效值的时候,我们可以使用!!操作符来实现。对于变量可以使用 !!variable 来做检测,如果变量的值为:0、null、“ ”、undefined或者NaN都将返回 false,否则为true。如下例子:
function Account(cash) {
this.cash = cash;
this.hasMoney = !!cash;
}
var MyAccount = new Account(99.3);
console.log(MyAccount.cash); // 99.3
console.log(MyAccount.hasMoney); // true
var EmptyAccount = new Account(0);
console.log(EmptyAccount.cash); //0
console.log(EmptyAccount.hasMoney) //false
上述例子中,只要account.cash的值大于0,那么account.hasMoney返回的值就是true。
4. 使用+将字符串数据转换成数字
使用+可以将字符串数据转换成数字,不过只适用于字符串数据,否则将返回NaN。如下例子:
function toNumber(strNumber){
return +strNumber;
}
console.log(toNumber("456")); //456
console.log(toNumber("a781")) //NaN
这个也适用于Date,在本例中,它返回的是时间戳数字:
console.log(+new Date()); //1524056070165
5. 并条件符
如果有一段代码如下:
if(connected) {
login();
}
你可以将变量简写,并且使用&&和函数连接在一起,如下例子可以简写为:
connected && login();
如果一些属性或函数存在于一个对象中,也可以用这种方式检测,如:
user && user.login();
6. 使用||运算符
在ES6中有默认参数这一特性。为了在老版本的浏览器中模拟这一特性,可以使用||操作符,将默认值当做第二个参数传入。如果第一个参数返回值为false,那么第二个值将会认为是一个默认值,如下例子:
function User(name, age) {
this.name = name || "Chen Cong";
this.age = age || 27;
}
var user1 = new User();
console.log(user1.name); //Chen Cong
console.log(user1.age); //27
var user2 = new User("Bob", 30);
console.log(user2.name); //Bod
console.log(user2.age); //30
7. 在循环中缓存array.length
基本上,大家都会写一个这样的同步迭代的数组:
for(var i = 0; i < array.length; i++) {
console.log(array[i]);
}
小型的数组这样做没问题,但是在处理大型数组时,这段代码在每次迭代时都重新计算数组大小,这会导致一些延误,对性能的影响将是非常大的。为了避免这种现象,可以对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]);
}
8. 检测对象中的属性
当需要检测一些属性是否存在,避免运行未定义的函数或属性时,比如在定一些跨浏览器兼容的代码时,这个小技巧就显得很有用。例如,你想使用document.querySelector()来选择一个id,并且让它兼容IE6浏览器,但是在IE6中这个函数是不存在的,可以使用如下方法检测:
if('querySelector' in document) {
document.querySelector("#id");
} else {
document.getElementById("id");
}
9. 获取数组中最后一个元素
Array.prototype.slice(begin, end)用来获取begin和end之间的数组元素。如果不设置end参数,则将数组的默认长度值当作end值。该函数也可接受负值作为参数,如果仅设置一个负值作为begin的值,那么即可获取数组最后的元素,例如:
var array = [1, 2, 3, 4, 5];
console.log(array.slice(-1)); //[5]
console.log(array.slice(-2)); //[4, 5]
10. 数组截断
可以通过array.length = n来截断数组的前n项,但这会破坏原数组。如下例子:
var array = [1, 2, 3, 4, 5];
console.log(array.length); //5
array.length = 3;
console.log(array.length) //3
console.log(array); //[1, 2, 3]
11. 合并数组
一般情况下是使用Array.concat()函数来合并两个数组:
var array1 = [1, 2, 3];
var array2 = [4, 5, 6];
console.log(array1.concat(array2)); //[1, 2, 3, 4, 5, 6],是一个新数组
console.log(array1); //[1, 2, 3],array1没变
然而这个函数并不适合用来合并两个大型数组,因为其将消耗大量的内存来存储新创建的数组。此时,可以使用array1.push.apply(array1, array2)来替代创建一个新数组,它只是将第二个数组添加到第一个数组中,减少了内存的使用,如下:
var array1 = [1, 2, 3];
var array2 = [4, 5, 6];
array1.push.apply(array1, array2);
console.log(array1); //[1, 2, 3, 4, 5, 6],array1改变
12.数组元素的洗牌
对于数组元素的洗牌,不需要使用任何外部的库,如Lodash,只需要这样做:
var list = [1, 2, 3, 4, 5];
console.log(list.sort(function() {return Math.random()-0.5;}));
//或者
console.log(list.sort(() => .5 - Math.random()));
但是以上的实现并不是完全随机的,究其原因,还是因为排序算法的不稳定性,导致一些元素没有机会进行比较,具体请参考问题,在抽奖程序中若要实现完全随机,请使用 Fisher–Yates shuffle 算法,以下是简单实现:
function shuffle(arrs) {
for (let i = arrs.length - 1; i > 0; i -= 1) {
const random = Math.floor(Math.random() * (i + 1));
[arrs[random], arrs[i]] = [arrs[i], arrs[random]];
}
}
12.数组去重
将数组元素加入到set中,然后再通过调用Array.from()方法将set转为数组即可。
let arrs = [1, 2, 2, 3, 3, 3, 4, 5];
let set = new Set();
arrs.forEach((arr) => set.add(arr));
let newArr = Array.from(set);
封装成函数:
function dedupe(array) {
return Array.from(new Set(array));
}
dedupe([1, 1, 2, 2, 3 ]); //[1, 2, 3]
因为扩展运算符(...)内部使用for...of循环,所以也可以这样:
function dedupe(array) {
return [...new Set(array)];
}
dedupe([1, 1, 2, 2, 3 ]); //[1, 2, 3]
13. 获取时间戳的方法
let now = +new Date();