-
표현식과 연산자Javascript 2019. 12. 22. 21:06
기본 표현식
가장 간단한 형태의 표현식으로 상수, 리터럴 값, 특정 키워드 그리고 변수 참조를 말한다.
1231.23"hello"/pattern/객체와 배열의 초기화 표현식
새로 생성된 객체나 배열을 값으로 하는 표현식이다. 이들 초기화 표현식은 종종 '객체 리터럴'과 '배열 리터럴'이라고 한다. 일반 리터럴과는 달리, 프로퍼티와 원소의 값을 지정하는 수많은 하위 표현식을 포함할 수 있다.
배열 초기화 표현식은 대괄호 안에 담긴 쉼표로 구분된 표현식 리스트이다. 쉼표 사이의 값을 생략함으로써 원소의 값을 정의하지 않을 수 있다.
12var matrix =[[1,2,3], [4,5,6], [7,8,9]];var sparseArray = [1,,,,5];객체 초기화 표현식은 배열 초기화 표현식과 유사하다. 대괄호가 아닌 중괄호를 사용하고 각 하위 표현식 앞에는 프로퍼티 이름과 콜론(:)이 붙는다.
12var p = { x:2.3, y:-1.2 };var q = {?}; // empty object객체 리터럴은 중첩될 수 있다.
12var rectangle = { upperLeft: { x:2, y:2 },lowerRight: {x:4, y:5 }};함수 정의 표현식
함수를 정의하고, 함수 정의 표현식의 값은 새로 정의된 함수다. 일반적으로 function 키워드와 중괄호로 둘러싸인 쉼표로 구분된 매개변수 이름(식별자) 목록, 중괄호로 둘러싸인 함수 코드로 이루어진다.
1var square = function(x) { return x * x; }프로퍼티 접근 표현식
객체의 프로퍼티나 배열의 원소 값으로 평가된다. 두 가지 문법으로 프로퍼티에 접근할 수 있다.
표현식 . 식별자 , 표현식 [ 표현식 ]
123456var o = { x:1, y:{z:3} };var a = [o, 4, [5, 6]];o.xo.y.zo["x"]a[1]'. 식별자' 문법이 두 방법 중 더 간단하지만 프로퍼티 이름이 '합법적' 식별자일 때만 사용할 수 있고, 프로그램을 작성할 때 그 식별자를 미리 알고 있어야 한다.
호출 표현식
함수나 메서드를 호출하는 문법이고, 호출될 함수를 가리키는 함수 표현식으로 시작한다. 그 뒤에는 여는 괄호로 시작해서 쉼표로 구분된 여러 개의 호출 인자 목록이 올 수 있고, 닫는 괄호로 끝난다.
123f(0)a.sort()함수 표현식이 가장 먼저 평가되고, 그 후에 호출 인자 표현식이 순서대로 인자 값으로 평가된다. 호출할 수 있는 객체가 아닐 경우는 TypeError 예외가 발생하게 된다. 메서드가 호출되면 함수의 몸체가 실행되는 동안 프로퍼티 접근 표현식이 가리키는 객체나 배열이 모두 this의 값이 된다. 이는 함수가 자신이 속한 객체를 대상으로 동작하게 하므로 객체 지향적으로 프로그램을 작성할 수 있게 한다. 그리고 전역 객체도 this 키워드의 값으로 사용한다.
객체 생성 표현식
새 객체를 생성하고, 생성자라고 부르는 함수를 호출해 객체에 속한 프로퍼티들을 초기화한다. new 키워드가 앞에 붙는다는 점을 제외하면 호출 표현식과 유사하다.
12new Object()new Point(2,3)객체의 생성자 함수를 전달인자 없이 호출하면 괄호를 생략할 수 있다.
12new Objectnew Date자바스크립트 인터프리터는 먼저 새로운 빈 객체를 생성하는데, 이때 생성된 객체는 객체 초기자 {} 에 의해 생성되는 객체와 동일하다. 다음으로, 주어진 인자들과 함께 생성자를 호출하는데, 이때 방금 생성된 새 객체를 this 키워드의 값으로 설정하여 전달한다. 생성자 함수는 이 this 키워드를 사용해 새로 생성된 객체의 프로퍼티들을 초기화한다. 일반적으로 생성자 함수는 값을 반환하지 않는다.
in 연산자
좌변의 피연산자로 문자열을 받는다. 우변의 피연산자로는 객체나 배열을 받는다. 좌변 값이 우변 객체의 프로퍼티 이름에 해당할 경우 결과는 true이다.
1234var point = { x:1, y:1 };"x" in point"y" in point"toString" in pointinstanceof 연산자
좌변의 피연산자로 객체를, 우변의 피연산자로 객체 클래스의 이름을 식별자로 받는다. 좌변에 오는 객체가 우변 클래스의 인스턴스일 경우 연산 결과는 true이다.
eval()
문자열을 코드로 인식하도록 하는 함수이다.
1eval('2 + 2'); // 4delete 연산자
객체의 속성을 제거합니다.
1delete Employee.firstname;call by value & call by reference
call by value는 값 할당 시에 실제 값이 복사되어 원본과는 별개로 저장되는 독립적인 값이다. 그래서 함수 내에서 값을 변경하면 복사본이 변경되어 함수에서 나오고 확인해보면 원본은 변화가 없다. call by reference는 변수에 직접 값을 담지 않고 값에 대한 참조를 담는다. 참조에 할당된 새 변수는 원본 변수가 가리키는 값과 동일한 값을 가리킨다.
by value by reference 복사 실제로 값이 복사된다. 값에 대한 참조만 복사된다. 전달 별개의 값 복사본이 함수에 전달된다. 값에 대한 참조가 함수에 전달된다. 비교 바이트별로 두 값을 비교한다. 두 참조가 비교된다. 기본 타입과 참조 타입
기본 타입인 숫자와 불리언 같은 경우, 정해진 개수의 작은 바이트로 구성되어 있어 인터프리터가 저수준 오퍼레이션을 통해 손쉽게 조작할 수 있다. 반면에 객체, 배열, 함수는 참조 타입이다. 임의 개수의 프로퍼티나 원소를 포함할 수 있어 간단하지 않다. 이들은 크기가 상당히 커질 수 있는데 이 값들을 by value 로 조작하면 메모리를 비효율적으로 많이 소모한다.
문자열의 복사와 전달
문자열은 위에서 설명한 이분법적인 타입 구분으로는 들어맞지 않는다. 효율성을 위해 참조 타입이라고 가정할 수 있지만 어떤 가정을 내리든 별로 상관이 없다.