想看就看,不想看就别看。 大部分原文发布在 hackernoon,其中有几个实在太简单没有翻译,要看的可以自己点去看。
使用 !!
来转布尔值
转为布尔值是检查变量是否存在或是否有合法值的一个办法。
这个时候就可以使用 !!
(两个感叹号)自动把任意类型的值转为布尔值,只有当该值为:0
、null
、""
、undefined
、NaN
之一时才回返回 false
,否则都返回 true
,参见以下例子:
function Account(cash) {
this.cash = cash
this.hasMoney = !!cash
}
var account = new Account(100.50)
console.log(account.cash) // 100.50
console.log(account.hasMoney) // true
var emptyAccount = new Account(0)
console.log(emptyAccount.cash) // 0
console.log(emptyAccount.hasMoney) // false
上例中,如果 account.cash
大于零,account.hasMoney
为 true
。
使用 +
来转数字
这个办法只适用于字符串类型的数字,否则都返回 NaN
。看例子:
function toNumber(strNumber) {
return +strNumber
}
console.log(toNumber("1234")) // 1234
console.log(toNumber("ACB")) // NaN
这个办法同样适用于 Date
,下面例子会返回一个时间戳的数字:
console.log(+new Date()) // 1461288164385
条件判断的缩写
if (connected) {
login()
}
使用 &&
来连接一个变量(判断的条件)和一个函数缩写了以上代码:
connected && login()
也可以用这个办法来检查对象中是否有某属性:
user && user.login()
使用 ||
来设置默认值
在ES6中已经有了默认值的特性。在老版本中使用 ||
把默认值放在原值后面也可以做到。如果原值返回false
第二个值就会被设为默认值:
function User(name, age) {
this.name = name || "Oliver Queen"
this.age = age || 27
}
var user1 = new User()
console.log(user1.name) // Oliver Queen
console.log(user1.age) // 27
var user2 = new User("Barry Allen", 25)
console.log(user2.name) // Barry Allen
console.log(user2.age) // 25
在循环中缓存数组长度
简单来说就是循环之前先缓存原数组长度,特别是对很大的数组来说。毕竟每次都要读取一遍数组长度用于比较,大量的延迟加在一起不可忽视:
// bad
for (var i = 0; i < array.length; i++) {
console.log(array[i])
}
// good
var length = array.length
for (var i = 0; i < length; i++) {
console.log(array[i])
}
// make it smaller
for (var i = 0, length = array.length; i < length; i++) {
console.log(array[i])
}
使用 in
检查对象中是否有某属性
例如IE6不支持 document.querySelector()
,你就要先判断 document
里面有没有 querySelector()
函数,这个时候,用 in
:
if ('querySelector' in document) {
document.querySelector("#id")
} else {
document.getElementById("id")
}
使用 .slice(-n)
取数组的最后 n
个元素
如题:
var array = [1, 2, 3, 4, 5, 6];
console.log(array.slice(-1)); // [6]
console.log(array.slice(-2)); // [5,6]
console.log(array.slice(-3)); // [4,5,6]
slice(begin, end)
是截取从 begin
开始到 end
用的,如果不设置第二个参数,就会一直截取到末尾。
生成一个 [0, 1, ...., range]
的数组
注意只有ES6支持,记得用babel:
const a = [...Array(range).keys()]
数组合并
concat
? 据说新建数组很吃内存。
使用 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()
方法。
使用 [].slice.call(elements)
可以往里加:
var elements = document.querySelectorAll("p") // NodeList
var arrayElements = [].slice.call(elements) // Now the NodeList is an array
var arrayElements = Array.from(elements) // This is another way of converting NodeList to Array
随机一个数组
var list = [1, 2, 3]
list.sort(function() {
return Math.random() - 0.5
}) // shuffled array
我试了一下好像safari不支持 sort()
内的函数,我就不贴我的实现了,思路和冒泡差不多。