- 세미콜론(;): 한줄이 끝났다는 의미로 생략해도 상관없지만 써주는 게 좋음
- 따옴표("", ''), 백틱(``): 문자열(string)은 항상 따옴표로 감싸준다. 홑/겹따옴표 뭘 쓰든 상관없음.
- 역슬래시(\): 특수문자를 인식하도록 앞에 써줌
- 변수명으로 쓸 수 없는 Reserved Words가 있다.
변수 선언 룰
1. 문자, 숫자, $, _만 사용
2. 첫글자는 숫자X
3. 예약어는 사용X
4. 상수는 가급적 대문자로
5. 변수명은 읽기 쉽고 이해할 수 있게
let, const
let grade = "C+";
grade = "A+"; //let으로 선언된 변수는 값 재할당 가능
let grade = "B0"; //let으로 선언된 변수는 재선언 불가
/*Uncaught SyntaxError: Identifier 'grade' has already been declared*/
const grade = "C+";
grade = "A+"; //const로 선언된 변수는 재선언, 재할당 불가
/*Uncaught TypeError: Assignment to constant variable.*/
const name = "Mac";
const message = `My PC brand is ${name}. 중고로 ${100-20}만원.`;
console.log(message);
const number = 1/0;
const name = "Mike";
const x = name/2;
console.log(number, x);
console.log(typeof null); // "object"
- typeof: 자료형을 알아내는 연산자
다른 개발자가 작성한 변수, API통신으로 받은 데이터의 자료형을 알아야할 때
*modal창
장점
1. 빠르고 쉽게 적용할 수 있다
단점
1. 창이 떠있는 동안 스크립트 일시 정지
2. 스타일링X (뜨는 위치와 모양이 정해져있고 브라우저마다 다름)
const name = prompt("이름을 입력하세요");
alert("환영합니다, " +name+ "님");
// == alert(`환영합니다, ${name}님`);
// 취소 누르면 환영합니다, null님
// 입력없이 확인 누르면 환영합니다, 님
const date = prompt("날짜를 입력하세요", "2022-10-");
alert(`오늘 날짜는 ${date}입니다.`);
const date = confirm("장비를 삭제하겠습니까?");
console.log(date);
첫글자는 대문자로~
const mat = prompt("수학은 몇점입니까?"); //90
const eng = prompt("영어는 몇점입니까?"); //80
const avg = (mat + eng)/2; //4540
console.log(avg);
// prompt()로 입력받은 값은 문자형이다
// "9080" 문자형이어도 나눗셈은 숫자형으로 '자동 형변환'된다
// 의도에 맞게 '명시적 형변환'하는 게 좋다
// -> const avg = (Number(mat) + Number(eng))/2;
console.log(String(3)); //"3"
console.log(Number("12fwww"), Number(true), Number(false),
Number(null), Number(undefined)); //NaN 1 0 0 NaN
console.log(Boolean(0), Boolean(""),
Boolean(null), Boolean(undefined), Boolean(NaN)
); //false false false false false
//Boolean형변환은 위의 경우 외엔 true이다
console.log(Boolean(0), Boolean('0')); //false true
console.log(Boolean(''), Boolean(' ')); //false true
num = num + 5; // num += 5
num = num - 5; // num -= 5
num = num * 5; // num *= 5
num = num / 5; // num /= 5
num = num % 5; // num %= 5
let num = 10;
let result = ++num;
console.log(num, result); //11 11
let num = 10;
let result2 = num++;
console.log(num, result2); //11 10
// 증가연산자를 뒤에 붙이면 'let result2 = num'까지만 출력함
비교연산자
가급적 일치연산자(===)을 쓰자
조건문
if(){}else if(){}문
논리연산자
||(OR) : 첫번째 true를 발견하는 즉시 평가 멈춤 == true
&&(AND): 첫번째 false를 발견하는 즉시 평가 멈춤 == false
!(NOT) :
num = !a; // a가 false이면 num은 true
*성능 최적화 측면에서 많이 거를 수 있는 조건을 앞에 써주는 것이 좋음
나이를 입력받아 성인이 아니면 돌아가라고 하기
const age = prompt('나이는?');
const isAge = age > 19;
if(!isAge){
console.log('돌아가시오');
}
조건을 확인해서 false이면 반복문을 빠져나옴
for(let i=0; i<10; i++){
//코드
}
조건을 확인하고 코드를 실행
let i=0;
for(i<10){
//코드
i++;
}
코드를 실행한 후 조건을 확인
let i=0;
do{
//코드
i++;
}while(i<10)
break: 반복문을 멈추고 빠져나옴
continue: 반복문을 멈추고 다음 반복으로 진행
확인을 누르면 확인창을 계속 띄우고, 취소를 누르면 확인창을 닫도록
while(true){
let answer = confirm('계속 할까요?');
if(!answer){
break;
}
}
10이하 자연수 중 짝수만 출력하는 함수
for(let i=1; i<=10; i++){
if(i%2){
continue;
}
console.log(i);
}
switch는 한 case가 조건에 맞으면 이후의 case도 모두 실행하기 때문에 break를 넣어준다
let name = prompt('당신의 소원은?');
switch(name){
case '부' : //결과가 동일할 때 이렇게 줄여쓸 수 있음.
case '돈' :
console.log("100만원 입니다");
break;
case '명예' :
console.log("명예 입니다");
break;
case '불로불사' :
console.log("당신은 늙지도 죽지도 않습니다");
break;
default : //if문의 else같은 것
console.log("그런 소원은 이뤄줄 수 없습니다");
}
function sayHello(name){
let msg = 'Hello'; //지역변수 msg는 함수 내부에서만 사용
if(name){
msg += ', ' + name;
// 또는 msg = `Hello, ${name}`;
// 또는 msg += `, ${name}`;
}
console.log(msg);
}
sayHello(); // "Hello"
// name이 undefined이기 때문에 if문 조건이 false가 됨.
sayHello("Mike"); // "Hello, Mike"
전역변수(global variable): 어디서나 접근 가능
지역변수(local variable): 함수 내부에서만 접근 가능
let msg = 'Hello'; //전역변수 msg는 함수 내외부 모두 접근
console.log("함수 호출 전: "+ msg);
function sayHello(name){
if(name){
msg += `, ${name}`;
}
console.log("함수 내부: "+ msg);
}
sayHello("Mike");
console.log("함수 호출 후: "+ msg);
let으로 선언했더라도 지역변수,전역변수로 구분되어 있다면 재선언 할 수 있다
지역변수와 전역변수는 서로 영향을 받지 않는다
let msg = "welcome"; //전역변수
console.log(msg); // "welcome"
function sayHello(name){
let msg = "Hello"; //지역변수
console.log(msg+' '+name);
}
sayHello("Mike"); // "Hello Mike"
console.log(msg); // "welcome"
||(OR)
function sayHello(name){
let newName = name || "friend";
let msg = `Hello, ${newName}`;
console.log(msg);
}
say Hello(); // "Hello, friend"
// 매개변수가 없으면 undefined가 들어가기 때문에
// name은 false가 되고, 마지막 true인 "friend"를 반환함
say Hello('Jane'); // "Hello, Jane"
default값을 'friend'로 설정하는 방법
function sayHello(name = 'friend'){
let msg = `Hello, ${name}`;
console.log(msg)
}
sayHello(); // "Hello, friend"
sayHello('Jane'); // "Hello, Jane"
function showError(){
alert('에러가 발생했습니다');
}
function showError2(){
alert('에러가 또 발생했습니다');
return;
alert('이 코드는 절대 실행되지 않습니다');
}
console.log(showError(), showError2()); // undefined undefined
👉 더 자유롭고 편하게 코딩할 수 있어
sayHello(); //"Hello"
function sayHello(){
console.log("Hello");
}
인터프리터 언어(Interpreted Language)
: 순차적으로 한줄씩 실행되어 즉시 반환하는 언어자바스크립트 내부 알고리즘
실행전 초기화 단계: 모든 선언문을 찾아서 '선언된 함수 모임'을 생성
따라서, 함수의 사용가능한 범위가 올라감(=호이스팅).
(실제로 코드가 올라간다는 건 아님)
let sayHello = function(){ // 1. 생성
console.log('Hello'); // 2. 사용가능
}
sayHello();
함수를 간결하게 작성
다음을 화살표 함수로 바꾸어라
function add(a,b){
return a+b;
}
👉
let add = function(a,b){
return a+b;
}
👉👉
let add = (a,b)=>{
return a+b;
}
👉👉👉 코드가 한줄이고 return문이므로 이렇게 바꿀 수 있다
let add = (a,b)=>(a+b;)
let add = (a,b)=>a+b;
인수가 하나인 함수를 화살표 함수로 바꾸어라
let showDate = function(date){
return `Today: ${date}`;
}
👉
let showDate = date => `Today: ${date}`; // 괄호를 생략
인수가 없는 함수를 화살표 함수로 바꾸어라
let showError = function(){
alert('ERROR!');
}
👉
let showError = () =>{ // 괄호 생략X
alert('ERROR!');
}
return문이 있어도 코드가 여러줄일 때 화살표함수로
let add = fucntion(a,b){
const result = a+b;
return result;
}
👉
let add = (a,b) => { // 괄호를 생략X
const result = a+b;
return result;
}
객체에 대해 성인이면 true, 성인이 아니면 false를 반환하는 함수
function isAddult(user){
if(!('age' in user)|| // 프로퍼티 age가 없거나
user.age<20){ // 20세 미만이면
// 존재하지 않는 프로퍼티의 초기값: undefined
// user.age<20 만 조건으로 하면 항상 true를 반환
return false;
}
return true;
}
const Mike = {
name: "Mike",
age: 30
};
const Jane = {
name: "Jane"
};
console.log(isAddult(Jane));
fly()함수가 superman객체의 메소드
이렇게 function 키워드 생략 가능
const superman={
name: 'clark',
age: 33,
fly(){console.log('날아갑니다.')}
}
화살표 함수는 일반 함수와 달리 자신만의 this를 가지지 않는다
화살표 함수 내부에서 this를 사용하면 그 this는 외부에서 값을 가져 옴
let boy = {
name: "Mike",
sayHello: function(){
console.log(`Hello, I'm ${this.name}`); //this = boy
}
}
let girl = {
name: "Jane",
sayHello: function(){
console.log(`Hello, I'm ${this.name}`); //this = girl
}
}
boy.sayHello(); // Hello, I'm Mike
girl.sayHello(); // Hello, I'm Jane
브라우저 환경: window
Node js: global
let boy = {
name: "Mike",
sayHello: ()=>{
console.log(`Hello, I'm ${this.name}`); //this != boy
}
}
boy.sayHello();
let boy = {
name: "Mike",
showName: function(){
// console.log(boy.name); boy가 null이 되어 Type error
console.log(this.name);
}
}
let man = boy; //Mike에게 boy, man 2개의 별명이 생긴 셈..
boy = null;
man.showName(); // "Mike"
let boy = {
name: "Mike",
sayThis: () => {
console.log(this); //화살표함수에서 this는 window를 가리킴
}
}
boy.sayThis();
메소드 push, pop