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

猜你喜欢

转载自blog.csdn.net/cc18868876837/article/details/78124150