JS一些实用的方法

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();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码飞_CC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值