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
();
}
你可以将变量简写,并且使用&&和函数连接在一起,如下例子可以简写为:
如果一些属性或函数存在于一个对象中,也可以用这种方式检测,如:
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
;}));