// Q1. make a string out of an array
{
const fruits = ["apple", "banana", "orange"];
// di it yourself!
// console.log(fruits.toString()); // .join과 .toString의 차이는 구분자(seperator)
// answer
const result = fruits.join(" and ");
console.log(result);
}
// Q2. make an array out of a string
{
const fruits = "🍎, 🥝, 🍌, 🍒";
// do it yourself!
// const fruit = fruits.split(",");
// console.log(fruit);
// answer
const fruit = fruits.split(",");
console.log(fruit);
}
// Q3. make this array look like this: [5, 4, 3, 2, 1]
{
const array = [1, 2, 3, 4, 5];
// do it yourself!
// const reverseArray = array.reverse();
// console.log(reverseArray);
// answer
const reverseArray = array.reverse();
console.log(reverseArray);
console.log(array); // 원래 배열도 바뀐다.
}
// Q4. make new array without the first two elements
{
const array = [1, 2, 3, 4, 5];
// do it yourself!
// const result = array.slice(2);
// const resultNew = array.slice(2, 5);
// console.log(result);
// console.log(resultNew);
// // answer
const result = array.slice(2, 5);
console.log(result);
console.log(array);
}
// -------------------------------------------------------------
class Student {
constructor(name, age, enrolled, score) {
this.name = name;
this.age = age;
this.enrolled = enrolled;
this.score = score;
}
}
const students = [
new Student("A", 29, true, 45),
new Student("B", 28, false, 80),
new Student("C", 30, true, 90),
new Student("D", 40, false, 66),
new Student("E", 18, true, 88),
];
// Q5. find a student with the score 90
{
// do it yourself!
// for (let i = 0; i < students.length; i++) {
// if (students[i].score === 90) {
// console.log(students[i]);
// }
// }
// answer
// const result = students.find(function (value) {
// return value.score === 90;
// });
const result = students.find((value) => value.score === 90);
console.log(result);
}
// Q6. make an array of enrolled students
{
// do it yourself!
// const result = students.filter((value) => value.enrolled === true);
// console.log(result);
// // answer
const result = students.filter((student) => student.enrolled === true);
console.log(result);
}
// Q7. make an array containing only the students' scores
// result should be: [45, 80, 90, 66, 88]
{
// do it yourself!
// let result = [];
// for (let i = 0; i < students.length; i++) {
// result.push(students[i].score);
// }
// console.log(result);
// answer
const result = students.map((student) => student.score);
console.log(result);
}
// Q8. check if there is a student with the score lower than 50
{
// do it yourself!
// const result = students.some((student) => student.score < 50);
// console.log(result);
// answer
const result = students.some((student) => student.score < 50);
console.log(result);
const result2 = !students.every((student) => student.score >= 50);
console.log(result2);
}
// Q9. compute students' average score
{
//do it yourself!
// let result = 0;
// for (let i = 0; i < students.length; i++) {
// result += students[i].score;
// }
// console.log(result / 5);
// answer
// const result = students.reduce((prev, curr) => {
// console.log("----------");
// console.log(prev);
// console.log(curr);
// return prev + curr.score;
// }, 0);
const result = students.reduce((prev, curr) => prev + curr.score, 0);
console.log(result / students.length);
}
// Q10. make a string containing all the scores
// result should be: '45, 80, 90, 66, 88'
{
// do it yourself!
// const result = students.map((student) => student.score);
// const resultArray = result.join();
// console.log(resultArray);
// answer
const result = students
.map((student) => student.score)
// .filter((score) => score >= 50)
.join();
console.log(result);
}
// Bonus! do Q10 sorted in ascending order
// result should be: '45, 66, 80, 88, 90'
{
// do it yourself!
// const result = students
// .map((student) => student.score)
// .sort((a, b) => a - b)
// .join();
// console.log(result);
// answer
const result = students
.map((student) => student.score)
.sort((a, b) => a - b)
.join();
console.log(result);
}
8. 배열 제대로 알고 쓰자. 자바스크립트 배열 개념과 APIs 총정리 | 프론트엔드 개발자 입문편 (JavaScript ES6 )
"use strict";
// Array
// 1. Declaration
const arr1 = new Array();
const arr2 = [];
// 2. Index position
const fruits = ["apple", "banana"];
console.log(fruits);
console.log(fruits.length);
console.log(fruits[0]);
console.log(fruits[1]);
console.log(fruits[2]);
console.log(fruits[fruits.length - 1]);
console.clear();
// 3. Looping over an array
// print all fruits
// a. for
for (let i = 0; i < fruits.length; i++) {
console.log(fruits[i]);
}
// b. for of
for (let fruit of fruits) {
console.log(fruit);
}
// c. for each
// fruits.forEach(function (fruit, index) {
// console.log(fruit, index);
// });
// fruits.forEach((fruit, index) => {
// console.log(fruit, index);
// });
// fruits.forEach((fruit, index) => console.log(fruit, index));
fruits.forEach((fruit) => console.log(fruit));
// 4. Addtion, deletion, copy
// push: add an item to the end
fruits.push("strawberry", "peach");
console.log(fruits);
// pop: remove an item from the end
fruits.pop();
fruits.pop();
console.log(fruits);
// unshift: add an item to the beginning
fruits.unshift("strawberry", "peach");
console.log(fruits);
// shift: remove an item from the beginning
fruits.shift();
fruits.shift();
console.log(fruits);
// note!! shift, unshift are slower than pop, push: 나머지 전체가 움직여야 하기 때문에
// splice: remove an item by index position
fruits.push("strawberry", "peach", "lemon");
console.log(fruits);
fruits.splice(1, 1);
console.log(fruits);
fruits.splice(1, 1, "greenapple", "watermelon");
// fruits.splice(1, 0, "greenapple", "watermelon");
console.log(fruits);
// combine two arrays
const fruits2 = ["coconut", "durian"];
const newFruits = fruits.concat(fruits2);
console.log(newFruits);
// 5. Searching
// indexOf: find the index
console.clear();
console.log(fruits);
console.log(fruits.indexOf("apple"));
console.log(fruits.indexOf("lemon"));
console.log(fruits.indexOf("durian")); // 찾는 값이 없을 경우 -1을 출력
// includes
console.log(fruits.includes("durian"));
console.log(fruits.includes("peach"));
// lastIndexOf
console.clear();
fruits.push("apple");
console.log(fruits);
console.log(fruits.indexOf("apple")); // 첫번째 값의 index만 출력
console.log(fruits.lastIndexOf("apple")); // 마지막 값의 index만 출력
object[key]는 변수로 접근하지만, object.key 및 object['key']는 object(객체)의 property(key)에 접근한다.
example 1
let num = {
one: 1,
two: 2,
};
let one = "two";
console.log(num.one); // result: 1 --> num object에서 one이라는 key의 value 값을 출력한다.
console.log(num["one"]); // result: 1 --> num object에서 one이라는 key의 value 값을 출력한다.
console.log(num[one]); // result: 2 --> one이라는 변수에는 num object의 two라는 key 값이 할당되었기 때문에(??뭔지 좀 이해가 안간다..) num object에서 two라는 key의 value 값을 출력한다.
example 2
const user = { name: "Steve", age: 4 };
function printValue(obj, key) {
// console.log(obj.key); undefined --> user라는 object에는 'key'라는 key값이 없기 때문에 발생
// console.log(obj["key"]); undefined --> 위와 동일
console.log(obj[key]); // ['key']가 아니라 [key]를 사용 했다. 변수로 접근. 즉, 아래 printValue의 "name"과 "age"에 해당하는 key의 value 값을 출력한다.
}
printValue(user, "name"); // result: Steve
printValue(user, "age"); // result: 4
크롬 브라우저의 개발자 도구에서 아래와 같이 코드를 작성하면 조금 특이한 결과 값(?)이 나온다.
개발자 도구에서의 console 창은 어떤 명령에 대한 "결과 값"을 표시해주는 역할을 하는데 printNew 변수를 선언한 문장(const printNew)은 그 자체로는 아무런 결과 값을 보여주지 않기 때문에 undefined(첫번째 빨간 상자)가 출력된다. 두 번째 빨간 상자의 undefined도 console.log() 문장에 대한 동일한 결과라고 볼 수 있다.
그렇다면 초록색 상자는 무슨 의미일까?
초록색 상자의 undefined는 printNew 변수에 할당된 함수의 결과 값중 하나로 봐야 하는 것인가?? 함수가 실행되면 먼저 "print"가 출력되고, 이후에는 console.log("print"); 구문 자체에 대한 결과값으로 "undefined"가 출력된 것으로 이해를 해야 하는건지 궁금하다.
5. Arrow Function은 무엇인가 함수의 선언과 표현 프론트엔드 개발자 입문편(JavaScript ES6)
// Function
// - fundamental building block in the program
// - subprogram can be used multiple times
// - performs a task or calculates a value
// 1. Function declaration
// function name(parm1, param2) { body... return;}
// one function === one thing
// naming: doSomething, command, verb
// e.g. createCardAndPoint -> createCard, createPoint
// function is object in JS
"use strict";
function printHello() {
console.log("Hello");
}
printHello();
function log(message) {
console.log(message);
}
log("Hello@2");
log(1234);
// 2. Parameters
// premitive parameters: passed by value
// object parameters: passed by reference
function changeName(obj) {
obj.name = "coder";
}
const ellie = { name: "ellie" };
changeName(ellie);
console.log(ellie);
// 3. Default parameter (added in ES6)
// function showMessage(message, from) {
// if (from === undefined) {
// from = "unknown";
// }
// console.log(`${message} by ${from}`);
// }
// showMessage("Hi!");
function showMessage(message, from = "unknown") {
console.log(`${message} by ${from}`);
}
showMessage("Hi!");
// 4. Rest parameter (add in ES6)
function printAll(...args) {
// ... 배열 형태로 전달한다.
for (let i = 0; i < args.length; i++) {
console.log(args[i]);
}
for (const arg of args) {
console.log(arg);
}
args.forEach((arg) => console.log(arg));
}
printAll("dreaqm", "coding", "ellie");
// 5. Local scope (밖에서는 안이 보이지 않고, 안에서민 밖을 볼 수 있다.)
let globalMessage = "global"; // global variable
function printMessage() {
let message = "hello";
console.log(message); // local variable
console.log(globalMessage);
function printAnother() {
console.log(message);
let childMessage = "happy";
}
// console.log(childMessage); // error
return undefined; // 생략 가능
}
printMessage();
// 6. Return a value
function sum(a, b) {
return a + b;
}
const result = sum(1, 2); // 3
console.log(`sun: ${sum(1, 2)}`);
// 7. Early return, early exit
// bad
function upgradeUser(user) {
if (user.point > 10) {
// long upgrade logic...
}
}
// good (조건이 맞지 않을 때는 바로 return 해서 함수를 종료하고 조건이 맞을때만 로직 실행하도록!)
function upgradeUser(user) {
if (user.point <= 10) {
return;
}
//long upgrade logic...
}
// First-class function
// functions are treated like any other variable
// can be assigned as a value to variable
// can be passed as an argument to other functions.
// can be returned by another function
// 1. Function expresstion
// a function declaration can be called earlier than it is defined. (hoisted) -> function print() {}
// a function expresstion is created when the execution reaches it. -> const print = funtcion () {}
const print = function () {
// anonymous function
console.log("print");
};
print();
const printAgain = print;
printAgain();
const sumAgain = sum;
console.log(sumAgain(1, 3));
// 2. Callback function using function expression
function randomQuiz(answer, printYes, printNo) {
if (answer === "love you") {
printYes();
} else {
printNo();
}
}
// anonymous function
const printYes = function () {
console.log("yes!");
};
// named function
// better debugging in debugger's stack traces
// recursions
const printNo = function print() {
console.log("no!");
};
randomQuiz("wrong", printYes, printNo);
randomQuiz("love you", printYes, print);
// Arrow function
// always anonymous
// const simplePrint = function () {
// console.log("simplePrint!");
// };
const simplePrint = () => console.log("simplePrint");
const add = (a, b) => a + b;
const simpleMuliply = (a, b) => {
// do something more
return a * b;
};
// IIFE: Immediately Invoked Function Expression
(function hello() {
console.log("Hello!");
})();
// Fun Quiz time
// function caluate(command, a, b)
// command: add, substract, devide, multiply, remainder
function calculate(command, a, b) {
if (
command !== "add" &&
command !== "substract" &&
command !== "divide" &&
command !== "multiply" &&
command !== "remainder"
) {
console.log("wrong!");
} else if (command === "add") {
console.log(`${command}: ${a} + ${b} =`, a + b);
} else if (command === "substract") {
console.log(`${command}: ${a} + ${b} =`, a - b);
} else if (command === "divide") {
console.log(`${command}: ${a} + ${b} =`, a / b);
} else if (command === "multiply") {
console.log(`${command}: ${a} + ${b} =`, a * b);
} else if (command === "remainder") {
console.log(`${command}: ${a} + ${b} =`, a % b);
}
}
calculate("remainder", 5, 2);
// ellie's answer
function calculate(command, a, b) {
switch (command) {
case "add":
return a + b;
case "substract":
return a - b;
case "divide":
return a / b;
case "multiply":
return a * b;
case "remainder":
return a % b;
default:
throw Error("unknown command");
}
}
var birthYear = 1981; // var(변수) birthYear(변수명) = 1981(데이터)
var birthYear = 1980;
console.log(birthYear) // 1980
/* var 변수의 특징
1. 변수명 재선언이 가능하다.
2. 코드 전체에서 사용이 가능하다.
3. 위 두가지 특징으로 인해 코드가 복잡해질 경우, 어디서 사용되고 있는지 파악이 힘들고 값이 바뀔 우려가 있다.
*/
let(ES6 이후)
let birthYear = 1981; // let(변수) birthYear(변수명) = 1981(데이터)
birthYear = 1980;
console.log(birthYear) // 1980
/* let 변수의 특징
1. 변수명 재선언이 불가능하다.
2. 변수값 재할당이 가능하다.
3. 특정 블록({})을 벗어나면 사용할 수 없다.
*/
const(ES6 이후)
const birthYear = 1981; // const(변수) birthYear(변수명) = 1981(데이터)
/* const 변수의 특징
1. 변수명 재선언이 불가능하다.
2. 변수값 재할당이 불가능하다.
*/