자바스크립트 핵심읽기 표현과 연산자_기본지식

WBOY
풀어 주다: 2016-05-16 16:14:25
원래의
1252명이 탐색했습니다.

표현식은 JavaScript 인터프리터가 결과를 계산하는 JavaScript 구문입니다. 프로그램에서 일반적으로 사용되는 가장 간단한 유형의 표현식은 변수입니다. 변수 이름도 간단한 표현식이며 해당 값은 변수에 할당된 값입니다.

복잡한 표현은 간단한 표현으로 구성됩니다. 예를 들어 배열 액세스 표현식은 배열을 나타내는 표현식, 대괄호 및 정수 표현식으로 구성됩니다. 이들이 형성하는 새로운 표현식의 결과는 배열의 특정 위치에 있는 요소의 값입니다. 같은 편지

숫자 호출 표현식은 함수 객체를 나타내는 표현식과 0개의 다중 매개변수 표현식으로 구성됩니다. 간단한 표현식을 복잡한 표현식으로 결합하는 가장 일반적인 방법은 연산자를 사용하는 것입니다.

이 장(이 문서)에서는 모든 자바스크립트 연산자에 대해 설명합니다. 또한 연산자가 포함되지 않은 표현식(예: 배열 요소 액세스 및 함수 호출)에 대해 설명합니다. 구문 및 프로그래밍 스타일은 C 언어와 매우 유사합니다.

1. 요소 표현

가장 단순한 표현은 표현의 가장 작은 단위인 '원시 표현'으로, 다른 표현은 포함하지 않습니다. JavaScript의 기본 표현식에는 상수 또는 리터럴이 포함됩니다. 키워드 및 변수.
직접 수량은 프로그램에 직접 나타나는 상수 값입니다. 다음과 같습니다:

코드 복사 코드는 다음과 같습니다.

               1.23 //디지털 직접수량
"hello" //문자열 리터럴
에게
JavaScript의 일부 예약어는 기본 표현식을 구성합니다

코드 복사 코드는 다음과 같습니다.
                true //부울 값: true
거짓 Null // 값 반환: 비어 있음
//"현재" 객체를 반환합니다


3장의 연구를 통해 이는 다른 키워드와 달리 상수가 아니며, 프로그램 내 각기 다른 위치에서 반환하는 값도 다르다. this 키워드는 객체 지향 프로그래밍에 자주 나타납니다. 이는 square 메소드의 객체를 반환합니다. 마지막으로 세 번째 기본 표현식은

변수입니다.

i //변수 i의 값을 반환합니다
sum //sum 값을 반환합니다
정의되지 않음 // 전역 변수이며 null과 달리 키워드가 아닙니다


2. 객체 및 배열의 ​​초기화 표현식.

객체 및 배열 초기화는 실제로 새로 생성된 객체 및 배열입니다. 이러한 초기화 표현식을 "객체 리터럴" 및 "배열 리터럴"이라고도 합니다. 그러나 부울 리터럴과 달리 포함된 멤버나 요소는 하위 표현식이므로 기본 표현식이 아닙니다.

배열 초기화 표현식의 구문은 매우 간단합니다.

배열의 초기화 표현식은 대괄호 한 쌍과 쉼표로 구분된 리스트로 구성됩니다. 초기화 결과는 새로 생성된 배열입니다. 배열의 요소는 쉼표로 구분된 표현식의 값입니다.

[] //빈 배열입니다. [] 안에 공백을 두면 배열에 요소가 없음을 의미합니다.

[1 2,3 4] //두 개의 요소가 있는 배열, 첫 번째는 3, 두 번째는 7

배열 초기화 식의 요소 초기화 식은 배열 초기화 식일 수 있습니다. 즉, 표현식이 중첩될 수 있습니다

var mat = [[1,2,3],[4,5,6],[7,8,9]];


배열 리터럴에서 목록 사이의 요소는 생략할 수 있으며, 빈 공간은 정의되지 않은 상태로 채워집니다. 예를 들면 다음과 같습니다.

var a=[1,,,,5]

요소 중 4개가 정의되지 않았습니다. 배열 리터럴 끝에 쉼표를 남겨두면 값이 정의되지 않은 새 요소가 생성되지 않습니다.

객체 초기화 표현식은 대괄호가 중괄호로 대체된다는 점을 제외하면 배열 초기화 표현식과 매우 유사합니다. 그리고 각 하위 표현식에는 속성 이름과 콜론이 아닌 접두사가 포함되어 있습니다.

코드 복사 코드는 다음과 같습니다.

var p = {x: 2.1,y: -3} //두 개의 속성 멤버가 있는 객체
            var q = {} //빈 객체
​​​​​​ q.x=2.1;q.y=-3; //q의 속성 멤버는 p의 속성 멤버와 동일합니다

과 같이 객체 리터럴을 중첩할 수도 있습니다.

코드 복사 코드는 다음과 같습니다.

var anh = {왼쪽:{x:2,y:3},
~ ~                                                    
JavaScript가 객체 초기화 표현식의 값을 계산할 때 객체 표현식은 각각 한 번씩 계산되며 상수 값을 포함할 필요는 없습니다. 모든 JavaScript 표현식이 될 수 있습니다. 마찬가지로 객체 리터럴의 속성 이름은 식별자가 아닌 문자열일 수 있습니다. (해당 줄에서 예약어나 일부 불법 식별자만 속성 이름으로 사용할 수 있는 경우 매우 유용합니다.)

코드 복사 코드는 다음과 같습니다.
          var 측 = 1;
          var square = {"왼쪽":{x:p.x,y:p.y},
             '오른쪽':{x:p.x 쪽,y:p.y 쪽}}

6장과 7장에서는 객체와 배열의 초기화 표현식에 대해 다시 논의합니다.

3. 함수 표현

함수 정의 표현식은 자바스크립트 함수를 정의합니다. 표현식의 값은 새로 정의된 함수입니다. 어떤 의미에서 함수 정의 표현식은 함수 리터럴이 될 수 있고, 함수 표현식은 "함수 리터럴"이라고 할 수 있습니다. 결국 객체 초기화 표현식은 "객체 리터럴"이라고도 합니다. 일반적인 함수 정의 표현식에는 function 키워드와 그 뒤에 괄호 쌍이 포함됩니다. 괄호 안에는 0개 이상의 식별자(매개변수 이름)가 포함된 쉼표로 구분된 목록이 있습니다. 그런 다음 중괄호로 묶인 JavaScript 코드 세그먼트(함수 본문)를 따르세요.

var square = function(x){ return x*x};

함수 정의 표현식에는 함수 이름이 포함될 수도 있습니다. 함수 표현식 대신 함수 명령문을 통해 함수를 정의할 수도 있습니다. 자세한 내용은 8장에서 설명하겠습니다.

4. 속성 접근 표현

속성 액세스 표현식 작업은 객체 또는 배열 요소의 값을 가져옵니다. JavaScript는 속성 액세스를 위한 두 가지 방법을 정의합니다.

코드 복사 코드는 다음과 같습니다.
식 식별자
표현[표현]

첫 번째 작성 방법은 표현식 뒤에 마침표와 식별자가 오는 것입니다. 표현식은 객체를 지정하고 식별자는 액세스할 속성을 지정합니다.

2장은 대괄호를 사용하여 작성하고, 대괄호 안에는 표현식이 있습니다(이 방법은 객체 및 배열에 적용됩니다). 두 번째 표현식은 액세스할 속성의 인덱스를 지정하거나 액세스할 배열 요소의 인덱스를 나타냅니다. 구체적인 예는 다음과 같습니다

코드 복사 코드는 다음과 같습니다.
o.x //=> 표현식 o의 1x 속성
o.y.z //=>3 표현식 o.y의 z 속성
~ ~ a[1] //=>4 인덱스가 1인 표현식 a의 요소
a[2]["1"]//=>6 표현식 a[2]
에서 인덱스가 1인 요소 a[0].x //=>1: 표현식 a[0]
의 x 속성

어떤 형태의 속성 액세스 표현식을 사용하든 "." 및 "[" 앞의 표현식이 항상 먼저 평가됩니다. 표현식이 null 또는 정의되지 않은 것으로 평가되면 두 값 모두 속성을 포함할 수 없기 때문에 표현식에서 TypeError 예외가 발생합니다. 연산 결과가 객체나 배열이 아닌 경우 자바스크립트는 이를 객체로 변환합니다(3장, 6절)

.identifier가 작성하기 더 간단하지만 이 방법은 액세스할 속성 이름이 합법적인 식별자인 경우에만 적용 가능하다는 점에 유의해야 합니다. 그리고 액세스할 속성의 이름을 알아야 합니다. 속성 이름이 예약어이거나 공백과 구두점을 포함하거나 숫자(배열의 경우)인 경우 대괄호 안에 작성해야 합니다. 속성명이 고정된 값이 아닌 연산자에 의해 얻어지는 값인 경우 대괄호를 사용해야 합니다. (6장 2절 1절)

5. 동작 표현

JavaScript의 호출 표현식은 함수나 메소드를 호출(또는 실행)하는 것을 문법적으로 표현한 것입니다. 호출할 함수를 참조하는 함수 표현식으로 시작합니다. 함수 표현식 다음에는 쉼표로 구분된 매개변수 목록을 포함하는 괄호 쌍이 옵니다. 0개 이상의 매개변수가 있을 수 있습니다.

                           f(0) //f는 함수 표현식입니다. 0은 매개변수 표현식입니다.
                Math.max(x,y,z) //Math.max는 함수입니다. x, y 및 z는 매개변수입니다.
              a.sort() //a.sort()는 함수이며 매개변수가 없습니다.
평가를 위해 표현식이 호출되면 함수 표현식이 먼저 평가된 다음 매개변수 표현식이 평가되어 매개변수 값 세트를 얻습니다. 함수 표현식의 값이 호출 가능한 객체가 아닌 경우 유형 오류 예외가 발생합니다. 그러면 매개변수의 값이 함수 정의 시 정의되는 형식 매개변수에 차례로 할당됩니다. 다음으로 함수 본문을 실행합니다. 함수가 return 문을 사용하여 반환 값을 제공하는 경우 반환 값은 전체 호출 식의 값입니다. 그렇지 않으면 호출 표현식의 값이 정의되지 않습니다. 공식 매개변수 표현식의 수가 함수 정의의 실제 매개변수 수와 일치하지 않을 때 발생하는 일을 포함하여 함수 호출에 대한 자세한 내용은 8장에서 설명합니다.

모든 호출 표현식에는 한 쌍의 괄호와 왼쪽 괄호 앞에 표현식이 포함됩니다. 표현식이 속성 액세스 표현식인 경우 해당 호출을 "메서드 호출"이라고 합니다. 메서드 호출에서 함수 본문이 실행될 때 본문에 액세스하기 위한 특성으로 사용되는 개체 및 배열은 호출 메서드에서 이 지점입니다. 이 속성을 사용하면 함수(OO 이름이 "메서드"임)가 객체 지향 프로그래밍 패러다임에서 호스트 객체를 호출할 수 있습니다(자세한 내용은 9장 참조).

6. 객체 생성 표현

객체 생성 표현식은 객체를 생성하고 함수(생성자)를 호출하여 객체의 속성을 초기화하는 표현식입니다. 객체 생성 표현식은 객체 생성 표현식 앞에 new:

라는 추가 키워드가 있다는 점을 제외하면 함수 호출 표현식과 매우 유사합니다.

새로운 객체()
새로운 포인트(2,3)
객체 생성 표현식에서 생성자에 전달할 매개변수가 필요하지 않은 경우 이 괄호 쌍을 생략할 수 있습니다. 생성자에 대한 자세한 내용은 9장

에서 설명합니다.

새로운 개체
          새 포인트

7. 운영자 개요

자바스크립트의 연산자는 테이블 표현식, 비교 표현식, 논리 표현식, 대입 표현식 등에 사용됩니다.
대부분의 연산자는 delete 및 instanceof와 같이 구두점으로 표시됩니다. 키워드 연산자이든 기호 연산자이든 표시되는 연산자는 모두 일반 연산자이며 해당 구문은 매우 간결하고 포괄적입니다.
아래 첨자 연산자의 우선순위에 따라 정렬하면 아래 첨자 연산자의 우선순위가 아래 첨자 연산자의 우선순위보다 높습니다. 수평 스칼라로 구분된 연산자는 우선순위가 다릅니다.
A는 연산자의 연관성을 나타냅니다.
L(왼쪽에서 오른쪽) 또는 R(오른쪽에서 왼쪽)
헤더 N의 목록은 피연산자의 수를 나타냅니다.
유형은 예상되는 피연산자의 유형과 연산자의 결과 유형("→" 기호 뒤)을 나타냅니다.

운영자 작전 유형
사전/사후 증분 1 lval→num
-- 전후 감소 1 lval→num
- 역방향 1 숫자→숫자
숫자로 변환 1 숫자→숫자
~ 비트 부정 1 정수→정수
! 논리적 NOT 1 부울→부울
삭제 속성 삭제 1 lval→bool
유형 작업 유형 감지 1 아무→Str
무효 정의되지 않은 값 반환 1 모두→undef
*,/,% 곱하고 나누어 나머지를 구하세요 2 숫자, 숫자→숫자
, - 더하기, 빼기 2 숫자, 숫자→숫자
문자열 연결 2 str, str→str
왼쪽 시프트 2 정수, 정수→정수
>> 오른쪽으로 이동 2 정수, 정수→정수
>>> 부호 없는 오른쪽 시프트

2 정수, 정수→정수
<, <=, >, >= 숫자 순서 비교 2 숫자,숫자→부울
<, <=, >, >= 문자 순서 비교 2 str, str→bool
인스턴스 테스트 개체 클래스 2 obj, func→bool
속성이 존재하는지 테스트 2 str,obj→bool
== 평등판결 2 아무거나→부울
! = 불평등한 판단 2 아무거나→부울
=== 판사 신원 2 아무거나→부울
! == 판사 무신분 2 아무거나→부울
& 비트 AND 2 정수, 정수→정수
^ 비트 XOR 2 정수, 정수→정수
| 비트 OR 2 정수, 정수→정수
&& 논리적 AND 2 아무거나→아무거나
|| 논리 OR 2 아무거나→아무거나
?: 조건 연산자 3 부울, 임의, 임의→모두
= 변수 할당 또는 객체 속성 할당 2 lval, 모두→모두

*= /= %= = -= &=

^= |= <<= >>= >>>=

운영 및 임무 2 lval, 모두→모두
,

첫 번째 피연산자 무시

두 번째 피연산자를 반환합니다.

2 아무거나→아무거나

i. 피연산자 수

연산자는 피연산자 수에 따라 분류할 수 있습니다.

JavaScript의 대부분의 연산자는 두 표현식을 약간 더 복잡한 표현식으로 결합하는 이항 연산자입니다.
JavaScript는 한 표현식을 약간 더 복잡한 다른 표현식으로 변환하는 일부 단항 연산자도 지원합니다. -x 표현식의 "-" 연산자는 단항 연산자입니다. x의 음수 값을 취하는 것입니다.
JavaScript는 세 개의 표현식을 하나의 표현식으로 결합하는 조건부 판단 연산자 "?:"인 삼항 연산자를 지원합니다.

ii. 피연산자 유형 및 결과 유형

일부 연산자는 모든 데이터 유형에 사용할 수 있지만 여전히 지정된 유형의 데이터에 대해 연산을 수행해야 합니다.

iii.왼쪽 값

표의 할당 연산자와 다른 몇몇 연산자는 피연산자가 lval 유형일 것으로 예상합니다. lvalue는 구식 용어입니다. 이는 "표현식은 대입 연산자의 왼쪽에만 나타날 수 있다"는 의미입니다. JavaScript에서는 변수, 개체 속성 및 배열 요소가 모두 lvalue입니다. ECMAScript 사양에서는 범위가 지정된 내장 함수가 lvalue를 반환하는 것을 허용하지만 정의된 함수는 그렇게 할 수 없습니다.

iii.운영자 우선순위

위 표에 표시된 연산자는 높은 우선순위에서 낮은 우선순위로 정렬되어 있으며 각 가로 구분선 내의 연산자 그룹은 동일한 우선순위를 갖습니다. 연산자 우선 순위는 연산자가 실행되는 순서를 제어합니다. 우선 순위가 높은 연산자(표 상단)는 항상 우선 순위가 낮은 연산자(표 하단)보다 먼저 실행됩니다.

다음 표현을 보세요

w=xy*z;
곱셈 연산자 "*"는 덧셈 " "보다 우선순위가 높으므로 곱셈이 먼저 실행됩니다. 그런 다음 할당 연산자 "="의 우선 순위가 가장 낮습니다. 따라서 오른쪽의 표현식이 평가된 후에 할당 작업이 수행됩니다.

연산자의 우선순위는 괄호를 사용하여 작성할 수 있습니다. 위의 표현은 이렇게 쓸 수 있습니다.

w = (x y) * z;
속성 액세스 표현식과 호출 표현식은 테이블의 모든 연산자보다 우선순위가 높습니다.

my.Function[x](y) 유형
typeof는 우선순위가 가장 높은 연산자 중 하나이지만 두 번의 속성 액세스 및 함수 호출 후에도 실행됩니다.

실제로 사용 중인 연산자의 우선순위가 확실하지 않은 경우 가장 쉬운 방법은 괄호를 사용하여 연산 순서를 강제하는 것입니다. 기억해야 할 몇 가지 중요한 규칙이 있습니다. 곱셈과 나눗셈은 덧셈과 뺄셈보다 높고 할당 작업은 우선 순위가 매우 낮으며 일반적으로 마지막에 실행됩니다.

iiiiii.연산자의 연관성

표의 이 섹션에서 A 열은 연산자의 결절성을 설명합니다. L은 왼쪽에서 오른쪽으로 결합하는 것을 의미하고, R은 오른쪽에서 왼쪽으로 결합하는 것을 의미합니다. Tuberculity는 동일한 우선순위를 갖는 여러 연산자 표현식의 연산 순서를 지정합니다.

예를 들어 빼기 연산은 왼쪽에서 오른쪽으로 연관적으로 수행됩니다.

코드 복사 코드는 다음과 같습니다.

w = x - y - z

이 코드와 동일:

코드 복사 코드는 다음과 같습니다.

w = ((x - y) - z)

반대로 말하면 다음과 같은 표현이 됩니다.

코드 복사 코드는 다음과 같습니다.

x = ~-y;
w = x = y = z;
q=a?b:c?d:e?f:g;

이 코드와 똑같습니다

코드 복사 코드는 다음과 같습니다.

x=~(-y);
w=(x=(y=z));
q=a?b:(c?d:(e?f:g))

단항 연산자, 할당 및 삼항 조건 연산자는 모두 오른쪽에서 왼쪽 연관성을 갖기 때문입니다.

iiiiii.작업 순서

연산자의 우선순위와 결합성은 대입식에서 연산 순서를 지정하지만, 하위 표현식의 계산 과정에서는 연산 순서를 지정하지 않습니다. JavaScript는 항상 왼쪽에서 오른쪽으로 표현식을 평가합니다. 예:

w=x y*z 수식에서는 w 수식을 먼저 계산한 다음 x, y, z를 계산한 다음 y 값에 z를 곱하고 x 값을 더합니다. 마지막으로 표현식 w가 가리키는 변수나 속성입니다. 표현식에 괄호를 추가하면 곱셈, 덧셈 및 대입 연산 간의 관계가 변경됩니다. 하지만 왼쪽에서 오른쪽으로의 순서는 바뀌지 않습니다.

8. 산술식

이 섹션에서는 산술 계산을 수행하는 연산자와 피연산자에 대한 산술 연산을 다룹니다. 곱셈, 나눗셈, 뺄셈 연산자는 매우 간단합니다. 더하기 연산자는 문자열 연결을 수행할 수 있고 해당 유형 변환이 다소 특별하기 때문에 더하기 연산은 별도의 섹션입니다.

기본 산술 연산자는 *, /, %, , -입니다. 덧셈을 제외한 다른 연산자는 매우 간단합니다. 필요한 경우 연산자를 숫자로 변환한 다음 곱, 몫, 나머지(모듈러스) 및 차이를 계산합니다. 숫자로 변환할 수 없는 모든 연산은 NaN 값으로 변환됩니다. 피연산자(또는 변환 결과)가 NaN 값이면 산술 연산의 결과도 NaN입니다

정수와 부동 소수점 숫자를 구별하는 프로그래밍 언어를 사용한 경우 연산자 "/"는 두 번째 피연산자를 첫 번째 피연산자로 나눕니다. 그런 다음 정수를 정수로 나누면 원하는 결과도 정수가 됩니다. JavaScript의 모든 숫자는 부동 소수점 유형이며 나누기 연산의 결과도 부동 소수점 유형입니다. 예를 들어 5/2의 결과는 2가 아니라 2.5입니다. 0으로 나누는 연산의 결과는 양의 무한대 또는 음의 무한대입니다. 그리고 0/0의 결과는 NaN입니다. 이러한 모든 작업에는 오류가 없습니다.

연산자 "%"는 첫 번째 피연산자와 두 번째 피연산자의 모듈러스를 계산합니다. 즉, 첫 번째 피연산자를 두 번째 피연산자로 나눈 나머지입니다. 결과의 부호는 첫 번째 피연산자(피제수)의 부호와 동일하게 유지됩니다. 예를 들어 5%2의 결과는 1이고, -5%2의 결과는 -1입니다.

나머지 연산자의 피연산자는 일반적으로 정수이지만 부동 소수점 숫자에도 사용할 수 있습니다. 6.5%2.1은 0.2로 나타난다. (0.19999999999999973)

i. " " 연산자

이진 더하기 연산자 " "는 두 개의 숫자를 더할 수 있고 문자열 연결 연산도 수행할 수 있습니다.

코드 복사 코드는 다음과 같습니다.

1 2 //=>3
"안녕하세요" "" "거기" // =>"안녕하세요"
"1" "2" //=>"12"

두 피연산자가 모두 숫자이거나 문자열이면 계산 결과가 명확합니다. 그러나 다른 경우에는 필요한 일부 유형 변환을 수행해야 합니다. 그리고 연산자의 동작은 유형 변환 결과에 따라 달라집니다. 기술적으로 말하면 더하기 연산자는 다음과 같이 동작합니다.

피연산자가 객체인 경우 객체의 원시값 변환 규칙에 따라 객체가 원시 클래스 값으로 변환됩니다(3장 8절 3절 참조). 날짜는 객체의 toString() 메서드로 변환되고, 다른 객체는 valueOf() 메서드로 변환됩니다(valueOf() 메서드가 기본 값을 반환하는 경우). 대부분의 객체에는 valueOf() 메서드를 사용할 수 없으므로 toString() 메서드를 통해 캡처 및 교체를 수행합니다
객체를 기본 값으로 변환한 후 피연산자 중 하나가 문자열이면 다른 피연산자도 문자열로 변환됩니다. 그런 다음 문자열 연결을 수행합니다.
그렇지 않으면 두 피연산자가 모두 숫자(또는 NaN)로 변환되고 더하기 연산이 수행됩니다.
다음은 몇 가지 예입니다

코드 복사 코드는 다음과 같습니다.

1 2 //=>3 추가
"1" "2" //=>"12" 문자열 연결
"1" 2 //=>"12"숫자를 문자열로 변환한 후 문자열을 연결합니다
~ >                    true true //=>2 부울 값을 숫자로 변환한 후 추가하세요
                 2 null //=>2 null을 0으로 변환한 후 추가합니다
                  2 undefine //=>NaN undefine은 추가를 위해 NaN으로 변환됩니다.

마지막으로 특별히 주목해야 할 사항이 있습니다. 문자열과 함께 덧셈 연산을 사용하는 경우 연산 순서에 대한 덧셈의 영향을 고려해야 합니다. 즉,

와 같이 연산자의 연산 순서에 따라 연산 결과가 달라집니다.

코드 복사 코드는 다음과 같습니다.
               1 2 "bmice" //=> "3 bmice"
              1 (2 "bmice") => "12bmice"

ii. 단항 연산자

단항 연산자는 단일 피연산자에 대해 작동합니다. 그리고 새로운 가치를 만들어냅니다. JavaScript에서 단항 연산자는 우선 순위가 높으며 오른쪽 결합적입니다. 이 섹션에서는 필요할 때 연산을 숫자로 변환하는 단항 연산자( ,- 및 --)에 대해 설명합니다. -는 단항 연산자이자 이항 연산자라는 점에 유의해야 합니다.

1달러 추가

단항 더하기 연산자는 피연산자 숫자를 숫자(또는 NaN)로 변환하고 변환된 숫자를 반환합니다. 피연산자 자체가 숫자인 경우 이 숫자가 직접 반환됩니다.

1달러 빼기-

- 기호를 단항 연산자로 사용하면 필요에 따라 피연산자를 숫자로 변환한 다음 연산 결과의 기호를 변경합니다.

증분

증가 " " 연산자는 lvalue(변수, 배열 요소 또는 객체 속성)인 피연산자에 대해 증가(1) 연산을 수행합니다. 연산자는 피연산자를 숫자로 변환합니다. 그런 다음 숫자에 1을 더하고 추가된 값을 변수, 배열 요소 또는 개체 속성에 다시 할당합니다.

증분 연산의 반환 값은 피연산자의 위치에 따라 달라집니다.

연산자가 피연산자 앞에 오는 경우를 "선증가" 연산자라고 합니다. 피연산자에 대해 증분 계산을 수행하고 계산된 값을 반환합니다.

연산자가 피연산자 뒤에 있는 경우 이를 "후증가" 연산자라고 합니다. 피연산자에 대해 증분 계산을 수행하지만 증분되지 않은 값을 반환합니다.

var i = 1,j = i //i와 j의 값은 모두 2입니다
              var i = 1,j = i; //i는 2, j는 1
x 및 sum x=x 1과 마찬가지로 " " 연산자는 문자열 연결을 수행하지 않으며 항상 피연산자를 숫자로 변환하고 1씩 증가시킵니다. x가 문자열 "1"이면 결과는 다음과 같습니다. x 중 x는 숫자 2이고 x 1은 문자열 "11"입니다.

감소, 증가 연산 방식은 동일합니다. 피연산자를 배열로 변환한 후 1씩 감소시킵니다.

iii.비트 연산자

비트 연산자는 숫자로 표현되는 이진 데이터에 대해 하위 수준 비트 연산을 수행할 수 있습니다. 전통적인 순수 수학 연산은 아니지만 숫자 유형에 대해 연산을 수행하고 숫자를 반환하므로 여기서는 산술 연산자로 분류됩니다. 이러한 연산자는 JavaScript에서는 일반적이지 않습니다. (여기에는 설명되어 있지 않습니다. 자세한 내용은 Baidu를 참조하세요~~)                         

9. 관계식

이 섹션에서는 JavaScript의 관계 연산자에 대해 설명합니다. 관계 연산자는 두 값(같음, 보다 작음 또는 "...의 속성") 간의 관계를 테스트하는 데 사용되며, 해당 값에 따라 true와 false를 반환합니다. 관계가 존재하는지 여부. 관계식은 항상 부울 값을 반환합니다. 관계식은 일반적으로 if 문이나 for 문(5장)에서 프로그램의 실행 흐름을 제어하는 ​​데 사용됩니다.

다음 몇 섹션에서는 JavaScript의 동등 및 부등 연산, 비교 연산자, 기타 두 관계 연산자 및 인스턴스 오브에 대해 설명합니다.

i평등 및 불평등 연산자

"==" 및 "===" 연산자는 두 값이 같은지 비교하는 데 사용됩니다. 두 연산자는 모든 유형의 연산자를 허용합니다. 동일하면 true를 반환하고, 그렇지 않으면 false를 반환합니다. "==="는 두 피연산자가 엄격하게 동일한지 여부를 감지하는 데 사용되는 엄격한 동등 연산자(신원 연산자라고도 함)라고도 합니다. "==" 연산자는 두 피연산자가 같은지 여부를 확인하는 데 사용되는 동등 연산자라고 합니다. 여기서 동등의 정의는 느슨하며 유형 변환을 허용합니다.

Javascript는 "=", "==", "===" 연산자를 지원하므로 (할당, 같음, 동일성) 연산자의 차이점을 이해해야 합니다. 그리고 프로그래밍 시 주의해서 사용하세요. 혼란을 줄이기 위해 "="는 "가져오기 또는 할당", "=="는 "동등", "==="는 "엄격한 평등"이라고 불러야 합니다.

"!=" 및 "!==" 연산자 규칙은 "=="이며, "===" 연산자의 부정이며, "!"는 부울 비연산자입니다. " !==" 엄격한 평등이 아닌 불평등이라고 합니다

자바스크립트 객체의 비교는 값 비교가 아닌 참조 비교입니다. 대상은 그 자체와 동일하지만 사람도 대상도 동일하지 않습니다. 두 개체가 동일한 수의 속성, 동일한 속성 이름 및 값을 갖는 경우에도 여전히 동일하지 않습니다. 해당 위치의 배열 요소가 동일하더라도 두 배열도 동일하지 않습니다.

완전 항등 연산자 "==="는 먼저 피연산자의 값을 계산한 다음 어떤 유형 변환 없이 두 값을 비교합니다.

두 값 유형이 동일하지 않으면 동일하지 않습니다.
두 값이 모두 null이거나 정의되지 않은 경우 동일하지 않습니다
두 값 모두 부울 true 또는 false이면 동일합니다
값 중 하나가 NaN이거나 두 값 모두 NaN이면 NaN은 자신을 포함한 다른 값과 동일하지 않습니다.
두 값은 숫자이고 같으면 같습니다. 값이 0이고 값이 -0인 경우에도 동일합니다.
두 값은 문자열이고 해당 비트에 정확히 동일한 16자리 숫자가 포함되어 있으면 동일합니다(3장, 2절 참조). 길이나 내용이 다르면 동일하지 않습니다. 두 문자열은 완전히 동일하게 작동하고 동일한 문자를 표시할 수 있지만 인코딩 없이 16비트 값을 갖습니다. JavaScript는 유니코드로의 표준 변환을 수행하지 않으므로 이러한 문자열은 "===" 및 "=="를 통해 전달됩니다. 연산자의 비교 결과도 동일하지 않습니다. 3부의 String.localeCompare()는 문자열을 비교하는 또 다른 방법을 제공합니다.
두 참조 값은 동일한 객체, 배열 또는 함수를 가리키는 경우 동일합니다. 서로 다른 개체를 가리키는 경우 두 개체가 정확히 동일한 속성을 갖고 있더라도 동일하지 않습니다.
항등 연산자 "=="는 항등 연산자와 유사하지만 항등 연산자 비교는 엄격하지 않습니다. 두 숫자의 유형이 동일하지 않으면 항등 연산자는 유형 변환을 시도한 다음 비교합니다.

두 연산 유형이 동일한 경우 비교 규칙은 위의 항등 연산자와 동일합니다. 엄격하게 동일하면 비교 결과도 동일합니다. 엄격히 동일하지 않은 경우 비교 결과가 동일하지 않습니다.
두 작업 유형이 다른 경우 "==" 같음 연산자도 두 작업 유형을 동일한 것으로 간주합니다. 동등성 감지는 다음 규칙과 유형 변환을 따릅니다.
한 유형이 null이고 다른 유형이 정의되지 않은 경우 두 유형은 동일합니다
한 값이 숫자이고 다른 값이 문자열인 경우 먼저 문자열을 숫자로 변환한 다음 변환된 값을 사용하여 비교합니다.
값이 true이면 1로 변환되어 비교됩니다. 값이 false이면 비교를 위해 0으로 변환됩니다.
한 값이 객체이고 다른 값이 숫자나 문자열인 경우 3장 8절 3항에 있는 메서드의 변환 규칙을 사용하여 객체를 원시 값으로 변환한 후 비교합니다. 객체는 toString() 메서드 또는 valueOf() 메서드를 통해 기본 값으로 변환됩니다. JavaScript 언어의 핵심에 있는 내장 클래스들은 먼저 valueOf()를 사용하려고 시도한 다음 toString()을 사용하려고 시도합니다. date 클래스를 제외하면 date 클래스는 toString()을 통해서만 변환이 가능합니다. 핵심 JavaScript 언어의 일부가 아닌 개체는 구현에 정의된 메서드를 사용하여 기본 값으로 변환됩니다.
다른 유형 간의 비교는 동일하지 않습니다
다음은 평등의 작은 예입니다

"1" == 참
이 표현식은 true로 평가됩니다. 이는 완전히 다른 유형의 값이 동일하게 비교됨을 나타냅니다. 부울 true는 비교가 수행되기 전에 먼저 숫자 1로 변환됩니다. 다음으로 문자열 "1"도 숫자 1로 변환됩니다. 두 숫자의 값이 동일하므로 결과는 true입니다.

ii. 비교 연산자

미만(<)

첫 번째 피연산자가 두 번째 피연산자보다 작으면 "<" 연산 결과는 true이고, 그렇지 않으면 false입니다

(<=)보다 작거나 같음

보다 큼(>)

(>=)보다 크거나 같음

....(자세한 의미는 밝히지 않음)

비교 연산자의 피연산자는 모든 유형이 될 수 있습니다. 그러나 실제로는 숫자와 문자열만 비교 연산자를 수행할 수 있으므로 숫자나 문자열이 아닌 피연산자는 유형 변환을 거칩니다. 유형 변환 규칙은 다음과 같습니다.

피연산자가 객체인 경우 3장, 8절, 하위 섹션 3의 잠금 설명에 설명된 변환 규칙에 따라 기본 값으로 변환됩니다. valueOf()가 기본 값을 반환하는 경우 이 기본 값을 사용하세요. 직접적으로 가치를 평가합니다. 그렇지 않으면 toString()의 변환 결과가 비교에 사용됩니다.
쌍을 기본 값으로 변환한 후 두 피연산자가 모두 문자열이면 두 문자열이 알파벳 순서로 비교됩니다. 여기에 언급된 "알파벳 순서"는 16비트 유니코드 문자의 인덱스 순서를 구성합니다.
객체가 기본 값으로 변환된 후 하나 이상의 피연산자가 문자열이 아닌 경우 두 피연산자가 수치적으로 비교됩니다. 0과 -0은 같습니다. 무한대는 다른 숫자(무한대 자체 제외)보다 크고 -infinty는 임의의 숫자(자체 제외)보다 작습니다. 피연산자(또는 변환된)가 NaN인 경우 비교 연산자는 항상 false를 반환합니다
숫자 및 문자열 연산자의 경우 더하기 연산자는 비교 연산자와 다르게 동작합니다. 전자는 문자열을 선호하며 피연산자 중 하나가 문자열인 경우 문자열 연결을 수행합니다. 비교 연산자는 두 피연산자가 모두 문자열인 경우에만 숫자를 선호합니다. 문자열 비교가 수행됩니다.

코드 복사 코드는 다음과 같습니다.

1 2 //=>3 더하면 결과는 3
"1" "2" //문자열 연결, 결과는 "12"입니다
"1" 2 //문자열 연결, 2는 "2"로 변환되고 결과는 "12"입니다.
                11 < 3 //숫자 비교 결과는 참입니다
"11" < "3" //문자열 비교, 결과는 참입니다
"11" < 3 //숫자를 비교하면 "11"이 11로 변환되어 결과가 true
"one" < 3 //숫자 비교, "one"은 NaN으로 변환되고 결과는 false입니다

마지막으로, "<=" 및 ">=" 연산자는 동등성을 결정할 때 동등 연산자 및 엄격한 동등 비교 규칙에 의존하지 않는다는 점에 유의해야 합니다. 대조적으로, 작거나 같음 연산자는 단순히 "보다 크지 않음"이고 크거나 같음 연산자는 단순히 "보다 작지 않음"입니다. 단 한 가지 예외가 있습니다. 변환 후 피연산자 중 하나가 NaN인 경우 4개의 비교 연산자가 모두 fasle을 반환합니다.

iii.in 연산자

in 연산자는 왼쪽 피연산자가 문자열이거나 문자열로 변환 가능하고 오른쪽 피연산자가 객체일 것으로 예상합니다. 오른쪽 객체에 왼쪽 피연산자 값이라는 속성 이름이 있는 경우 표현식은 true를 반환합니다.

코드 복사 코드는 다음과 같습니다.
var 포인트 = {
                      x: 1,
                   y: 1
~                 // 객체 정의
"x" in point //=>true 객체에 x
라는 속성이 있습니다. "z" //=>false 객체의 명명되지 않은 속성은 z
입니다. "toString" in point // =>true 객체는 toString 메소드를 상속받습니다
var 데이터 = [7, 8, 8]

데이터의 "0" //=>true 배열에는 0이 포함됩니다
~ | true 숫자를 문자열로 변환
                 데이터에 3 //=>fase 인덱스 3인 요소가 없습니다

iiii.instanceof 연산자

instanceof 연산자는 왼쪽 연산자가 객체이고 오른쪽 피연산자가 객체의 클래스를 나타낼 것으로 예상합니다. 왼쪽 객체가 오른쪽 클래스의 인스턴스라면 표현식은 true를 반환하고, 이에 대해서는 9장에서 설명하겠습니다. JavaScript 객체의 클래스는 생성자를 초기화하여 정의됩니다. 이 경우, instanceof의 오른쪽 피연산자는 함수여야 합니다. 예:

코드 복사 코드는 다음과 같습니다.
               var d = new Date() //새 객체 생성
               d 인스턴스of Date; //계산 결과는 true이며 d는 Date()에 의해 생성됩니다.
               d instanceof Object //계산 결과는 true이며 모든 객체는 Object의 인스턴스입니다
                d 인스턴스of Number //계산 결과가 거짓입니다. d는 Number 객체가 아닙니다
                 var a = [1,2,3] //배열 리터럴이 배열을 생성합니다
a 인스턴스of Array //계산 결과는 true입니다. a는 배열입니다
              객체 인스턴스 //true 모든 배열은 객체입니다
               RegExp 인스턴스 //fasle 배열은 정규 표현식이 아닙니다

모든 객체는 Object의 인스턴스라는 점에 유의해야 합니다. 인스턴스of를 통해 객체가 클래스의 인스턴스인지 여부를 확인할 때, 이 판단을 '슈퍼클래스' 감지라고도 합니다. 인스턴스of의 왼쪽 작업 객체가 객체가 아닌 경우에는 false를 반환합니다. 오른쪽 연산이 함수가 아닌 경우 typewrong 예외가 발생합니다.

instanceof 연산자의 작동 방식을 이해하려면 먼저 "프로토타입 체인"을 이해해야 합니다. JavaScript의 상속 메커니즘인 프로토타입 체인에 대해서는 6장 2절에서 자세히 설명합니다.

o instanceof f 표현식을 계산하기 위해 JavaScript PenXian은 먼저 f.prototyoe를 계산한 다음 프로토타입 체인에서 o를 쿼리합니다. o가 발견되면 o는 f의 인스턴스(또는 f의 상위 클래스)입니다. true가 반환됩니다. 그렇지 않으면 거짓

10. 논리식

논리 연산자 "&&", "||" 및 "!"는 연산에 대해 부울 산술 연산을 수행합니다. 이들은 종종 관계 연산자와 함께 사용되어 더 복잡한 표현식을 형성합니다.

논리적 AND

"&&" 연산자는 세 가지 수준으로 이해될 수 있습니다. 가장 간단한 이해는 피연산자가 모두 부울 값인 경우 "&&"는 두 부울 값에 대해 부울 AND(AND) 연산을 수행하고, 첫 번째 피연산자와 두 번째 피연산자가 모두 true인 경우에만 true를 반환한다는 것입니다. 피연산자가 false이면 false를 반환합니다.

"&&"는 두 관계식을 연결하는 데 사용됩니다

x == 0 && y == 0; //x와 y가 모두 0인 경우에만 true를 반환합니다
관계식은 항상 true 또는 false를 반환하므로 이렇게 사용하면 "&&" 자체도 true 또는 false를 반환합니다. 관계 연산자는 "&&"(및 "||")보다 우선순위가 높으므로 이와 같은 표현식은 괄호 없이도 안전하게 작성할 수 있습니다.

"&&" 피연산자는 반드시 부울 값일 필요는 없습니다. 일부 값은 "참 값"과 "거짓 값"으로 간주될 수 있습니다. (3장 3절과 마찬가지로 false 값은 false null undefine 0 -0 NaN 및 ""이며, 모든 개체를 포함한 모든 값과 기타 값은 true 값입니다.) "&&"에 대한 두 번째 이해 수준은 "&&"가 true 및 false 값에 대해 부울 AND(AND) 연산을 수행할 수 있다는 것입니다. 두 피연산자가 모두 true이면 true 값이 반환되고, 그렇지 않으면 적어도 하나의 피연산자는 false입니다. JavaScript에서 부울 값이 사용될 때마다 표현식 문은 이를 true 또는 false 값으로 처리하므로 실제로 "&&"가 항상 true와 false를 반환하지는 않습니다. 그러나 이는 큰 문제가 아닙니다.

위에서 언급한 연산자는 "참값"과 "거짓값"을 반환하지만, "참값"과 "거짓값"이 무엇인지는 설명하지 않는다는 점에 유의해야 합니다. . "&&"의 세 번째 레이어에 대한 이해. 연산자는 먼저 왼쪽 피연산자의 값을 계산합니다. 즉, "&&"의 왼쪽에 있는 표현식을 먼저 계산합니다. 계산 결과가 거짓 값이면 전체 표현식의 결과도 거짓 값이어야 하며, 따라서 "&&"는 오른쪽 피연산자를 계산하지 않고 단순히 왼쪽 피연산자를 반환합니다.

코드 복사 코드는 다음과 같습니다.

var o = {
                    x: 1
            };
          var p = null;
o && o.x; //=>1 : 1:0은 참값이므로 반환값은 o.x
                p && p.x //= null: p는 false 값이므로 p.x를 계산하지 않고 반환됩니다

"&&"가 올바른 피연산자를 계산하지 못할 수 있다는 점을 이해하는 것이 중요합니다. 위 코드에서 변수 P의 값은 null이며, p.x를 계산하면 예외 오류가 발생합니다.

은 참값인 경우에만 계산됩니다(null이거나 정의되지 않을 수 없음).

"&&"의 동작을 "단락"이라고도 하며, 이를 활용하여 조건부로 코드를 실행하는 코드를 많이 볼 수 있습니다. 예를 들어 다음 두 코드는 동일합니다

코드 복사 코드는 다음과 같습니다.

If (a == b) stop(); // a == B인 경우에만 stop()을 전송할 수 있습니다
(a == b) && stop() //위와 동일

일반적으로 "&&" 오른쪽 표현식에 부작용(할당, 증가, 감소, 함수 호출 표현식)이 있을 경우 주의하세요. 부작용이 있는 이러한 표현식의 실행은 왼쪽 연산자 마우스의 계산 결과에 따라 달라지기 때문입니다.

"&&"는 두 번째 및 세 번째 수준의 이해에 따라 일부 복잡한 표현식 작업을 수행할 수 있지만 대부분의 경우 "&&"는 true 및 false 값에 대한 부울 계산을 수행하는 데만 사용됩니다.

ii. 논리 OR(||)

"||" 연산자는 두 피연산자에 대해 부울 OR(OR) 연산을 수행합니다. 피연산자 중 하나가 true이면 true를 반환하고, 두 피연산자 모두 false이면 false를 반환합니다.

"||" 연산자는 대부분의 경우 "&&"와 같이 단순한 부울 OR(OR) 연산을 수행하지만 먼저 첫 번째 피연산자의 값을 계산하는 좀 더 복잡한 동작도 수행합니다. 즉, 계산 결과가 true이면 왼쪽의 표현식이 먼저 계산되고, 그렇지 않으면 두 번째 값이 계산됩니다.

"&&"와 마찬가지로 오른쪽에 부작용이 있는 표현식을 명시적으로 사용하지 않는 한 부작용이 있는 일부 표현식이 포함된 오른쪽 피연산자를 피해야 하며 오른쪽의 표현식이 평가되지 않을 수 있습니다.

이 연산자가 사용되는 가장 일반적인 방법은 대체 표현식 세트에서 첫 번째 참 값 표현식을 선택하는 것입니다.

코드 복사 코드는 다음과 같습니다.

​​​​ //max_width가 정의되어 있으면 직접 사용합니다. 할당은 기본 설정 개체에서 max_width
를 찾습니다. ​​​​ //정의되지 않은 경우 하드코딩된 상수를 사용한다.
var max =max_width ||references.max_windth ||
이 일반적인 사용법은 일반적으로 매개변수에 기본값을 제공하는 함수 본문 내에서 사용됩니다.

코드 복사 코드는 다음과 같습니다.
//o의 성공적인 속성을 p에 복사하고 p를 반환합니다
             기능 복사(o, p) {
                   p = p || 매개변수 p에 객체가 전달되지 않으면 새로 생성된 객체가 사용됩니다.
//함수 본문의 주요 논리

iii.논리적 NOT(!)

"!" 연산자는 단일 피연산자 앞에 배치되는 단항 연산자입니다. 그 목적은 피연산자의 부울 값을 부정하는 것입니다.

"&&" 및 "||" 연산자와 달리 "!" 연산자는 먼저 피연산자를 부울 값으로 변환한 다음(3장의 항소 규칙 참조) 부울 값을 부정합니다. 즉, "!"는 항상 true와 false를 반환합니다. 또한 두 가지 논리 NOT 연산을 사용하여 값의 부울 값을 얻을 수 있습니다. (!!x, 3장 8절 2절 참조)

"!"는 우선순위가 높으며 피연산자와 밀접하게 연결되어 있습니다. p && q를 비교하려면 정원 대괄호(p && q)가 필요합니다. 다음 코드:

코드 복사 코드는 다음과 같습니다.
                 !(p && q) === !p ||                  !(p || q) === !p && !q


p와 q의 모든 값에 대해 이 두 표현식은 항상 유지됩니다.

11. 과제 표현

Javascript는 "=" 연산자를 사용하여 변수나 속성에 값을 할당합니다. 예:

                i = 0 //변수 i를 0으로 설정
                 o.x = 1 //객체 o의 속성 x를 1로 설정

"=" 연산자는 왼쪽 피연산자가 lvalue(변수 또는 객체 속성(또는 배열 요소))일 것으로 예상하며 오른쪽 피연산자는 모든 유형의 값이 될 수 있습니다. 할당 표현식의 값은 오른쪽 피연산자의 값입니다. 할당 표현식의 부작용은 오른쪽 피연산자의 값이 왼쪽의 변수 또는 개체 속성에 할당된다는 것입니다. 이 경우 이 변수와 개체의 속성에 대한 후속 참조에서 이 값을 얻습니다.

대입 표현식의 값은 매우 간단하지만 때로는 할당 표현식이 포함된 복잡한 표현식을 볼 수 있습니다. 예를 들어 할당 및 감지 작업을 하나의 표현식에 넣습니다.

코드 복사 코드는 다음과 같습니다.

(a = b) == 0

이런 경우에는 "="와 "=="의 차이점을 확실히 알아야 합니다! , "="의 우선순위는 매우 낮다는 점에 유의해야 합니다. 일반적으로 긴 표현식에 대입문을 사용할 경우 올바른 작업 순서를 보장하기 위해 정원 대괄호를 추가해야 합니다.

대입 연산자의 연관성은 오른쪽에서 왼쪽입니다. 즉, 여러 개의 할당 연산자가 표현식에 나타나며, 연산 순서도 오른쪽에서 왼쪽으로 이루어집니다. 따라서 다음과 같은 방법으로 여러 변수를 할당할 수 있습니다. .

코드 복사 코드는 다음과 같습니다.

         i=j=k=0; //세 변수를 0으로 초기화합니다

작업이 포함된 할당 작업:

일반 할당 작업 외에도 JavaScript는 할당 작업을 다른 연산자에 연결하는 다른 할당 연산자도 지원합니다. 더 빠른 계산 방법을 제공합니다. 예를 들어 = 연산자는 더하기 연산자와 대입 연산을 수행합니다.

합계 = salaes_tax;
다음 표현식과 동일

총액 = 총 salae_tax
연산자 "="는 숫자 또는 문자열에 작용할 수 있습니다. 해당 연산이 숫자이면 추가 및 할당 작업을 수행하고, 문자열이면 문자열 연결 및 할당 작업을 수행합니다.

이 유형의 연산자에는 다음 할당 연산자 표에 표시된 것처럼 "-=","*=","&=" 등도 포함됩니다.

연산자 예
와 동일 =a =b a=a b
-= a-=b a=a-b
*=a*=ba=a*b
/= a/=b a=a/b
%=a%=ba=a%b
<<= a<<=b a=a< >>= a>>=b a=a>>b
>>>= a>>>=b a=a>>>b
&= a&=b a=a&b
|= a|=b a=a|b
^=a^=ba=a^b
대부분의 경우

라는 표현을 사용합니다.

a 작전 =b
여기서 op는 연산자를 나타내며 이 표현식은

과 동일합니다.

a =a op b
첫 번째 줄에서는 a 표현식이 한 번 평가되고, 두 번째 줄에서는 a 표현식이 두 번 평가됩니다.

부작용(예: 함수 호출 및 할당 작업)이 있는 표현식이 포함된 경우에만 둘은 동일하지 않습니다. 다음 두 표현은 동일하지 않습니다

코드 복사 코드는 다음과 같습니다.

              데이터[i] *= 2;
              데이터[i] = 데이터[i] * 2

12. 표현식 계산

많은 해석 언어와 마찬가지로 JavaScript도 JavaScript 소스 코드로 구성된 문자열을 해석 및 실행하고 값을 생성할 수 있습니다. JavaScript는 이 작업을 완료하기 위해 전역 함수 eval()을 사용합니다.

eval("3 2") //=>5
소스 코드에서 문자열을 동적으로 결정하는 것은 실제로 적용할 필요가 거의 없는 강력한 언어 기능입니다. eval()을 사용하는 경우 실제로 필요한지 신중하게 고려해야 합니다.

다음은 eval()의 기본 사용법을 줄이고 이를 엄격하게 사용하는 두 가지 방법을 코드 최적화 관점에서 소개합니다. 이 두 가지 방법은 원본 코드에 가장 적은 영향을 미칩니다.

i.eval (eval()은 함수이지만 연산자로 취급되었습니다.)

eval()에는 매개변수가 하나만 있습니다. 전달된 매개변수가 문자열이 아닌 경우 이 매개변수를 직접 반환합니다. 매개변수가 문자열이면 문자열을 JavaScript(구문 분석)로 컴파일합니다. 컴파일에 실패하면 구문 오류(SyntaxError)가 발생합니다. 컴파일이 성공하면 이 코드가 실행되고 문자열의 마지막 표현식 또는 명령문의 값이 반환됩니다. 마지막 표현식에 명령문이나 값이 없으면 결국 undefound가 반환됩니다. 문자열에서 예외가 발생하면 예외는 eval()

에 대한 호출을 전달합니다.

eveal()에서 가장 중요한 점은 호출하는 변수 범위 환경을 사용한다는 것입니다. 즉, eveal()의 코드와 동일한 방식으로 변수의 값을 조회하고 새로운 변수와 함수를 정의합니다. 지역 코드 범위. 함수가 지역 변수 x를 정의한 다음 eval("x")를 호출하면 지역 변수의 값이 반환됩니다. eval("x=1")을 호출하면 지역 변수의 값이 변경됩니다. 함수가 eval("var y=3;")을 호출하면 새 지역 변수 y를 선언합니다. 마찬가지로 함수는 다음 코드를 통해 로컬 함수를 선언할 수 있습니다.

eval("함수 f(){return x 1;}");
최상위 코드에서 eval()이 호출되는 경우. 물론 전역 변수와 전역 함수에 대해 작동합니다.

ii. 글로벌 평가()

eval()에는 로컬 변수를 변경할 수 있는 기능이 있습니다. 이는 자바스크립트 최적화 프로그램에 있어서 큰 문제입니다. 그러나 임시방편으로 자바스크립트는 eval() 함수를 호출하는 라인이 수행하는 작업을 많이 수행하지 않습니다. . 그러나 스크립트가 별칭을 정의하고 이를 이름으로 호출할 때 JavaScript 인터프리터는 어떻게 작동합니까? ECMAScipt3 표준은 인터프리터가 eval()에 별칭을 할당하는 것을 허용하지 않는다고 규정합니다. 다른 별칭을 사용하여 eval()을 호출하면 EvalError 예외가 발생합니다.

실제로 대부분의 구현에서는 이 작업을 수행하지 않습니다. 별칭을 통해 호출되면 eval()은 해당 문자열을 최상위 전역 코드로 실행합니다. 코드를 실행하면 새로운 전역 변수와 전역 함수가 정의될 ​​수 있습니다. 실행된 코드는 새로운 전역 변수와 전역 함수를 정의하거나 전역 변수에 값을 할당할 수 있습니다. 그러나 호출 함수의 지역 변수는 수정되거나 수정될 수 없으므로 함수 내의 코드 최적화에는 영향을 미치지 않습니다.

ECMAScript5는 EvalError 사용을 반대하고 eval()의 동작을 표준화합니다. "직접 평가", 정규화되지 않은 "평가" 이름을 사용하여 eval() 함수를 직접 호출하면 항상 해당 컨텍스트 범위 내에서 분기됩니다. 다른 간접 호출은 전역 함수를 컨텍스트 범위로 사용합니다. 그리고 지역 변수와 함수를 읽고, 쓰고, 정의할 수 없습니다. 다음은 코드 예시입니다:

코드 복사 코드는 다음과 같습니다.

var geval = eval; //별칭을 사용하여 eval을 호출하면 전역 평가가 됩니다
          var x = "전역",
                   y = "global" //두 개의 전역 변수
              function f() { //함수 내에서 실행되는 로컬 평가
​​​​​​​​ var                    eval("x = 'changed';") // eval은 지역 변수의
을 직접 변경합니다. 반품             }
             function g() { //이 함수는 전역 평가를 실행합니다
                    var y = "local" //로컬 변수가 정의됨
                   geval("y = 'changed';") //지역 변수 값을 간접적으로 변경함
Return y; // 변경되지 않은 지역 변수로 돌아갑니다
            }
                   console.log(f(), x) //로컬 변수가 변경되었으며 출력 로컬이 전역으로 변경되었습니다.
                console.log(g(), y) //전역 변수가 변경되었습니다. 출력 로컬 globalchanged


13. 기타 운영자.

Javascript는 기타 다양한 연산자를 지원합니다.

i.조건연산자(?:)

조건 연산자는 JavaScript의 유일한 삼항 연산자입니다. 일반적으로 이 연산자는 "?:"로 작성됩니다. 이 연산자에는 세 개의 피연산자가 있습니다. 첫 번째 피연산자는 "?" 앞에 있고 두 번째 피연산자는 ":" 사이에 있습니다. 세 번째 피연산자는 ":" 이후입니다(예:

).

x > 0 ? x : -x; //x의 절대값 찾기

조건부 연산자의 피연산자는 모든 유형이 될 수 있습니다. 첫 번째 피연산자는 부울 값으로 처리됩니다. true인 경우 두 번째 피연산자가 평가되어 결과가 반환됩니다. 할당 첫 번째 값 피연산자가 false이면 세 번째 피연산자가 평가됩니다. 그리고 계산 결과를 반환합니다. 두 번째 및 세 번째 피연산자는 항상 그 중 하나로 평가됩니다. 두 가지를 동시에 하는 것은 불가능합니다. 실제로 if 문(5.4.1)을 사용하여 동일한 효과를 얻을 수 있습니다. "?:" 연산자는 단지 약식 형식을 제공합니다. 다음은 변수 정의 여부를 결정하는 "?:"의 일반적인 사용 시나리오입니다. 정의되어 있으면 기본값이 사용됩니다.


grett = "hello"(사용자 이름 ? 사용자 이름: "3");


아래 코드와 동일하지만 위 코드가 더 간결합니다

          grett = "안녕하세요";
&N
관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!