컴퓨터 프로그램의 작동에는 번호 3.14 또는 "Hello World"와 같은 운영 값이 필요합니다. 프로그래밍 언어에서 표현 및 작동 할 수있는 값 유형을 데이터 유형이라고합니다. 프로그래밍 언어의 가장 기본적인 기능은 여러 데이터 유형을 호스팅하는 것입니다. 프로그램이 향후 사용을 위해 값을 유지 해야하는 경우 변수를 (값을 저장) 할당됩니다. 변수는 값의 상징적 이름이며, 값에 대한 참조는 이름으로 얻을 수 있습니다. 변수의 작동 메커니즘은 프로그래밍 언어의 기본 기능입니다. 이 장에서는이 장의 내용을 이해하는 데 도움이되는 이전 섹션을 참조하고 나중에 더 깊이 설명합니다.
JavaScript 데이터는 두 가지 범주로 나뉩니다. 원시 유형과 객체 유형
JavaScript의 원래 클래스에는 숫자, 문자열 및 부울 값이 포함됩니다. 이 장에는 JavaScript의 숫자, 문자열 및 부울 값에 대해 특별히 논의하는 별도의 장이 있습니다. JavaScript에는 두 개의 특수 원시 값, NULL (빈) 및 정의되지 않은 (정의되지 않은) 숫자가 아닙니다. 숫자, 문자열 또는 부울 값이 없습니다. 그들은 각자의 특수 유형의 유일한 구성원을 나타냅니다.
JavaScript는 숫자, 문자열, 부울 값, null 및 정의되지 않은 객체입니다. 객체는 속성 모음입니다. 각 속성은 "이름/값 쌍"으로 구성됩니다 (값은 숫자, 문자열 또는 객체와 같은 원시 값일 수 있음). 더 특별한 개체 중 하나 (Global Object는 Miss Fifth에서 소개 될 것이며 여섯 번째 섹션은 자세히 설명됩니다)
정상적인 JavaScript 객체는 "이름이 지정된 값"의 NO NO NOGESTRY 컬렉션입니다. JavaScript는 또한 순서대로 번호가 매겨진 값 세트를 나타내는 특수 객체 (배열)를 정의합니다. JavaScript는 배열에 대한 전용 구문을 정의합니다. 배열은 일반 객체와 다른 고유 한 동작 속성을 가지고 있습니다.
JavaScript는 또한 특수 객체 기능을 정의합니다. 함수는 실행 가능한 실행 코드가있는 객체입니다. 함수를 호출하여 코드를 실행하고 작업 결과를 반환합니다. 배열과 마찬가지로 기능 동작 특성은 다른 객체와 다릅니다. JavaScript는 함수 사용을위한 특수 구문을 정의합니다. JavaScript 함수의 경우. 가장 중요한 것은 모두 진정한 값이며 JavaScript를 사용하여 일반적인 대상으로 취급 할 수 있습니다.
함수가 새 연산자 사용 (새 연산자 사용)을 초기화하면이를 생성자라고합니다. 각 생성자는 생성자 초기화 객체로 구성된 클래스 객체 A 컬렉션을 정의합니다. 클래스는 객체 유형의 하위 유형으로 간주 될 수 있습니다. 배열 클래스 및 기능 클래스 외에도 JavaScript는 사용 된 세 가지 클래스도 정의합니다. 날짜는 날짜를 나타내는 개체를 정의합니다. Regexp는 정규 표현의 대상을 정의합니다. 오류 클래스는 JavaScript 프로그램에서 런타임 오류 및 구문 오류 오브젝트를 나타내는 줄을 정의합니다. 자신의 생성자를 정의하여 필요한 클래스를 정의 할 수 있습니다.
JavaScript 통역사에는 자체 메모리 관리 메커니즘이있어 메모리 수집을 자동으로 수집 할 수 있습니다. 즉, 프로그램이 주문형 객체를 만들 수 있으며 프로그래머는 이러한 물체의 파괴와 메모리 재활용에 대해 걱정할 필요가 없습니다. 객체에 대한 기준이없는 경우, 통역사는 객체가 쓸모 없다는 것을 알고 있으며 차지하는 메모리 자원을 자동으로 재활용 할 것입니다.
JavaScript는 객체 지향 언어입니다. 엄격하게 말할 수는 없지만, 이는 다른 유형의 값을 작동시키기 위해 글로벌 정의 기능을 사용하지 않음을 의미합니다. 데이터 유형 자체는 값을 사용하는 방법을 정의 할 수 있습니다. 예를 들어, 배열 a의 요소를 정렬하려면 a를 정렬 () 함수로 전달할 필요가 없지만 메소드 SORT ()를 전송하려면
a.sort (); // 정렬 (a) 객체 지향 버전
기술적으로 JavaScript 객체 만 메소드를 가질 수 있습니다. 그러나 숫자, 문자열 및 부울 값도 고유 한 방법이 있습니다. JavaScript에서는 NULL 및 정의되지 않은만이 방법을 가질 수없는 값입니다.
JavaScript의 유형은 원시 유형 및 객체 유형으로 나눌 수 있으며 방법과 방법을 가질 수없는 방법과 유형을 가질 수있는 유형으로 나눌 수 있습니다. 또한 돌연변이 및 불변 유형으로 나눌 수도 있습니다. 변이성 유형의 값을 수정할 수 있으며 객체와 배열은 변동성 유형에 속합니다. JavaScript 프로그램은 객체의 속성 값과 배열 요소의 값을 변경할 수 있습니다.
숫자, 부울, 널 및 정의되지 않은 것은 변할 수없는 유형입니다. 예를 들어, 배열 자체의 내용을 수정하는 것은 의미가 없습니다. 문자열은 문자 배열로 간주 될 수 있으며 변경 될 수 있다고 생각할 수 있습니다. 그러나 JavaScript에서는 현이 불변입니다. 문자열의 모든 위치에서 텍스트에 액세스 할 수 있지만 JavaScript는 항상 문자열의 텍스트 내용을 수정하는 방법을 제공하지 않습니다.
JavaScript는 데이터 유형 변환을 자유롭게 수행 할 수 있습니다. 예를 들어, 프로그램이 문자열을 사용하는 곳에서 숫자를 사용하는 경우 JavaScript는 숫자를 문자열로 자동 변환합니다. 부울 값이 사용되는 부울이 아닌 값을 사용할 것으로 예상되면 JavaScript도 그에 따라 변환됩니다. JavaScript에서 "판단 평등"규칙은 "판단 평등"(평등)에 사용됩니다.
JavaScript 변수는 유형이 없습니다. 변수는 사람과 유형에 할당 할 수 있습니다. VAR 키워드를 사용하여 변수를 선언 할 수 있습니다. JavaScript는 구문 범위를 채택합니다. 어떤 함수에서 선언되지 않은 변수를 글로벌 변수라고합니다. JavaScript의 프로그램의 어느 곳에서나 볼 수 있습니다.
1. 숫자
다른 프로그래밍 언어와 달리 JavaScript는 정수 값과 부동 소수점 값을 구별하지 않습니다. JavaScript의 모든 값은 부동 소수점 값으로 표현됩니다. 숫자가 JavaScript 프로그램에 직접 나타나면 숫자 문자가 있으며 JavaScript는 여러 형식의 숫자 직접 수량을 지원합니다. (참고 : 숫자 직전에 부정적인 부호 (-)를 추가하면 음수 값을 얻을 수 있지만 음수 부호는 편도 역 연산자입니다. , 직접 수치 양의 문법의 구성 요소가 아닙니다. ))
나는 정수 유형 직접 수량입니다
소수 정수는 JavaScript의 배열 시퀀스로 표시됩니다.
자바 스크립트는 10 진수 정수 직접 수량 외에도 16 가지 메커니즘 (16)의 값을 카디널리티로 인식합니다. 소위 16 진수 시스템은 "0x"또는 "0x"로 접두사 한 다음 16 진수 문자열로 접두사입니다. 16 진수 값은 0-9와 (a) -f (f) 사이의 문자로 구성됩니다. AF의 문자는 아래 10-15 숫자로 표현됩니다. 다음은 16 진수의 직접적인 양의 예입니다
코드 사본은 다음과 같습니다.
0xff // 15*16+15 = 255
0xcafe911
ECMAScript는 옥탈 직접 수량을 지원하지 않지만 일부 JavaScript의 구현은 8 월 (기본 8)에서 정수의 표현을 허용 할 수 있습니다. Octal 직접 수량은 숫자 0에서 시작하여 0과 7 사이의 숫자 시퀀스가 이어집니다.
코드 사본은 다음과 같습니다.
0377 // 3*64 +7*8 +7 = 255 (소수점)
일부 JavaScript 구현은 Octal Inter-Number를 지원하기 때문에 일부는 그렇지 않지만 0으로 접두사를 사용하지 않는 것이 가장 좋습니다. 결국 현재 JavaScript 구현이 Octal Parsing을 지원하는지 여부를 알 수 없습니다. ECMAScript6의 엄격한 모드에서, 직접 문어 수량은 명시 적으로 금지된다.
II. 부동 소수점 직접 수량
부동 소수점 직접 수량에는 소수점이 포함될 수 있으며 전통적인 실수 작문 방법을 사용합니다. 실수는 정수 부분, 소수점 및 소수점으로 구성됩니다.
또한 지수 계수 방법을 사용하여 부동 소수점 직접 수량을 나타낼 수 있습니다. 즉, 실수 숫자 뒤에 문자 E 또는 E가 이어지고 양수 및 음수 부호가 뒤 따른 다음 정수 지수가 추가됩니다. 이 카운팅 방법으로 표시되는 수치 값은 이전 실수의 지수 전력에 10을 곱합니다.
보다 간결한 구문으로 표현할 수 있습니다
코드 사본은 다음과 같습니다.
[숫자] [. 숫자] [(e | e) [(+|-)] 숫자]
3.14
2345.455
.3333333333333333333333333333333
6.02E23 //6.02*10 23 차 전력
1.255454E-23 //1.255454*10 23 차 전력
iii.javaScript의 산술 작동
JavaScript 프로그램은 언어 지방에서 제공하는 산술 연산자를 사용하여 수치 작업을 수행합니다. 이 연산자는 + - * / 및 나머지 (나뉘어진 나머지) 연산자 %를 포함합니다.
기본 연산자 외에도 JavaScript는보다 복잡한 산술 작업을 지원합니다. 이 라인 복합 작업은 수학 객체의 속성으로 정의 된 함수 및 상수에 의해 구현됩니다.
코드 사본은 다음과 같습니다.
Math.Pow (2, 53) // => 9007199254740992 Document.Write (Math.Pow (2,53))
Math.round (.6) //=>1.0 라운드
Math.ceil (.6) //=>1.0 상향 검색
Math.floor (.6) //=>0.0 아래쪽
Math.abs (-5) // => 5 절대 값을 찾으십시오
Math.max (x, y, z) // 최대 값을 반환합니다
Math.min (x, y, z) // 최소값을 반환합니다
Math.random () // 0보다 큰 의사 랜덤 숫자를 생성합니다.
Math.pi // pi
수학 // e : 자연 로그의 기초
Math.sqrt (3) // 3 제곱근
Math.pow (3, 1 /3) // 3의 큐브 루트
Math.sin (0) // Trigonometric 함수뿐만 아니라 Math.Cos, Math.atan 등
Math.Log (10) //=> 2.302585092994046 기본 10이있는 자연 로그
Math.log (512) /Math.ln2 // base 2가있는 512 로그
Math.log (100) /math.ln10 // base 10이있는 100 로그
Math.exp (3) // E의 세력
JavaScript의 산술 작업은 오버플로, 언더 플로 또는 0으로 나눌 수있는 경우 오류를보고하지 않습니다. 그러나 숫자 작동 결과는 JavaScript (오버플로)로 표시 될 수있는 숫자를 초과하며 결과는 특수한 무한 값 (무한) 값으로 JavaScript에서 무한으로 표시됩니다. 마찬가지로, 음수 값이 JavaScript가 표현할 수있는 음수의 범위를 초과 할 때, 결과는 음의 무한대이며, 이는 JavaScript에서 -infinty로 표현됩니다. 무한대 값의 행동 속성은 우리가 기대하는 것과 일치합니다. 추가, 뺄셈, 곱셈 및 분할의 결과는 무한대입니다 (표시 보존)
언더 플로우는 계산 결과가 무선으로 무선으로 0에 가까울 때 발생하는 상황이며 JavaScript가 나타내는 최소값보다 작습니다. 음수가 밑줄이 발생하면 JavaScript는 특수 값 인 "negation zero"를 반환합니다. JavaScript 프로그래머는 부정적인 0을 거의 사용하지 않습니다.
JavaScript는 미리 정의 된 글로벌 변수로 무한대와 NAN이 숫자가 아닌 값을 표현했습니다. ECMASCIPT3에서는이 두 값을 읽고 쓸 수 있습니다. ECMAScript5는이 문제를 읽기 전용으로 정의 하여이 문제를 수정했습니다. ECMASCIPT3의 숫자 객체로 정의 된 속성 값도 읽기 전용입니다. 몇 가지 예는 다음과 같습니다.
코드 사본은 다음과 같습니다.
무한대 // 읽기 가능/쓰기 변수를 무한대로 초기화합니다
숫자. positive_infinity // 동일한 값, 읽기 만 읽으십시오
1 /0 // 이것은 같은 값입니다
번호 .max_value + 1 // 계산 결과는 여전히 무한대입니다
숫자 .negative_infinity //는 음의 무한대를 나타냅니다
-무한대
-1/0
-number.max_value -1
NAN // 읽기 가능/쓰기 변수를 NAN으로 초기화합니다
숫자 .nan // 동일한 값이지만 읽기 만 읽으십시오
0/0 // 계산 결과는 여전히 NAN입니다
숫자 .min_value/2 // 언더 플로우가 발생했습니다. 계산 된 결과는 0입니다
-number.min_value/2 // 음수 0
-1/infinity // 음수 제로
-0 // 음수 제로
JavaScript에는 숫자가 아닌 값에 대해 약간의 특별한 것이 있으며, 이는 인간과 자신을 포함한 가치와 같지 않습니다. 다시 말해, x가 x == nan에 의해 X인지 판단하는 것은 불가능합니다. 대신 X를 사용해야합니다! = x는 x가 nan 인 경우에만 판단하기 위해 표현식의 결과는 참입니다. ISNAN () 함수는 이와 유사합니다. 매개 변수가 NAN 또는 비수막 값 (예 : 문자열 및 객체) 인 경우 TRUE가 반환됩니다. javaScript에는 isfinite ()가 유사한 함수가 있으며, 매개 변수가 NAN, 무한 또는 -infinity가 아닌 경우 true를 반환합니다.
음수 제로 값도 약간 특별합니다. 양수 및 음수 제로 (JavaScript의 엄격한 평등 테스트를 사용하여 판단)와 동일합니다. 이는이 두 값이 다음과 거의 동일하다는 것을 의미합니다.
코드 사본은 다음과 같습니다.
var Zero = 0;
var negz = -0;
Zero === negz // => true positive and negation zero 값은 동일합니다.
원
IIII.BINARY 플로팅 포인트 번호 및 반올림 오류
수많은 실수가 있지만 JavaScript는 부동 소수점 번호의 형태를 통해서만 유한 숫자를 나타낼 수 있습니다 (정확하게, 18 437 736 874 454 810 627), 즉 실수 숫자가 JavaScript에서 사용될 때 종종 실제 가치의 대략적인 표현 일뿐입니다.
JavaScript는 IEEE-754 부동 소수점 번호 표기법 (거의 모든 현대 프로그래밍 언어에서 사용)을 채택합니다. 이것은 1/2 1/8 및 1/1024와 같은 분수를 정확하게 나타낼 수있는 이진 표현입니다. 불행히도, 우리가 자주 사용하는 분수, 특히 재무 계산에서는 모두 소수 분수 1/10, 1/100 등을 기반으로합니다. 바이너리 표기법은 0.1과 같은 간단한 숫자를 나타낼 수 없습니다.
JavaScript의 숫자는 충분한 정밀도를 가지고 있습니다. 0.1에 가까울 수 있습니다. 그러나 실제로 숫자를 정확하게 표현할 수 없으면 문제가 발생합니다.
코드 사본은 다음과 같습니다.
var x = .3- .2;
var y = .2- .1;
alert (x == y) // => false 두 값이 같지 않습니다.
x == .1 // => false .3-.2는 .1과 같지 않습니다
y == .1 // => true .2-.1과 같습니다
반올림 오류로 인해 0.3과 0.2의 대략적인 차이는 실제로 0.2와 0.1의 대략적인 차이와 같지 않습니다 (실제 시뮬레이션 환경에서 0.3-0.2 = 0.09999999999999999999998). 이 문제는 JavaScript에있을뿐만 아니라 이것을 이해하는 것이 매우 중요합니다.이 문제는 이진 부동물 포인트 번호를 사용하는 모든 프로그래밍 언어에서 발생합니다. 위 코드에서 x와 y의 값은 서로 매우 가깝고 최종 올바른 값이 있다는 점에 유의해야합니다. 이 계산 결과는 대부분의 계산 작업에 유능 할 수 있습니다. 이 문제는 두 값이 동일인지 비교할 때만 발생합니다.
향후 버전의 JavaScript는이 문제를 피하기 위해 십진수 숫자 유형을 지원할 수 있습니다. 그 전에 중요한 재무 계산을 위해 큰 정수를 사용하는 것을 선호 할 수 있습니다. 예를 들어, 금전 단위의 소수 "요소"대신 정수 "세그먼트"를 사용하십시오.
iiiii.date와 시간
JavaScript 언어의 핵심에는 날짜 () 생성자가 포함되며, 원래 날짜와 시간의 객체를 생성했습니다. 이 날짜 객체의 방법은 날짜 계산을위한 간단한 API를 제공합니다. 날짜 개체는 숫자와 같은 기본 데이터 유형이 될 수 없습니다.
코드 사본은 다음과 같습니다.
var Zhen = 새로운 날짜 (2011, 0, 1); // 2011 년 1 월 1 일
var later = new 날짜 (2011, 0, 1, 17, 10, 30); // 같은 날
var now = 새 날짜 (); // 현재 날짜와 시간
var elapsed = now -zhen; // 날짜 뺄셈. 시간 간격의 밀리 초 수를 계산하십시오
나중에 .getlyear (); // => 2011
나중에 .getmonth (); // => 0 개월에서 0 개월
나중에 .getDate (); // => 1 1에서 계산 된 일 수
나중에 .getday (); // => 5 요일을 얻습니다. 0은 일요일을 나타내고 5는 일요일을 나타냅니다
나중에 .gethours () // => 현지 시간
agget.
2. 텍스트
문자열은 불변의 16 비트 값의 불변의 순서 순서이며, 각 문자는 일반적으로 유니 코드 문자 세트에서 나옵니다. JavaScript는 문자열 유형을 통해 텍스트를 나타냅니다. 문자열의 길이는 포함하는 16 비트 값의 수입니다. JavaScript 문자열 (및 배열)의 인덱스는 0에서 시작됩니다. 빈 문자열의 길이는 0이며 JavaScript에서 단일 문자를 나타내는 "문자 유형"이 없습니다. 16 비트 값을 나타내려면 문자열 변수에 할당하십시오. 이 문자열의 길이는 1입니다.
문자 세트, 내부 코드 및 JavaScript 문자열
JavaScript는 UTF-16 인코딩 유니 코드 문자 세트를 사용하고 JavaScript 문자열은 정렬되지 않은 16 비트 값 세트로 구성된 시퀀스입니다. 가장 일반적으로 사용되는 유니 코드 문자는 16 비트 내부 코드로 표시되며 문자열의 단일 문자를 나타냅니다. 16 비트로 표현할 수없는 유니 코드 문자 다음에는 UTF-16 인코딩 규칙이 이어집니다. 이는 길이 2의 JavaScript 문자열 (2 개의 16 비트 값)이 유니 코드 문자를 나타낼 수 있음을 의미합니다.
코드 사본은 다음과 같습니다.
var p = "π"; // π는 16 비트 내부 코드 0x03c0으로 표시됩니다
var e = "e"; // e는 17 비트 내부 코드 0x1d452로 표시됩니다
p.length // => 1 P에는 16 비트 값이 포함됩니다
e.length // => 2 e UTF-16으로 인코딩 된 E.length는 두 가지 값을 포함합니다. "/ud835/udc52"
JavaScript에 의해 정의 된 모든 문자열 작동 방법은 문자가 아닌 16 비트 값에 대해 행위하며 프록시 항목을 별도로 처리하지 않습니다. 마찬가지로 JavaScript는 문자열 처리를 표준화하지 않습니다. 문자열이 합법적 인 UTF-16 형식이라는 보장은 없습니다.
나는 직접 수량을 묶습니다
JavaScript 프로그램의 직접 문자열은 단일 따옴표 또는 이중 인용문으로 둘러싸인 일련의 문자입니다. 단일 따옴표로 구분 된 문자열에는 이중 인용문이 포함될 수 있으며 이중 인용문으로 구분 된 문자열에는 단일 따옴표가 포함될 수 있습니다. 다음은 문자열의 직접 정량화의 몇 가지 예입니다.
코드 사본은 다음과 같습니다.
""// 비어있는 문자열, 0 자
'테스트'
"3.14"
'이름 = "myform"'
"O'Reily의 책을 선호하지 않습니까?"
ECMAScript3에서 문자열의 직접 수량은 한 줄로 기록되어야하며 ECMAScript5에서는 문자열의 직접 수량이 여러 줄로 분할 될 수 있으며 각 선은 백 슬래시 (/)로 끝나야합니다. 백 슬래시 나 라인 엔딩 문자는 문자열의 직접 수량의 내용이 아닙니다. 함께하고 싶다면 /n을 사용하여 캐릭터를 탈출 할 수 있습니다.
단일 따옴표를 사용하여 문자열을 제시 할 때는 약어와 영어로 된 모든 형식에 대해 더주의를 기울여야합니다. 영어 apostrophes와 단일 따옴표는 동일한 문자이므로 백 슬래시 (/)를 사용하여 탈출해야합니다.
II 탈출 문자
JavaScript 문자열에서 Backslashes (/)는 특별한 목적을 가지고 있습니다. 등 슬래시에 캐릭터를 추가하면 더 이상 문자 그대로의 의미를 나타내지 않습니다. 예를 들어, /n은 새로운 라인을 나타내는 탈출 문자입니다.
코드 사본은 다음과 같습니다.
/o // nul 문자
/b // 백 스페이스 문자
/t // 수평 탭 문자
/n // 라인 Newline 문자
/V // 수직 탭 문자
/f // 페이지 갱신
/r // 캐리지 리턴 문자
/"// 이중 인용문
// BackSlash
/xxx 라틴 -1 문자 2 비트 16 진수에 의해 지정됩니다
/xxxxxx 유니 코드 문자 4 비트 16 진수 xxxxx에 의해 지정됩니다
III 스트링 사용
JavaScript의 내장 기능 중 하나는 String 연결입니다. 문자열을 나타내는 문자열에 연산자 +를 사용하십시오. 문자열 연결을 나타냅니다. 예를 들어
코드 사본은 다음과 같습니다.
var msg = "hello" + "World"; // 문자열 Hello World를 생성합니다
문자열의 길이 - 포함하는 16 비트 값의 수를 결정하려면 문자열의 길이와 같은 길이 속성을 사용할 수 있습니다.
S.length
길이 속성 외에도 문자열은 호출 할 수있는 많은 방법을 제공합니다.
코드 사본은 다음과 같습니다.
var s = "안녕하세요, 세계";
s.charat (0); // "h"첫 번째 문자
s.charat (s.length -1) // "d"마지막 문자
S.Substring (1, 4) // "Ell"2-4 문자
s.slice (1, 4) // 위와 동일합니다
s.slice (-3) // 마지막 3자가 나타납니다
s.indexof (l ") // 2 문자 l 첫 번째 발생 위치
s.lastindexof ( "l") // 10 문자 L이 마지막으로 나타나는 시간입니다
s.indexof ( "l", 3) // 위치 3 이후, L 문자가 나타나는 첫 번째 위치
s.split ( ",") // => [ "Hello", "World"]는 하위 문자로 분리됩니다
S.Replace ( "H", "H") // => "Hllo, World"전문 문자 교체
s.touppercase () // => "안녕하세요, 세계"
JavaScript에서는 문자열이 고정되고 변경되지 않습니다. REPLEC () 및 toupperCase ()와 같은 메소드는 새 문자열을 반환하며 원래 문자 자체는 변경되지 않았습니다.
ECMAScript에서 문자는 읽기 전용 배열로 취급 될 수 있습니다. charat () 메소드를 사용하는 것 외에도 사각형 브래킷을 사용하여 문자열의 개별 문자에 액세스 할 수 있습니다. (16 비트 가치)
코드 사본은 다음과 같습니다.
S = "안녕하세요, 세계"
s [0] // => "h"
s [s.length-1] // => "D"
Foxfire는 오래 전에이 방법에 대한 문자열 인덱싱을 지원해 왔으며, 대부분의 최신 브라우저 (IE 제외)는 Mozailla의 발자취를 따라 ECMAScript가 형성되기 전에이 기능을 완료했습니다.
IIII 패턴 매칭
JavaScript는 텍스트 패턴 일치를 나타내는 객체를 만드는 데 사용되는 regexp () 생성자를 정의합니다. 이러한 패턴을 "정규 표현식", JavaScript Perl의 정규식 구문이라고합니다. 문자열 및 regexp 객체는 모두 정규 표현식을 사용하여 패턴을 일치시키고 찾기 및 교체하는 기능을 정의합니다.
regexp 객체는 언어의 기본 데이터 유형이 아닙니다. 날짜와 마찬가지로 실용적인 API가있는 특별한 개체 일뿐입니다. 정규식에는 복잡한 구문과 풍부한 API가 있습니다. REGEXP는 강력하고 일반적으로 사용되는 텍스트 처리 도구이며 여기에 개요 만 있습니다.
REGEXP는 언어의 기본 데이터 유형이 아니지만 여전히 직접 수량을 가지고 있으며 JavaScript에서 직접 사용할 수 있습니다. 두 슬래시 사이의 텍스트는 직접적인 양의 정규 표현식을 형성합니다. 두 번째 슬래시는 또한 하나 이상의 문자를 따를 수도 있습니다. 일치하는 패턴의 의미를 수정하는 데 사용됩니다. 예를 들어:
코드 사본은 다음과 같습니다.
/^html/// html로 시작하는 문자열과 일치합니다
/[1-9] [0-9]*/// 0이 아닌 숫자와 숫자가 일치합니다
// bjavaScript/b/i/// 단어 javaScript와 일치하고 상류 및 소문자를 무시합니다.
REGEXP 객체는 많은 유용한 방법을 정의하며 문자열에는 REGEXP 매개 변수를 수용 할 수있는 방법도 있습니다. 예를 들어:
코드 사본은 다음과 같습니다.
var text = "테스트 : 1,2,3"; // 텍스트 예제
var pattern = // d+/g // 하나 이상의 숫자를 포함하는 모든 인스턴스와 일치
pattern.test (text) // => true : 경기가 성공적입니다
text.search (패턴) // => 9 : 첫 경기가 성공한 위치
text.match (Pattern) // => [ "1", "2", "3"] 모든 일치는 배열을 형성합니다
text.repeat (Pattern, "#"); // => "테스트 :#,#,#"
text.split (// d+/); // => [ "", "1", "2", "3"] : 숫자가 아닌 문자를 사용하여 문자열을 가로 채립니다
3. 부울 가치
부울 값은 참 또는 거짓, 켜짐 또는 꺼짐을 나타냅니다. 이 유형에는 두 가지 값이 있으며 True 또는 False라는 단어는 예약되어 있습니다.
JavaScript에서 비교 진술의 결과는 일반적으로 부울 값입니다. 예를 들어
a == 4
이 코드는 변수의 A의 값이 4와 동일인지 여부를 감지하는 데 사용됩니다. 동일하면 값이 사실이면 값이 동일하지 않으면 값입니다.
부울 값은 일반적으로 JavaScript의 IF/Else 문과 같은 JavaScript 제어 문에 사용됩니다. 부울 값이 참이면 첫 번째 논리를 실행하고 다른 코드 조각이 False 인 경우 (예 :
코드 사본은 다음과 같습니다.
if (a == 4)
b = b + 1;
또 다른
a = a + 1;
JavaScript 값을 부울 값으로 변환 할 수 있으며 다음 값은 False로 변환됩니다.
코드 사본은 다음과 같습니다.
한정되지 않은
널
0
-0
난
""// 비어있는 문자열
모든 객체 (배열)를 포함한 다른 모든 값은 true, false로 변환되며 위에 변환 할 수있는 위의 6 값은 때때로 "false 값"이라고합니다. JavaScript는 부울 값을 사용할 때 잘못된 값이 False로 취급되고 실제 가치는 참으로 취급 될 것으로 기대합니다.
예를 살펴 보겠습니다. 변수 O를 추가하면 객체 또는 null이면 if 문을 사용하여 O가 아닌 값인지 여부를 감지 할 수 있습니다.
if (o! == null) ...
불평등 한 연산자 "! =="는 O와 NULL을 비교하고 결과를 참 또는 거짓으로 제공합니다. 먼저 비교 진술을 여기에서 무시할 수 있습니다. NULL은 잘못된 값이고 객체는 진정한 값입니다.
if (o) ...
첫 번째 경우, IF 이후의 코드는 O가 NULL이 아닌 경우에만 실행되며 두 번째 경우의 한계는 그다지 엄격하지 않습니다. 이것은 O가 False 또는 False 값 (예 : NULL 또는 unfined) 인 경우에만 실행됩니다.
부울에는 tostring () 메소드가 포함되어 있으므로이 메소드를 사용하여 문자열을 "true"또는 "false"로 변환 할 수 있지만 다른 유용한 방법이 포함되어 있지 않으며이 중요하지 않은 API 외에도 세 가지 중요한 부울 연산자가 있습니다.
&& 운영자, || 운영자와 단백 운영자 "!" 부울 비 (NOT) 작업을 수행하십시오. 실제 값이 False를 반환하면 False 값은 예를 들어 True를 반환합니다.
코드 사본은 다음과 같습니다.
if ((x == 0 && y == 0) ||! (z == 0)) {
// x와 y는 모두 0이거나 z는 0이 아닙니다.
}
4. 정의 및 정의되지 않은
NULL은 JavaScript 언어의 키워드입니다. 특별한 값 "null value"를 나타냅니다. null의 경우 typeof () 작동을 수행하고 객체를 반환합니다. 즉, NULL은 "비 객체"를 의미하는 특수한 객체 값으로 간주 될 수 있습니다. 그러나 실제로 Null은 일반적으로 자유 유형의 유일한 구성원으로 간주됩니다. 해당 숫자, 문자열 및 객체는 "귀중한"것을 나타낼 수 있습니다. 대부분의 프로그래밍 언어에는 JavaScript와 같은 NULL이 포함되어 있으며 NULL 또는 NIL에 익숙 할 수 있습니다.
JavaScript는 또한 값의 공석을 나타내는 두 번째 값을 가지고 있습니다. 더 깊은 "널 값"을 나타내는 데 사용됩니다. 변수의 값입니다. 변수가 초기화되지 않았 음을 나타냅니다. 객체 속성 또는 배열 요소의 값을 쿼리하려면 정의되지 않은 것을 반환하면 속성 또는 요소가 존재하지 않음을 의미합니다. undefined는 사전 정의 된 글로벌 변수입니다 (NULL과 다르고 키워드가 아닙니다). 그 값은 정의되지 않았습니다. typeof를 사용하여 정의되지 않은 유형을 테스트하는 경우 "정의되지 않은"이 반환되므로 값이 유형의 유일한 멤버임을 나타냅니다.
널과 정의되지 않은 것은 다르지만 둘 다 "값의 공석"을 나타내며, 두 사람은 종종 상호 교환 할 수 있습니다. 평등을 판단하는 운영자 "=="은 두 사람이 동일하다고 생각합니다 (엄격한 평등 조작자를 사용하여 "==="를 사용하여 구별하십시오). 값이 부울 유형 일 것으로 예상되는 경우, 그 값은 모두 거짓입니다. 거짓과 유사합니다. NULL 및 UNDEFINED는 모두 속성과 방법을 포함하지 않습니다. 사실, 사용 "." 이 두 값의 멤버 또는 메소드에 액세스하려면 "[]"는 유형 오류가 발생합니다.
정의되지 않은 것은 잘못된 값의 시스템 수준, 예기치 않게 살아있는 공석을 나타내는 반면, NULL은 프로그램 수준, 정상 또는 예상 값 공석을 나타냅니다. 변수 또는 속성에 복사하거나 매개 변수로 전달하려면 NULL이 최선의 선택입니다.
5. 글로벌 대상
이전 섹션에서는 JavaScript의 요소 유형과 원래 값에 대해 설명합니다. 객체 유형 - 객체, 배열 및 함수 / 그러나 지금 명확하지 않은 매우 중요한 객체 클래스가 있습니다 : 글로벌 객체
Global Object는 JavaScript에서 중요한 용도를 가지고 있습니다. 글로벌 객체의 속성은 전 세계적으로 정의 된 기호입니다. JavaScript 프로그램은 직접 사용할 수 있습니다. JavaScript 통역사가 시작되면 새로운 글로벌 객체를 생성하고 정의 된 초기 속성 세트를 제공합니다.
정의되지 않은 무한대 및 NAN과 같은 글로벌 속성
isnan (), parseint () 및 vall ()와 같은 글로벌 기능
날짜 (), regexp (), String (), object () 및 array ()와 같은 생성자
수학 및 JSON과 같은 글로벌 대상
글로벌 객체의 초기 속성은 예약 된 단어가 아니지만 예약 된 단어로 취급되어야합니다.
코드의 최상위 레벨 - JavaScript 코드는 기능 내에 있지 않으므로 JavaScript 키워드를 통해 전역 객체를 참조 할 수 있습니다.
var global = this; // 전역 객체를 참조하는 전역 변수를 정의합니다.
클라이언트 JavaScript에서 Window Object는 전역 객체 역할을합니다. 이 글로벌 창 객체에는 친숙한 창 참조 자체가 있습니다. 글로벌 객체를 참조하도록 이것을 대체 할 수 있습니다. Windows는 글로벌 코어 속성을 정의합니다. 그러나 일부 글로벌 속성은 웹 브라우저 및 대화식 JavaScript에 대해 정의됩니다.
글로벌 객체는 처음으로 생성되면 JavaScript의 사전 정의 된 모든 글로벌 값을 정의 하며이 특수 객체에는 프로그램에 정의 된 전역 값도 포함되어 있습니다. 코드가 글로벌 변수를 선언하는 경우 이 글로벌 변수는 글로벌 객체의 속성입니다.
6. 포장 물체
JavaScript 객체는 복합 값입니다. 속성 또는 명명 된 값의 모음입니다. 속성 값은 "."를 통해 참조됩니다. 속성 값이 함수 인 경우 메소드이며 OM ()을 사용하여 Object O에서 메소드를 전송합니다.
우리는 문자열에도 속성과 방법이 있음을 알 수 있습니다.
코드 사본은 다음과 같습니다.
var s = "Hello World";
var word = s.substring (s.indexof ( "")+1, s.length); // 문자열의 속성을 사용합니다.
document.write (Word) // "Ello World"
문자열은 객체가 아니기 때문에 왜 속성이 있습니까? 문자열 s의 속성이 참조되는 한 JavaScript는 문자열 메서드를 상속하는 새 문자열을 호출하여 문자열 값을 객체로 변환합니다. 속성 참조를 처리하는 데 사용됩니다. 새 속성이 참조되면. 참조가 완료되면 새로 생성 된 객체가 파괴됩니다. (이 임시 객체는 실제로 반드시 생성하거나 파괴되지는 않지만이 과정은 다음과 같습니다.)
문자열, 숫자 및 부울 값과 마찬가지로 자체 방법이있어 숫자 () 및 boolean () 생성자를 통해 임시 객체를 만듭니다. 이 모든 방법은이 임시 객체에서 호출됩니다. (NULL 및 UNDEFINED가 랩핑되지 않았으며 속성에 액세스하면 유형 오류가 발생합니다).
다음 코드를보고 실행 프로세스에 대해 생각해보십시오.
코드 사본은 다음과 같습니다.
var s = "테스트";
s.len = 4; // 속성을 설정합니다
var t = s.len //이 속성을 찾으십시오
이 코드를 실행할 때 T 값은 정의되지 않습니다. 두 번째 코드 줄은 임시 문자열 객체를 생성하고 Len에게 4의 값을 제공합니다. 그런 다음 객체가 파괴됩니다. 세 번째 줄은 원본 (수정되지 않은) 문자열을 사용하여 새 문자열 객체를 만들고 Len의 속성을 읽으려고합니다.
이 속성은 자연스럽게 존재하지 않으므로 결과가 정의되지 않았 음을 나타냅니다. 이 코드는 문자열, 어레이 및 부울 값의 속성 값 (또는 메소드)을 읽을 때 객체처럼 작동하지만 속성에 값을 할당하려고한다는 것을 보여줍니다. 이 작업은 무시됩니다. 수정은 임시 객체에만 발생합니다. 이 임시 대상은 유지되지 않았습니다.
래퍼 객체의 생성은 String (), 숫자 () 및 boolean () 생성자를 통해 표시 될 수 있습니다.
코드 사본은 다음과 같습니다.
var s = "테스트",
n = 1,
b = 참;
var s = 새 문자열 (들);
var n = 새 숫자 (n);
var b = 새로운 부울 (b);
JavaScript는 필요할 때 래퍼를 원래 값으로 변환하므로 이전 코드의 객체 SNB는 종종 SNB와 동일한 값을 나타냅니다. "=="는 연산자와 동일합니다.
그러나 "==="전체 연산자는 그것들을 불평등으로 취급하며, 원래 값과 랩 랩의 객체의 차이는 연산자 유형을 통해 볼 수 있습니다.
7. 불변의 원래 값과 변이 가능한 객체 참조.
JavaScript의 원래 값 (정의되지 않은 Null 부울 숫자 및 문자열)은 객체 (배열 및 함수 포함)와 근본적으로 다릅니다. 원래 값은 변할 수 없습니다. 어떤 방법도 원시적 값을 가질 수 있습니다 (또는 돌연변이). 숫자와 부울의 경우는 분명히 사실입니다. 숫자의 값을 바꾸는 것은 그 자체로는 의미가 없지만 문자열은 문자의 배열 인 것처럼 보이기 때문에 문자열에는 그다지 분명하지 않습니다. 문자열의 문자는 지정된 인덱스로 수정 될 수 있습니다. 실제로 JavaScript는이 작업을 금지합니다. 문자열의 모든 메소드는 실제로 새 문자열 인 수정 된 문자열을 반환하는 것으로 보입니다.
코드 사본은 다음과 같습니다.
var s = "Hello World";
s.toupperCase (); // "Hello World"를 반환하고 s의 값을 변경하지 않습니다.
s // => "Hello World"원래 문자열이 변경되지 않았습니다
原始值的比较是值的比较,只有在他们的值相当时它们在才相等。这对数字、布尔值、null和undefined来说听起来有点难,并没有其他办法来比较他们。同样,对于字符串来说则不那么明显;如果比较两个单独的字符串,当且仅当他们的长度相等且每个索引的字符都相等时,javascript的才认为相等。
코드 사본은 다음과 같습니다.
var o = {x:1} //定义一个对象
ox = 2 //通过修改对象的属性来改变对象
oy = 3 //再次更改这个对象,给它增加一个新属性
var a =[1,2,3] //数组也是可以修改的
a[0]=0; //更改数组中的一个元素
a[3]=4; 给数组增加一个新元素
对象的比较并非值的比较:即使两个对象包含同样的属性及相同的值,他们也是不相等的,各个索引元素完全相等的两个数组也不相等
코드 사본은 다음과 같습니다.
var o ={x:1}, p={x:1}//两个具有相同属性的两个对象
o === p ;//=>false 两个单独的对象永不相等( o == p ; =>false)
var a =[],b=[]; //两个单独的空数组
a === b ; //=>false两个单独的数组永不相等
我们通常将对象称为引用类型(reference type),以此来和javascript的基本类型区分开来。依照术语的叫法,对象都是引用(reference),对象的比较均是引用的比较;当且当它们应用同一个基对象时,它们才相等。
코드 사본은 다음과 같습니다.
var a = []; //定义一个引用空数组的变量a
var b = a; //变量b引用同一个数组
b[0] = 1;
a[0] //=>1 变量a也会修改
a === b //=>true a和b引用同一个数组,因此他们相等。
就像你刚才看到的如上代码,将对象(或数组)赋值给一个变量,仅仅是赋值的引用值:对象本身并没有复制一次。
如果你想得到一个对象或数组的副本,则必须显式复制对象的每个属性或数组的每个元素。下面的这个例子则是通过循环来完成对数组的复制。
코드 사본은 다음과 같습니다.
var a = ['a', 'b', 'c']; //待复制的数组
var b = []; //复制到目标的空数组
for (var i = 0; i < a.length; i++) { //遍历a[]中的每个元素
b[i] = a[i]; //将元素复制到b中。
}
同样的,如果我们想比较两个单独或者数组,则必须比较他们的属性或元素。下面这段代码定义了一个比较练个数组的函数。
코드 사본은 다음과 같습니다.
function equalArrays(a, b) {
if (a.length != b.length) return false; //两个长度不相同的数组不相等
for (var i = 0; i < a.length; i++) //循环遍历所有元素
if (a[i] !== b[i]) return false; //如果有任意元素不等,则数组不相等
진실을 반환하십시오. // Otherwise they are equal
}
8.类型转化
javascript中的取值型非常灵活,我们已经从布尔值看到了这一点:当javascript期望使用一个布尔值时候,你可以提供任意类型值。javascript将根据需要自行转换类型。一些值(真值)为true,其它值(假值)转化为false.这在其它类型中同样适用。如果javascript期望使用一个字符串,它把给定的值转换为字符串。如果javascript期望使用一个数组,它把给定的值转换为数字(如果转化结果无意义的话将返回NaN),一些例子如下:
코드 사본은 다음과 같습니다.
10 + "object" //=> "10object";
"7" * "4" // =>28 两个字符串均转化为数字
var n = 1 - "x" // =>NaN字符串x无法转换为数字
n + " objects" // =>"NaN objects":NaN转换为字符串"NaN"
下表说明了在javascript中如何进行类型转化。粗体突出了那些让你倍感意外的类型转化。空单元格表示不必要也没有执行的转换。
| 값 | 转换为字符串 | 숫자 | 布尔值 | 물체 |
| 한정되지 않은 null | "한정되지 않은" "null" | NaN 0 | 거짓 거짓 | throws TypeError throws TypeError |
| 진실 거짓 | "ture" "거짓" | 1 0 | new Boolean(true) new Boolean(false) | |
| ""(空字符串) "1.2"(非空,数字) "one"(非空,非数字) | 0 1.2 NaN | 거짓 진실 진실 | new String("") new String("1.2") new String("one") | |
| 0 -0 NaN Infinty -Infinty 1(无穷大,非零) | "0" "0" "NaN" "무한대" "-Infinity" "1" | 거짓 거짓 거짓 진실 진실 진실 | new Number(0); new Number(-0); new Number(NaN) new Number(Infinty) new Number(-Infinty) new Number(1) | |
| {}(任意对象) [](任意数组) [9](1个数字元素) ['a'](其它数组) function(){}(任意函数) | 参考本小节第三节内容 "" "9" 使用join()方法 参考本小节第三节内容 | 参考本小节第三节内容 0 9 NaN NaN | 진실 진실 진실 진실 진실 |
上表提到的原始值到原始值的转换行对简单,我们已经在第本文第三小节讨论过转换为布尔值的情况了。所有原始值转换为字符串的情形也已经明确定义。转换为数字的情形比较微妙。那些以数字表示的字符串可以直接转化为数字,也允许在开始和结尾处带有空格。但在开始和结尾处的任意非空字符都不会被当成数字量的一部分,进而造成字符串为数字的结果为NaN。有一些数字转换看起来让人奇怪:true转换为1,false、空字符串""转换为0.
原始值到对象的转换也非常简单,原始值通过调用String(),Number()或Boolean()构造函数,转化为它们各自的包装对象。见本文第6节。
null和undefined属于例外,当将它们用在期望是一个对象的地方都会造成一个类型错误(TypeError)异常。而不会执行正常的转换。
对象到原始值的转换多少有些复杂,本小节第三小节有专门描述。
i.转换和相等性
由于javascript可以做灵活的类型转换,因此其“==”相等运算符也随相等的含义灵活多变。例如:如下这些比较结果均是true;
null == undefined //这两值被认为相等
"0" == 0 //在比较之前,字符串转换成数字。
0 = false //在这之前布尔值转换成数字。
"0" ==false //在比较之前字符串和布尔值都转换成数字
在第四章9节第一小节相信讲解了“==”等于运算符在判断两个值是否相等时做了那些类型转换,并同样介绍了“===”恒等运算符在判断相等时并未做任何的类型转换。
需要特别注意的是:一个值转换为另一个值并不意味着两个值相等。比如在期望使用布尔值的地方使用了undefined,将会转换为false,但这不表明undefined==false。javascript运算符和语句期望使用多样化的数据类型,并可以互相转换。if语句将undefined转化为false,但“==”运算符从不试图将其转化为布尔值。
ii.显式类型转化
尽管javascript可以做做很多类型转换,但有时仍需要做显式转换,或者为了使代码变得清晰易读而做显式转换。
做显式转换最重简单的方法就是使用Boolean()、Number()、String()或Object函数。我们在本文第6节已经介绍过了. 当不通过new运算符调运这些函数时,他们会作为类型转换函数并按照上边表格所描述的规则做类型转换。
코드 사본은 다음과 같습니다.
Number("3") //=>3
String(false) //=>"false"或使用false.toString()
Boolean([]) //=>true
Object(3) // =>new Number(3)
需要注意的是,除了null或undefined之外的任何值都具有toString()方法,在这个方法的执行结果通常和String()方法返回的结果一致。同样需要注意的话,如果试图把null或undefined转化为对象。则会抛出一个类型错误typeerro。Object()函数在这种情况下不会抛出异常:它仅简单返回一个新创建的空对象。
javascript中的某些运算符会做隐式的类型转换,有时用于类型转换。如果“+”运算符的一个操作数是字符串,它将会把令一个操作数转换为字符串。一元“+”运算符将其操作数转换为数字。同样,一元“!”运算符将其操作数转换为布尔值取反,在代码中常会看到这种类型转换的惯用法。
코드 사본은 다음과 같습니다.
x + "" // 等于字符串String(x)
+x //等价于Number(x),也可以写成x-0
!!x //等价于Boolean(x)
在计算机中数字的解析和格式化代码是非常普通的工作。javascript中提供了专门的函数和方法用来更加精确的数字到字符串(number-to-string)和字符串到数字(string-to-number)的抓换。
Nmuber类定义的toString()方法可以接收表示基数(二进制,八进制,十六进制等)的可选参数,如果不指定该参数,转化规则将是十进制。同样也可以将数字转换为其它进制数。(范围在2-36之间)
코드 사본은 다음과 같습니다.
var n = 17;
b_string = n.toString(2); //转化为10001
o_string = "0" + n.toString(8); //转化为八进制021
hex_string = "0x" + n.toString(16); //转化为16进制0x11
javascript为控制输出中小数点位置和有效数字位数,或者决定是否需要指定指数计数法。Number类为这种数字到字符串定义了三个方法。
toFixed()根据小数点后指定位数,将数字转换为字符串,它从不使用指数计数法。toExponential()使用指数计数法,将数字转换为指数形式的字符串,其中小数点前只有一位,小数点后的位置则由参数指定(也就是说有效数字位数要比指定的位数多一位)。toPrecision()根据指定的有效数字位数,将数字转换为字符串。如果有效数字的位数小于数字整数部分的位数,则转换成指数形式。我们注意到,三个方法都会适当的进行四舍五入或填充0,
코드 사본은 다음과 같습니다.
var n = 123456.789;
n.toFixed(0); //"123457"
n.toFixed(2); //"123456.79"
n.toFixed(5); //"123456.78900"
n.toExponential(1); //"1.2e+5"
n.toExponential(3); //"1.235e+5"
n.toPrecision(4); // "1.235e+5"
n.toPrecision(7); //"123456.8"
n.toPrecision(10); //"123456.7890"
如果通过Number()转换函数传入一个字符串,它会试图将其转化为一个整数或浮点数直接量,这个方法只能基于十进制进行转换,并且不能出现非法的尾随字符。parseInt()和parseFloat()函数(它们是全局函数,不属于人和类的方法),更加灵活。parseInt()只解析整数。而parseFloat()则可以解析整数和浮点数。如果字符串前边是0x或0X,parseInt()将其解析为16进制数。两个方法都会跳过任意量的前导空格,尽可能解析更多数值字符。并忽略后边的内容。如果第一个是非法的数字直接量,则返回NaN
코드 사본은 다음과 같습니다.
parseInt("3many nice") //=>3;
parseFloat("3.14meters") //=>3.14
parseInt("-12.34") //=>-12
parseInt("0xff") //=>255
parseInt("-0XFF") //=>-255
parseFloat(".1") // =>0.1
parseInt("0.1") //=> 0
parseInt(".1") //=>NaN 不能以.开始
parseInt("$112") //=>NaN 不能以$开头
parseInt()可以接收第二个可选参数。这个参数指定数字转换的基数。合法的取值范围是2-36
코드 사본은 다음과 같습니다.
parseInt("11", 2) //=>3(1*2+1)
parseInt("ff", 16) //=> 255(15*16 +15)
parseInt("zz", 36) //=>1295(35*36+35)
parseInt("077", 8) // 63(7*8 +7)
parseInt("077", 10) //77(7*10+7)
iii.对象转化为原始值。
对象到布尔值的转换非常简单:所有的对象(包括数组和函数)都转换为true。对于包装对象亦是如此,new Boolean(false)是一个对象而不是原始值,它将转换为true。 对象到字符串(object-to-String)和对象到数字(object-to-number)的转换是通过调用带转换对象的一个方法来完成的。一个麻烦的事实是,javascript对象有两个不同的方法来执行转换,并且接下来要讨论并且接下来要讨论的场景更加复杂。值得注意的是,这里提到的字符串和数字的转换规则只适用于本地对象(native fangf object).宿主对象(例如:由web浏览器定义的对象),根据各自的算法可以转换成字符串和数字。
所有的对象继承了两个转换方法。第一个是toString(), 它的作用是返回一个反映这个对象的字符串。默认的toString()方法并不会返回一个有趣的值。
({x:1,y:2}).toString() //=>"[object object]"
很多类定义了更多特定版本的toString()方法.
例如:数组类(Array class)的toString()方法将每个数组元素转换为一个字符串,并在元素之间添加逗号后并合成结果字符串。
函数类(Function class)的toString()方法返回这个函数的实现定义的表示方式。实际上,这里的实现方式是通常是将用户定义函数转换为javascript源代码字符串。
日期类(Date class)定义toString()方法返回一个可读的(可被javascript-parsable解析的)日期和事件字符串
RegExp class定义的toString()方法将RegExp对象转换为正则表达式直接量字符串。
코드 사본은 다음과 같습니다.
[1, 2, 3].toString(); //=> "1,2,3"
(function(x) {f(x);}).toString(); // =>"function(x){/nf(x); /n}"
//d+/g.toString(); //=> ///d+/g
new Date(2015, 0, 1).toString() //=>Thu Jan 01 2015 00:00:00 GMT+0800 (中国标准时间)
另外一个函数是valueOf(),这个方法的任务并未详细定义:如果存在任意原始值,它就默认将对象转换为表示它的原始值。对象是复合值,而且大多数对象无法真正表示一个原始值,数组、函数和正则表达式简单地继承了这个默认方法,调用这些类型的实例的的valueOf()方法简单地返回对象本身。日期类定义的valueOf()方法返回它的一个内部表示:1970年1月1日以来的毫秒数。
코드 사본은 다음과 같습니다.
var d = new Date(2015, 0, 1); //=>Thu Jan 01 2015 00:00:00 GMT+0800 (中国标准时间)
d.valueOf() //=>1420041600000
通过是用我们刚才讲解过的toString()和valueOf()方法,就可以做到对象到字符串和对象到数字的转换了。但在某些场景中,javascript执行了完全不同的对象到原始值的转换。这些特殊的场景在本节的最后会讲到。
javascript对象到字符串的转换经过了如下这些步奏
如果对象具有toString()方法,则调用这个方法。如果它返回一个原始值,javascript将这个值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果。
如果对象没toString()方法,或者这个方法并不返回一个原始值,那么javascript会调用valueOf()方法。如果存在这个方法,则javascript调用它。如果返回值是原始值,javascript将责怪值转换为字符串。
9.变量声明。
在javascript程序中,使用一个变量之前应该先声明,变量是通过var来声明的,如下所示:
var i;
var sum;
也可以通过一个var关键字声明多个变量
var i,sun;
而且还可以将变量的初始值和变量声明和写在一起;
var message = "hello";
var i=0 ,j=0,k=0;
如果在var声明语句中给变量指定初始值,那么虽然声明了这个变量,但在给它存入一个值前,它的初始值是undefined. 我们注意到,在for和fo/in循环中同样可以使用var语句,这样可以更加简洁地声明在循环体语法中内使用的循环变量。例如:
코드 사본은 다음과 같습니다.
for (var i = 0; i < 10; i++) log(i);
for (var i = 0, j = 10; i < 10, j = 100; i++, j--) console.log(i * j)
for (var p in o) console.log(p);
如果在var声明语句中给变量指定初始值,那么虽然声明了这个变量,但在给它存入一个值前,它的初始值是undefined. 我们注意到,在for和fo/in循环中同样可以使用var语句,这样可以更加简洁地声明在循环体语法中内使用的循环变量。例如:
코드 사본은 다음과 같습니다.
var i=10;
i="ten";
10.变量作用域
一个变量的左右域(scope)是程序源代码中定义这个变量的区域,全局变量拥有全局作用域,在javascript代码中的任何地方都是定义。然而在函数内部声明变量只在函数体内有定义。他们是局部变量,作用是局部性的。函数参数也是局部变量,它们只在函数体内有定义。
在函数体内,局部变量的优先级高于同名的全局变量。如果在函数内声明一个局部变量或者函数参数中带有的变量和全局变量重名,那么全局变量就被局部变量所遮盖。
코드 사본은 다음과 같습니다.
var scope = "global"; //声明一个全局变量
function checkscope() {
var scope = "local"; //声明一个同名的局部变量
return scope;
}
checkscope(); //=>"local"
尽管在全局作用域编写代码时可以不写var语句,但声明局部变量时则必须使用var语句。
코드 사본은 다음과 같습니다.
scope = "global"; //声明一个全局变量,甚至不使用var来声明
function checkscope2() {
scope = "local"; //修改了全局变量
myscope = "local"; //这里显示式得声明了一个新的全局变量
return [scope, myscope]; //
}
checkscope2(); //=> ["local","local"]:产生了副作用
scope // =>"local"全局变量修改了
myscope //=> "local"全局命名空间搞乱了。
函数定义是可以嵌套的。由于每个函数都有它直接的作用域,因此会出现几个局部作用域嵌套的情况。
코드 사본은 다음과 같습니다.
var scope = "global scope"; //全局变量
function checkscope() {
var scope = "local scope"; //局部变量
function nested() {
var scope = "sested scope"; //嵌套作用域内的局部变量
return scope;
}
return nested();
}
checkscope() //=>"嵌套作用域" sested scope
i.函数作用域和声明提前
在一些类似c语言的编程语言中,花括号内的每一段代码都具有各自的左右域,而且变量在声明他们的代码之外是不可见的我们称之为块级作用域(block scope),而javascript中没有块级作用域,javascript取而代之的使用了函数作用域(function scope);变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有意义的。
如下代码,在不同的位置定义了ijk,他们都在同一个作用域内,这三个变量在函数体内均有定义的。
코드 사본은 다음과 같습니다.
function test(o) {
var i = 0; //i在整个函数体内均是定义的
if (typeif o == "object") {
var j = 0; //j在函数体内是有定义的,不仅仅是在这个代码段内
for (var k = 0; k < 10; k++) { //k在函数体内是有定义的,不仅仅是在循环内
console.log(k); //输出数字0-9
}
console.log(k); //k已经定义,输出10
}
console.log(j); //j已经定义了,但可能没有初始化。
}
javascript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。有意思的是,这意味这变量在声明之前甚至已经可用。javascript的这个特性被非正式的称为声明提前(hoisting),即javascript函数里声明的所有变量(但不涉及赋值)都被提前至函数整体的顶部。如下代码:
코드 사본은 다음과 같습니다.
var scope = "global";
function f() {
console.log(scope); //输出"undefined",而不是"global"
var scope = "local"; //变量在这里赋初始值,但变量本身在函数体内任何地方都是有定义的
console.log(scope); //输出"local"
你可能误以为函数的第一行会输出"global",因为代码还没有执行到var语句声明局部变量的地方。其实不然,由于函数作用域的特性模具部变量在整个函数体内始终有定义的,也就是说,在函数体内局部变量覆盖了同名全局变量。尽管如此,只有在程序执行到var语句的时候,局部变量才能正真的被赋值。
因此,上述的过程等价于:将函数内的变量声明"提前"至函数顶部,同时变量初始化留在原来的位置:
코드 사본은 다음과 같습니다.
function f() {
var scope; //在函数的顶部声明了局部变量
console.log(scope); //变量存在,但其值是"undefined"
scope = "local"; //在这里将其初始化,并赋值
console.log(scope); //这里它具有了我们所期望的值
}
在具有块级作用域的编程语言中,在狭小的作用域里让变量声明和使用变量的代码尽可能靠近彼此,通常来说,这是一个非常不错的编程习惯。由于在javascript中没有块级作用域,因此一些程序员特意将变量声明放在函数体顶部,而不是将声明放在靠近使用变量之处。这种做法使得他们的源代码非常清晰地反映了真实的变量作用域。
ii作为属性的变量
当声明一个javascript全局变量时面试及上是定义了全局对象的一个属性。见本文第三节。
当使用var声明一个变量时,创建的这个属性是不可配置的。见第六章第7节。也就是说这个变量无法通过delete运算符删除。可能你已经注意到了,如果你没有使用严格模式并给一个未声明的变量赋值的话。javascript会自动创建一个全局变量。以这种方式创建变量是全局对象正常的可配置属性。可以删除它们。
코드 사본은 다음과 같습니다.
var truevar = 1; //声明一耳光不可删除的全局变量
fakevar = 2; //创建全局对象的一个可删除的属性
this.fakevar2 = 3; //同上
delete truevar // =>false 变量并没有删除
delete fakevar //=>true 变量被删除
delete this.fakevar2 //=>true 变量被删除
javascript全局变量是全局对象的属性,这是在ECMAScript规范中强制规定的。对于局部变量则没有此规定,但我们可以想象得到,局部变量当做跟函数调用相关的某个对象的属性。ECMAScript3规范称对象为“调用对象”(call object),ECMAScript5规定范称为“声明上下文对象”(declarative environment record)。javascript可以允许使用this关键字引用全局对象,却没有方法可以引用局部变量中存放的对象。这种存放局部变量的对象的特有性质,是一种对我们不可见的内部实现。然而,这些局部变量对象存在的观念是非常重要的。
iii作用域链
javascript是基于词法作用域的语言:通过阅读包含变量定义在内的舒航源码就能知道变量的作用域。
全局变量在程序中始终是都是有定义的。局部变量在声明它的函数体内以及其所嵌套的函数内始终是有定义的。