[JS] 6. Basic Object
in JS
1. method
함수의 표현
function add1(x, y) {
return x + y;
}
const add2 = function (x, y) {
return x + y;
};
const add3 = (x, y) => x + y;
const add4 = add1
console.log(add4(1,3)) //4
console.log(add1 == add2) //false 선언된 메모리 영역이 다르기 때문
console.log(add1 == add4) //true 참조하는 주솟값이 같기 때문
console.log(Object.getOwnPropertyDescriptors(add1))
console.log(Object.getOwnPropertyDescriptors(add2))
console.log(Object.getOwnPropertyDescriptors(add3)) //다른 선언식보다 짧다
console.log(Object.getOwnPropertyDescriptors(add4)) //name[value]: 'add1'
- 다양한 방법으로 함수 정의가 가능하며, 함수 표현식처럼 함수를 정의하여 변수에 저장 가능
함수 저장
let list = [
"jnh",
25,
function hello() {
console.log("hello");
},
];
let obj = {
name: 'jnh',
age: 25,
hello() {
console.log("hello")
}
}
function hello() {
console.log("hello")
}
hello() //hello
obj.hello() //hello
list[2]() //hello
console.log(typeof hello) //function
console.log(typeof obj.hello) //function
console.log(typeof list[2]) //function
- 배열의 요소(element) 혹은 객체의 속성(property)에 함수를 정의하여 저장 가능
method
let obj = {
name: 'jnh',
age: 25,
hello() {
console.log("hello")
}
}
- 객체에 저장된 값이 함수인 경우, 이를 메서드라고 부른다.
method 변경
function hello() {
console.log("hello")
}
function hi() {
console.log("hi")
}
let obj = {
name: "jnh",
age: 25,
func: hello
}
hello()
hi()
obj.func()
obj.func = hi //hello
obj.func() //hi
// 함수 주소값 변경 가능하다
console.log(hi === obj.func) // true
- 객체 내 초기 선언된 함수를 다른 함수로 변경
this
let user = {name:"jnh"}
let admin = {name:"admin"}
function hello() {
console.log("hello " + this.name)
}
user.func = hello
admin.func = hello
user.func()
admin.func()
// 또다른 호출 방법
user["func"]()
admin["func"]()
- 메서드의 객체 내부의 속성(property) 값을 접근할 수 있는 지시자
this로 접근하면 객체의 메모리가 가리키는 주소로 이동하기 때문에 같은 객체 내의 다른 요소로 접근 가능하다.
- 객체별로 동일한 속성을 갖고 있지만 다른 데이터를 핸들링 할 수 있는 것이 oop의 장점
2. Number
- js에서 일반적인 숫자는 64비트 형식의 IEEE-754 표준 기반 형태로 저장되는 자료형
- 10진수 외에도 16진수, 2진수, 8진수의 다양한 진수 사용
- 16진수 표기 : 0xFF
- 8진수 표기 : 0o71
- 2진수 표기 : 0b1101
- 대표 상수 값 :
[MAX|MIN]_VALUE,
[MAX|MIN]_SAFE_INTEGER
,[POSITIVE|NEGATIVE]_INFINITY
,NaN
- 대표 메서드
- 문자열로 변환 :
Number.toString()
- 특정 자리수까지 제한하여 숫자 표현 :
Number.toFixed()
,Number.toPrecision()
- 타입 확인 :
Number.isNaN()
,Number.isFinite()
지수 표기법
let billion1 = 1000000000;
let billion2 = 1e9;
let us = 1e-6;
console.log(billion1); //1000000000
console.log(billion2); //
console.log(us); //0.000001
- 아주 큰 숫자나 아주 작은 숫자를 표기하기 위해 지수 표기법(e)으로 0의 개수를 대체 표기 가능
진법 표기
console.log(0x0f) //15
console.log(0o17) //15
console.log(0b1111) //15
- 진법 표기를 지원하기 위해 0x(16진수), 0o(8진수), 0b(2진수) 로 N 진수 표기 가능
Number 상수 값
console.log(Number.MAX_VALUE) //1.7976931348623157e+308
console.log(Number.MIN_VALUE) //5e-324
console.log(Number.MAX_SAFE_INTEGER) //9007199254740991
console.log(Number.MIN_SAFE_INTEGER) //-9007199254740991
console.log(Number.POSITIVE_INFINITY) //Infinity
console.log(Number.NEGATIVE_INFINITY) //-Infinity
console.log(Number.NaN) //NaN
- 지수로 표기되는 양수 최대/최소 값:
Number.MAX_VALUE
,Number.MIN_VALUE
- 안전하게 표기되는 최대(양수)/최소(음수) 값 :
Number.MAX_SAFE_INTEGER
,Number.MIN_SAFE_INTEGER
- 무한대 양수/음수 값:
Number.POSITIVE_INFINITY
,Number.NEGATIVE_INFINITY
- 부동 소수점 산술에서 정의되지 않거나 표현할 수 없는 값으로 해석될 수 있는 숫자 데이터 유형:
Number.NaN
대표 메서드 - 형 변환
let us = 1e-6
console.log(us.toString()) //0.000001
console.log(typeof us.toString()) //string
console.log(typeof String(us)) //string
console.log(typeof (us + "")) //string
- Number to String:
Number.toString()
,String(Number)
,Number+""
를 통해 변환 가능
대표 메서드 - 자리 수 표현
let num1 = 234.0;
let num2 = 123.456;
console.log(num1-num2) //110.544
console.log((num1 - num2).toFixed(3)) //110.544
console.log((num1 - num2).toPrecision(3)) //111 (정수가 이미 3자리 다 차지하여 소수점 미출력)
- 소수의 자리 수 길이를 제한 :
Number.toFixed(pos)
- 정수와 소수의 자리 수를 합한 길이로 제한 :
Number.toPrecision(pos)
대표 메서드 - Number 자료형 확인
console.log(Number.isNaN(0.123)) // false
console.log(!Number.isNaN(0.123 / "hello")) // false
// 유한수인지
console.log(Number.isFinite(123)) // true
console.log(Number.isFinite(Infinity)) // false
console.log(Number.isFinite("hello")) // false
- 부동 소수점 산술에서 정의되지 않거나 표현할 수 없는 값(NaN)인지 확인 :
Number.isNan()
- 정상적인 유한수인지 확인 :
Number.isFinite()
대표 메서드 - 정수와 실수 형 변환
console.log(Number.parseInt("123.123")) // 123
console.log(Number.parseInt("123문자")) // 123
console.log(parseInt("123문자")) // 123 사실상 같다!
console.log(Number.parseFloat("123.23em")) // 123.23
- 정수로 변환하는 방법(N 진수로 명시적 변환도 가능):
Number.parseInt()
- 실수로 변환하는 방법 :
Number.parseFloat()
3. String
- 텍스트 길이에 상관없이 문자열 형태로 저장되는 자료형
- js 에서는 글자 하나만 저장할 수 있는 char 자료형이 없다.
- js 에서 문자열은 페이지 인코딩 방식과 상관없이 항상 utf-16 형식을 따른다
- 문자열 길이 :
String.length
- 문자열 접근 :
String.charAt(index)
,String.charCodeAt(index)
- 문자열 검색 :
String.indexOf()
,String.lastIndexOf()
,String.includes()
,String.startsWith()
- 문자열 변환 :
String.toUpperCase()
,String.toLowerCase()
- 문자열 치환 :
String.replace()
- 문자열 추출 :
String.slice()
,String.substring()
,String.substr()
- 문자열 분할 :
String.split()
정의 방법
- “hello”, ‘hello’, String()
- 문자열과 변수 혼합 표현 방법 : 역 따옴표
문자 표기
console.log("line\nfeed") //개행
console.log("line\rfeed") // 개행
console.log("line\\feed") // \ 출력
console.log("line\tfeed") // line feed
console.log("line\u{1F60D}feed") // line😍feed
- Line feed(\n), Carriage return(\r), Backslash(\), Tab(\t), Unicode(\u{})
문자열 길이
let str = `hello
world
!!!`
let str2 = "hello\nworld\t!!\\"
console.log(str.length) //15
console.log(str2.length) //15
// 개행도 포함된다
String.length
문자 접근
let str = "hello world"
console.log(str.charAt(4)) //o
console.log(str.charCodeAt(4)) //111 해당 문자의 아스키코드 값
console.log(str[4]) //o
- 문자열 내 개별 문자 접근 방법 :
String.charAt(index)
,String.charCodeAt(index)
,String[index]
문자열 검색
let str = "hello world!!"
console.log(str.indexOf("l")) //2
console.log(str.indexOf("l", 4)) //9 4번째 이후부터 찾아라
console.log(str.lastIndexOf("l")) //9 뒤에서부터 찾아줘
console.log(str.includes("hello")) //true
console.log(str.includes("Hello")) //false 대소문자 구분한다.
console.log(str.includes("ello")) //true
console.log(str.startsWith("ello")) //false
console.log(str.startsWith("ello", 1)) //true 첫번째부터 찾아라
console.log(str.endsWith("world")) //false
console.log(str.endsWith("d!!")) //true
- 문자열 검색(index) :
String.indexOf(substr, pos)
,String.lastIndexOf(substr, pos)
- pos : 어디서부터 찾을지
- 문자열 검색(bool) :
String.includes(substr, pos)
,String.startsWith(substr, pos)
,String.endsWith(substr, pos)
문자열 대소문자 변환
let str = "helLo world!!"
console.log(str.toUpperCase()) //HELLO WORLD!!
console.log(str.toLowerCase()) //hello world!!
- 대소문자 변환 :
String.toUpperCase()
,String.toLowerCase()
4. 문자열 변환
문자열 치환
let text = "HelLo world!!!"
let changed_text = ""
changed_text = text.replace("world", "earth")
console.log(changed_text) //Hello earth!
changed_text = text.replace("!", "?")
console.log(changed_text) //Hello world?!! 하나만 변경
// 전부다 바꾸고 싶다면? > 정규식 활용
changed_text = text.replace(/!/g, "?")
console.log(changed_text) //HelLo world???
// 대소문자 구분없이 전부다 바꾸고싶다면?
changed_text = text.replace(/l/gi, "T")
console.log(changed_text) //HeTTo worTd!!!
- 처음 만나는 요소 문자열 치환(치환된 문자열 반환) :
String.replace(origin_str, change_str)
- 정규 표현식 활용 문자열 치환 : 치환 문자열에 청규 표현식 기입 > /치환문자열/g(전체):i(대소문자 구분X)
문자열 추출
let text = "HelLo world!!!"
console.log(text.slice(0, 5)) //HelLo
console.log(text.slice(4)) //o world!!!
console.log(text.slice(-4)) //d!!!
console.log(text.(2, 6)) //lLo
console.log(text.slice(2, 6)) //lLo
// 둘이 결과 값 같다.
console.log(text.substring(6, 2)) //lLo 내부적으로 알아서 바껴서 돈다.
console.log(text.slice(6, 2)) //돌지 않는다.
// 보통은 알고리즘적으로 실행 못하게 하기 위해 slice 를 지향한다.
console.log(text.substr(2, 6)) //lLo wo
console.log(text.substr(-5, 3)) //ld!
- 위치 기반 문자열 추출 :
String.slice(start, end)
,String.substring(start, end)
- 길이 기반 문자열 추출 :
String.substr(start, length)
문자열 분할
let fruits = "apple banana melon"
let result = fruits.split(" ")
console.log(result) //[ 'apple', 'banana', 'melon' ]
let fruits2 = "apple,banana,melon"
let result2 = fruits2.split(",")
console.log(result2) //[ 'apple', 'banana', 'melon' ]
// 문자 하나하나 끊으려면?
let text = "hello"
let result3 = text.split("")
console.log(result3) //[ 'h', 'e', 'l', 'l', 'o' ]
// 문자 하나하나 끊는데 3개만 필요해
let result4 = text.split("", 3)
console.log(result4) //[ 'h', 'e', 'l' ]
- 배열로 문자열 분할 :
String.split(Separator, limit)
나의 회고 🤫
메서드와 함수를 단순히 비슷한 것이라고 여기고 있었는데 메서드는 객체 내에 정의된 함수에 한한다는 내용을 알게 되었다.
또한 this가 해당 객체의 메모리 주소 값을 가르키면서 해당 객체의 다른 속성에 접근할 수 있다는 내부적인 사실도 알게 되었다.
number와 string에 관련된 다양한 함수를 써보면서 다양한 내장함수들의 기능을 알아두면 좋을 것 같다!