TIL 21.09.26 Javascript
▼▼▼関数
함수는 가급적 한가지 일만 하고, 매개 변수는 최대 3개 이내로 작성을 권장한다.
▼▼▼関数の表示方法
1.関数宣言
function func(arg1, arg2, ...argN) {
expression;
}
2.関数式const func = function (arg1, arg2, ... argN) {
expression;
}
3.矢印関数const func = (arg1, arg2, ... argN) => expression;
expressin 부분을 return 처리한다.
▼▼▼関数を呼び出す
JavaScript関数では、パラメータと引数の数が一致しているかどうかはチェックされません.
const func = function(x, y, z) {
return x;
}
위와 같이 작성해도 error를 내지 않는다.
未定義の変数を入力すると、値の初期化を指定できます.const func = function(x, y = 10) {
console.log(x+y);
}
func(20) // output: 30
func() // NaN => x에 undefiend 값이 들어가고, NaN => console.log(undefined + 10)
dynamic parameter1. 매개변수를 명시하지 않아도 매개변수를 사용할 수 있다.
const arg = function() {
console.log(arguments)
}
arg(1, 2) // [Arguments] {'0': 1, '1': 2}
const func = function() {
console.log(arguments[0] - arguments[1]); // 인자로 들어온 값을 arguments에 저장
}
func(10); // NaN => 10 - undefined이므로
func(10, 20, 30); // -10 => 10 - 20
2. return 에 대하여
기본 return 값은 undefined 이며 break와 같은 역할을 한다.
▼▼▼再帰関数
함수 스스로 자신을 참조해 호출하면서 동일한 코드가 계속 수행되는 함수 호출 방법.
특정 조건이 됐을 때 호출이 중단되도록 기저조건(exit code)이 필요.
재귀 함수는 stack에 의해서 관리되어진다.
//Factorial
const recursive = function(num) {
return num * recursive(num-1)
}
//Fibonacci
const recursive = function(num) {
if (num < 0) return "Nothing"
if (num == 0) return 0
if (num == 1) return 1
return recursive(num-1) + recursive(num-2)
}
#コールバック関数
コールバック関数は、別の関数に渡されるパラメータで実行される関数です.
function callback_func() {
console.log("I'm callback function");
}
なぜコールバック関数をスキップしますか?아래 계산기를 만드는 코드를 통해 이해할 수 있는데 필요한 함수를 고차함수에 인자로 넣어 줌으로써
고차함수 calculator 하나를 통해 계산기를 만들 수 있다.
function add(x,y) {
return x + y;
}
function sub(x,y) {
return x - y;
}
function mul(x,y) {
return x * y;
}
function div(x,y) {
return x / y;
}
function calculator(callback, x, y) {
return callback(x, y)
}
高次関数
パラメータ受信関数によって呼び出された関数は,高次関数がパラメータとしてコールバック関数のアドレス値を受信する.
function callback() {
console.log("I'm callback function");
}
function higher_order_func(callback) {
console.log("I'm higher-order function");
callback(); //call
}
higher_order_func(callback); // I'm higher-order function
// I'm callback function
✏️ call by *
✏️ call by value
値コピーによる関数でのパラメータ値の変更は影響しません
元のタイプをパラメータに渡すときに発生します.
아래 코드를 살펴보면 값에 대한 복사가 이루어졌을 때에는(매개변수 b에 변수 a가 들어가게 될 때에는) b = a = 1
의 과정을 거쳐 b라는 새로운 메모리 공간에 값 '1'이 저장되기 때문에 'b = b + 1'이 있어도 a에 영향을 미치지
않아 console.log(a);를 했을 때 output이 '1'임을 알 수 있다.
let a = 1;
let add = function(b) {b = b + 1}; // callee
add(a); // caller
console.log(a); // output: 1
✏️ call by reference
関数でパラメータ内の値をアドレスのコピーとして変更すると、元のデータも影響を受けます.
オブジェクトタイプ(objecttype)をパラメータに渡すと発生します.
아래 코드를 통해 call by reference에 대해 알아보자.
함수 add는 매개변수 b를 갖는다. add(a); 함수 호출을 통해 매개변수 b에 a라는 객체가 담기게 되면 매개변수
b는 a객체의 주소 값을 값으로 갖게 되고(참조하게 되고) 객체 a는 {v: 1}이 있는 메모리 주소를 값으로 갖고
있으므로 (참조하고 있으므로) add(a); 호출시 a가 참조하고 있는 a.v에 접근하게 되므로 원본 데이터에 영향을
끼치게 되는 것이다.
var a = {v: 1};
var add = function (b) {b.v = b.v + 1;}; //callee
add(a); //caller
console.log(a.v); //output: 2
▼▼▼関数の表示
▼▼▼関数のアドレス値
아래의 코드를 통해 add_2 변수 또한 add_1 함수와 동일한 기능을 하는 것을 볼 수 있는데
이를 통해 변수 add_2에 함수 add_1의 주소값이 들어가 있다는 사실을 알 수 있다.
function add_1(x,y) {
return x + y;
}
const add_2 = add_1
console.log(add_2(1,2)); // output: 3
add2에 add1의 어떤 것이 복사가 됐는지 내부를 통해 살펴보기로 하자.
console.log(Object.getOwnPropertyDescriptors(add_1));
console.log(Object.getOwnPropertyDescriptors(add_2));
위 console.log를 통해 각각 add_1과 add_2의 내부이다. 비교해 보면 알 수 있듯이 동일하다.
⭐ add_1, add_2 변수의 이름만 다를 뿐 내용은 같고 이를 통해 add_2가 add_1이 가리키고 있는 메모리주소만을
참조하고 있다는 점을 알 수 있다. 즉 함수도 객체의 요소로서 메모리 공간에 저장되는 것이다.
{
length: { value: 2, writable: false, enumerable: false, configurable: true },
name: {
value: 'add_1',
writable: false,
enumerable: false,
configurable: true
},
arguments: {
value: null,
writable: false,
enumerable: false,
configurable: false
},
caller: {
value: null,
writable: false,
enumerable: false,
configurable: false
},
prototype: { value: {}, writable: true, enumerable: false, configurable: false }
}
{
length: { value: 2, writable: false, enumerable: false, configurable: true },
name: {
value: 'add_1',
writable: false,
enumerable: false,
configurable: true
},
arguments: {
value: null,
writable: false,
enumerable: false,
configurable: false
},
caller: {
value: null,
writable: false,
enumerable: false,
configurable: false
},
prototype: { value: {}, writable: true, enumerable: false, configurable: false }
}
▼▼▼関数の保存と呼び出し
위에서 함수가 변수에 저장될 때 요소로서 저장이 되는 것을 살펴보았다. 이번에는 함수가 리스트 객체에 담겨 있을
때 함수를 호출하는 방법에 대해서 살펴보자.
function f1() {
console.log('f1 호출');
}
f1(); // f1 호출
let list = [1, "john", function f2() {console.log('f2 호출');}]
list[2](); // f2 호출
let obj = {
name : "john",
age: 27,
f3() {
console.log('f3 호출');
}
}
obj.f3(); // f3 호출
▼▼▼方法の理解
オブジェクトに格納されている値が関数である場合、メソッド(method)と呼ばれます.
user라는 객체가 있을 때 메모리상에서 어떻게 저장되는지 보여주는 도식화이다. 여기서 hello_func이 메서드가 되고
메서드는 또다른 주소 값을 참조하고 있는 것을 볼 수 있다.
✏️ this
메서드에서 객체 내부의 속성(property) 값에 접근할 수 있는 지시자
함수 코드 block안에서 this를 사용시 함수와 동일 선상에 있는 공간의 property의 값에 접근할 수 있다.
여기서 property로 name, age가 있다.
this 예제
let user = {name: 'john'};
let admin = {name: 'admin'};
function hello() {
console.log("Hello " + this.name);
}
user.func = hello;
admin.func = hello;
user.func(); // output: Hello john
admin.func(); // output: Hello admin
✏️ Number
しすうひょうじほう
아주 큰 숫자나 아주 작은 숫자를 표기하기 위해 지수표기법(e)로 0의 개수를 대체 표기 가능
let billion = 1e9; //10**9
let us = 1e-6; // 왼쪽으로 6번 소수점 이동
構文
0x => 16진수
0o => 8진수
0b => 2진수
console.log(0x0f); // output: 15
console.log(0o17); // output: 15
console.log(ob1111); // output: 15
Number定数値
지수로 표기되는 양수 최대 값
Number.MAX_VALUE
지수로 표기되는 양수 최소 값
Number.MIN_VALUE
안전하게 표기되는 양수 최대값
Number.MAX_SAFE_INTEGER
안전하게 표기되는 음수 최소값
Number.MIN_SAFE_INTEGER
무한대 양수 값
Number.POSITIVE_INFINITY
무한대 음수 값
Number.NEGATIVE_INFINITY
부동 소수점으로 정의되지 않거나 표현할 수 없는 값
NUMBER.NaN
代表メソッド
Number.toString();
String(Number);
Number + ""
ビット数表示
Number.toFixed(n)
소수점 n번째까지 보여주는데 n+1에서 반올림해서 보여준다.
toPrecision(n)
정수자리 포함 n번째까지 보여주고 n+1에서 반올림해서 보여준다.
代表メソッド2
Number 자료형 확인
Number.isNaN()
Number.isFinite()
정수와 실수 형 변환
Number.parseInt()
Number.parseFloat()
Reference
この問題について(TIL 21.09.26 Javascript), 我々は、より多くの情報をここで見つけました https://velog.io/@woodstock1993/TIL-21.09.26-Javascriptテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol