[ ] JavaScript: break |
! Rethinking JavaScript: Replace break by going functional.
Rethinking JavaScript: Death of the For Loop ( : JavaScript: for) for . " break?".
break GOTO
break
, - GOTO
.
, " , , . break GOTO
?"
// . !
outer:
for (var i in outerList) {
inner:
for (var j in innerList) {
break outer;
}
}
(. labels) . GOTO
. JavaScript'e break
continue
, GOTO
.
JavaScript' , break continue GOTO
" break , ?"
, . GOTO
. "use strict", .
" . "
.
. break. . . .
, , , Lodash, Ramda, lazy.js, .
, isKitten
:
const cats = [
{ name: 'Mojo', months: 84 },
{ name: 'Mao-Mao', months: 34 },
{ name: 'Waffles', months: 4 },
{ name: 'Pickles', months: 6 }
]
const isKitten = cat => cat.months < 7
for
. , .
var firstKitten
for (var i = 0; i < cats.length; i++) {
if (isKitten(cats[i])) {
firstKitten = cats[i]
break
}
}
lodash
const firstKitten = _.find(cats, isKitten)
, - -. 5 .
var first5Kittens = []
// for
for (var i = 0; i < cats.length; i++) {
if (isKitten(cats[i])) {
first5Kittens.push(cats[i])
if (first5Kittens.length >= 5) {
break
}
}
}
. : , , .
JavaScript.
const result = cats.filter(isKitten)
.slice(0, 5);
. Lodash'.
const result = _.take(_.filter(cats, isKitten), 5)
.
Lodash , - . lazy.js. " underscore, ". .
const result = Lazy(cats)
.filter(isKitten)
.take(5)
, ( lazy.js) (filter, map ) .
, - !
, (. generic) , filter
, ?
.
const get5Kittens = () => {
const newList = []
// for
for (var i = 0; i < cats.length; i++) {
if (isKitten(cats[i])) {
newList.push(cats[i])
if (newList.length >= 5) {
break
}
}
}
return newList
}
. 5
limit
, isKitten
predicate
cats
list
.
const takeFirst = (limit, predicate, list) => {
const newList = []
for (var i = 0; i < list.length; i++) {
if (predicate(list[i])) {
newList.push(list[i])
if (newList.length >= limit) {
break
}
}
}
return newList
}
takeFirst
, !
takeFirst
. . .
for
, . i
newList
.
const takeFirst = (limit, predicate, list, i = 0, newList = []) => {
// ...
}
(isDone
) limit
0
(limit
) list
.
, predicate
. predicate
, takeFirst
, limit
newList
.
.
const takeFirst = (limit, predicate, list, i = 0, newList = []) => {
const isDone = limit <= 0 || i >= list.length
const isMatch = isDone ? undefined : predicate(list[i])
if (isDone) {
return newList
} else if (isMatch) {
return takeFirst(limit - 1, predicate, list, i + 1, [...newList, list[i]])
} else {
return takeFirst(limit, predicate, list, i + 1, newList)
}
}
if
Rethinking Javascript: the If Statement.
/*
* takeFirst `filter`, .
*
* @param {number} limit -
* @param {function} predicate - , item true false
* @param {array} list - ,
* @param {number} [i] - , ( 0)
*/
const takeFirst = (limit, predicate, list, i = 0, newList = []) => {
const isDone = limit <= 0 || i >= list.length
const isMatch = isDone ? undefined : predicate(list[i])
return isDone ? newList :
isMatch ? takeFirst(limit - 1, predicate, list, i + 1, [...newList, list[i]])
: takeFirst(limit, predicate, list, i + 1, newList)
}
:
const first5Kittens = takeFirst(5, isKitten, cats)
takeFirst
(. currying) . ( )
const first5 = takeFirst(5)
const getFirst5Kittens = first5(isKitten)
const first5Kittens = getFirst5Kittens(cats)
( lodash, ramda, lazy.js), , !
, takeFirst
, , . JavaScript Maximum call stack size exceeded
.
JavaScript .
, - @joelnet. , .
-> Functional JavaScript: Functional Composition For Every Day Use.
-> Rethinking JavaScript: Death of the For Loop
( : JavaScript: for)
-> Rethinking JavaScript: Elliminate the switch statement for better code
-> Functional JavaScript: Resolving Promises Sequentially