Symbol 타입을 제외하고는 전부 문자열 타입으로 변환이 가능하다.
1+ '2' // "12"
`1 + 1 = ${1 + 1}` // "1 + 1 = 2"
(Symbol()) + '' // TypeError
1 - '1'// 0
1 * '10' // 10
1 / 'one' // NaN
+Symbol() // TypeError
Truethy: true, 0이 아닌 숫자 값, 비어있지 않은 문자열
Falsy: false, undefined, null, 0, -0, NaN, '' (empty string)
명시적으로 타입을 변경하는 방법
// 1. String 생성자 함수 사용
String(1);
// 2. Object.prototype.toString 메서드 사용
(1).toString();
// 3. 문자열 연결 연산자
1 + '';
// 1. Number 생성자 함수 사용
Number(1);
// 2. parseInt, parseFloat 사용
parseInt('1');
// 3. + 단항 산술 연산자 이용
+'1';
// 4. * 산술 연산자 이용
'0' * 1;
// 1. Boolean 생성자 함수 사용
Boolean(1);
// 2. !부정 논리 연산자를 두 번 사용하는 방법(현직장에서 사용 중)
!!1;
true || anything; // true
false || anything; // anything
true && anything; // anything
false && anything; // false
var elem = null;
var value = elem && elem.value;
// 단축 평가를 사용한 매개변수 기본값 설정
function getStringLength(str) {
str = str || '';
return str.legnth;
}
// ES6의 매개변수 기본값 설정
function getStringLength(str = '') {
return str.length;
}
옵셔널 체이닝: 좌항의 피연산자가 null 혹은 undefined인 경우 undefined을 반환하고, 그렇지 않은 경우 우항의 프로퍼티 참조를 이어나간다.
var elem = null;
var value = elem?.value; // undefined
var str = '';
var length = str?.length;
null 병합 연산자: 좌항의 피연산자가 null 혹은 undefined인 경우 우항의 피연산자를 반환하고, 그렇지 않은 경우 좌항의 피연산자를 반환한다.
논리합(||) 연산자의 경우 Falsy값을 가진 경우 우항을 반환하고 null 병합 연산자의 경우 null/undefined의 경우에만 우항을 반환한다.
var foo = null ?? 'default string'; // default string
var foo = '' || 'default string'; // default string
var foo = '' ?? 'default string';// ''
var person = {
name: 'Lee', // name: 프로퍼티 key, 'Lee': 프로퍼티 value
age: 20 // age: 프로퍼티 key, 20: 프로퍼티 value
}
var counter = {
num: 0, // 프로퍼티
increase: function() { // 메서드
this.num++;
}
}
클래스 기반 언어의 객체 생성(C++, java): 클래스를 사전에 정의하고 필요한 시점에 new 연산자와 함께 생성자를 호출하여 인스턴스를 생성하는 방식으로 사용
프로토타입 기반 객체지향 언어의 객체 생성(javascript)
// 객체 리터럴 방식
var person = {
name: 'Lee',
sayHello: function() {
console.log("Hello");
}
}
console.log(person);
인스턴스: 클래스에 의해 생성되어 메모리에 저장된 실체
new Array vs []
https://stackoverflow.com/questions/1800594/in-javascript-why-is-preferred-over-new-array
var person = {
firstName: 'Ung-mo',
'last-name': 'Lee'
}
var obj = {};
var key = 'hello';
obj[key] = 'world';
var foo = {
'': ''
}
// error가 발생하지는 않으나 나중에 선언한 프로퍼티가 이전 프로퍼티를 덮어쓴다.
var bar = {
name: 'lee',
name: 'kim'
}
var person = {
name: 'Lee'
}
// 마침표 표기법
person.name
// 대괄호 표기법 (따옴표로 감싼 문자열을 사용해야한다는 점을 잊지말자)
person['name']
var person = {
name: 'Lee'
}
person.name = 'Kim';
console.log(person['name']); // 'Kim'
var person = {
name: 'Lee'
}
person.age = 20;
console.log(person); // {name: 'Lee', age: 20}
var person = {
name: 'Lee'
}
person.age = 20;
delete person.age;
// 없는 프로퍼티를 제거해도 에러가 발생하지 않는다.
delete person.address;
// ES5
var x = 1, y = 2;
var obj = {
x:x,
y:y
}
// ES6
let x = 1, y = 2;
const obj = { x, y };
// ES5
var prefix = 'prop';
var i = 0;
var obj = {};
obj[prefix + '-' + ++i] = i;
obj[prefix + '-' + ++i] = i;
obj[prefix + '-' + ++i] = i;
// ES6
const prefix = 'prop';
let i = 0;
const obj = {
[`${prefix}-${++i}`]: i,
[`${prefix}-${++i}`]: i,
[`${prefix}-${++i}`]: i,
}
// ES5
var obj = {
...
sayHello: function() {
}
}
// ES6
var obj = {
...
sayHello() {
}
}