想看就看,不想看就别看。 大部分原文发布在 hackernoon,其中有几个实在太简单没有翻译,要看的可以自己点去看。

使用 !! 来转布尔值

转为布尔值是检查变量是否存在或是否有合法值的一个办法。 这个时候就可以使用 !!(两个感叹号)自动把任意类型的值转为布尔值,只有当该值为:0null""undefinedNaN 之一时才回返回 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.hasMoneytrue

使用 + 来转数字

这个办法只适用于字符串类型的数字,否则都返回 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() 内的函数,我就不贴我的实现了,思路和冒泡差不多。

results matching ""

    No results matching ""