On Github AlecAivazis / functional-javascript
// hoisted, functionally scoped var asdf = 'asdf'
// cannot be re-declared, block scoped let foo = 'bar' // cannot be changed (sometimes), block scoped const bar = 'baz'
// cannot be re-declared let foo = 'bar' // cannot be changed (sometimes) const bar = 'baz'
// does this act like a var, let, // or const? function myFunc(name) { return 'Hello ' + name }
// now we can decide! const myNewFunc = (name) => ( 'Hello ' + name ) // sometimes implicit returns are bad const myNewestFunc = (name) => { return 'Hello ' + name }
var data = {'key': 'bar'} // grab the key entry var key = data.key
function myFunc(args) { console.log(args.foo) } myFunc({foo: 'bar'})
const data = {'key': 'bar'} // grab the key entry const {key} = data
function myFunc({foo}) { console.log(foo) } myFunc({foo: 'bar'})
var mockData = { foo: 'bar', }
var newObject = Object.assign({}, mockData, { 'bar': 'baz' } )
const mockData = { foo: 'bar', } const newObj = { ...mockData, 'bar': 'baz', }
const myFunction = () => 'hello world' console.log(myFunction)
[1,2,3][1,4,9]
// we want to square each number in this list const numbers = [1,2,3] // we'll collect the results in this list const results = [] // visit each element in the array for (const i = 0 ; i < numbers.length ; i ++) { // grab the i'th entry const entry = numbers[i] // add the square to the list result.append(entry * entry) } // results == [1, 4, 9]
// we want to square each number in this list const numbers = [1,2,3] // square each number in a single line! const results = numbers.map(entry => entry * entry) // results == [1, 4, 9]
[1,2,3,4][2,4]
// we want to grab every even number in this list const numbers = [1,2,3,4,5,6] // collect results here const results = [] // go over every number for (const i = 0 ; i < numbers.length ; i ++) { // grab the i'th number const number = numbers[i] // if the number is even if (number % 2 == 0) { // add it to the list results.append(number) } } // results == [2, 4, 6]
// we want to grab every even number in this list const numbers = [1,2,3,4,5,6] // collect results here const results = numbers.filter(entry => entry % 2 == 0) // results == [2, 4, 6]
[1,2,3]6
// now we want to add each number in the list const numbers = [1,2,3] // start off at zero const total = 0 // visit every item for (const i = 0 ; i < numbers.length ; i ++) { // grab the i'th number const number = numbers[i] // add the number to the running total total += number } // total == 6
// the numbers to sum up const numbers = [1,2,3] // combine them in a single line const total = numbers.reduce((sum, entry) => sum + entry, 0) // total == 6
<div> <button id="button"> hello </button> </div>
<div> <button id="button"> hello </button> </div>
$("#button").on('click', (event) => { this.style('color', 'red') })
<div> <div class="navigation"> <ul> <li> nav1 </li> <li> nav2 </li> <li> nav3 </li> </ul> </div> <div class="content"> </div> <div class="footer"> </div> </div> <script src="app.js">
<div> <Navigation> <Content> <Footer> </div>
import React from 'react' import ReactDom from 'react-dom'
const MyElement = () => ( <div> hello world! </div> )
// rendered with <MyElement />
// render over a specific element ReactDom.render(<MyElement />, document.getElementById('app'))
// rendered with <MyElement />mention jsx as an extension of javascript adding syntactic sugar this makes rendering our custom elements feel very natural alongside the standard html one in order to actually render our component tree, we have to do so over a single element
const name = "John" const MyElement = () => ( <div> Hello {name}! </div> ) // rendered with <MyElement />in order for the compiler to know that an expression should be evaluated as javascript, you have to wrap it in curly braces.
const MyElement = ({name}) => ( <div> Hello {name}! </div> ) // rendered with <MyElement name="John"/>
// <MyElement numbers={[1,2,3]} />
const NumberList = (numbers) => ( <ul> { numbers.map(number => ( <li> {number} </li> ))} </ul> )Let's consider the example where I want to take a list of numbers and show an html list composed of ul and li elements with each entry as the square of the numbers in this list This is easily accomplished using an inline map over the numbers prop. But our functional tools don't stop becoming useful after mapping over lists
const itemsInCart = [{name: 'Steak', price: 25.75}, ...]
// the root shopping cart component const ShoppingCart = (items) => { // figure out the total cost of all the recipes const totalCost = items.reduce((sum, {price}) => sum + price, 0) // render the component return ( <div> {items.map(cartItem => ( <ShoppingCartItem {...cartItem}/> ))} <div> Total cost: {totalCost} </div> </div> ) } // rendered with <ShoppingCart items={itemsInCart} />
const itemsInCart = [{name: 'Steak', price: 25.75}, ...] // ... const totalCost = items.reduce((sum, {price}) => sum + price, 0) // ... <div> {totalCost} </div>
const itemsInCart = [{name: 'Steak', price: 25.75}, ...] // ... {items.map(cartItem => ( <ShoppingCartItem {...cartItem}/> ))}
// ... const ShoppingCartItem = ({name, date}) => ( <div> <div> {name} </div> <div> {date} </div> </div> )