JS의 기본 유형에 대한 더 깊은 이해
JavaScript의 기본 유형에는 정의되지 않음, Null, 숫자, 부울 및 문자열이 포함됩니다. 다른 변수는 참조 유형, 즉 개체 유형입니다. 기본 유형은 "스택 메모리"에 저장되고 참조 유형은 "힙 메모리"에 저장되지만 일반적으로 JavaScript에서 변수를 사용할 때 메모리에서 변수의 위치는 크게 고려되지 않습니다.
"typeof" 연산자는 변수 값의 데이터 유형을 얻는 데 사용됩니다. typeof는 변수 이름이나 리터럴 값을 피연산자로 허용하고 변수 유형 정보를 설명하는 문자열을 반환할 수 있습니다. typeof의 반환 값은 JavaScript의 유형과 일치하지 않습니다.
"undefine" - 변수 값이 정의되지 않았습니다.
"number" - 변수 값이 숫자 값입니다.
-
"boolean" ——변수 값은 부울 값입니다
"string" ——변수 값은 문자열입니다.
"object"——변수 값은 개체 또는 null입니다
" function"——Variable 값은 함수입니다
게다가 typeof는 함수가 아닌 (+, -)와 같은 연산자입니다. "typeof(12)"를 사용해도 오류가 발생하지는 않지만, 연산자 " typeof 12"가 이를 사용하는 적절한 방법입니다.
1, 정의되지 않음 및 null
ECMA-262 문서에서 정의되지 않은 유형의 정의는 다음과 같습니다.
정의되지 않은 유형에는 정의되지 않은 값이라는 정확히 하나의 값이 있습니다. 정의되지 않음.
정의되지 않은 유형에는 "정의되지 않음"이라는 고유 값이 하나만 있습니다. 변수의 값은 정의되지 않았으므로 변수가 초기화되지 않았음을 의미합니다. var로 선언되지 않은 변수의 경우 이를 사용하면 오류가 발생하지만 typeof 연산자를 사용하면 "정의되지 않음"이 반환됩니다.
var foo; alert(foo); // undefined alert(bar); // 错误 alert(typeof foo); // undefined alert(typeof bar); // undefined
undefine은 전역 변수로 구현됩니다(null과 같은 리터럴 값이 아님). 값은 "정의되지 않음"입니다. ECMAScript 3에서는 undefine에 다른 값을 할당할 수 있으며 ECMAScript 5에서는 읽기 전용으로 수정되었습니다.
Null 유형에는 "빈 값"을 나타내는 데 사용되는 하나의 값인 null만 있습니다. 대부분의 프로그래밍 언어에는 빈 값을 나타내는 데 사용되는 null, nil 등과 같은 리터럴이 있습니다. 그러나 다른 프로그래밍 언어와 달리 JavaScript는 초기화되지 않은 변수(undefine으로 표시)의 값을 표시하기 위해 null을 사용하지 않습니다.
null의 논리적 의미는 null 개체 포인터를 나타내는 것입니다. JavaScript의 일반적인 개체에는 간단한 데이터 유형이 포함되지 않으므로 논리적으로 null은 변수가 null 값(리터럴 "{}" 아님)이 있는 개체 유형을 가리킨다는 의미입니다.
이러한 이유로 null 값의 유형을 얻기 위해 typeof 연산자를 사용하면 "object"가 발생하는 이유를 이해할 수 있습니다. JavaScript에서 Object 유형의 null 값 의미는 Number 유형의 경우 0, String 유형의 경우 ""와 유사합니다.
정의되지 않음과 null은 모두 "널 값"을 설명하는 데 사용되지만 논리적인 의미에서 정의되지 않음은 null보다 "낮은 수준"입니다. 일반적인 상황에서는 변수 값을 정의되지 않음으로 명시적으로 지정할 필요가 없습니다.
객체를 저장하려고 하지만 실제로 객체를 가리키지 않는 변수의 경우 변수 값을 null로 설정하여 null 객체 포인터로서의 null 역할을 반영하고 정의되지 않음과 구별해야 합니다.
2. 숫자 값
ECMAScript는 단순화된 숫자 모델을 사용합니다. 별도의 정수형을 분리하지 않고 숫자형인 Number 하나만 가지고 있습니다. 구현 측면에서 Number 유형은 IEEE 754 표준에서 정의한 64비트 배정밀도 부동 소수점 숫자 형식을 채택합니다.
64비트 부동 소수점 형식에서 52비트는 가수를 나타내고, 11비트는 지수를 나타내고, 1비트는 부호를 나타냅니다. 따라서 정수를 표현할 때 자바스크립트가 표현할 수 있는 정수의 범위는 -Math.pow(2,53)부터 Math.pow(2,53)까지입니다. 이 범위를 벗어나면 낮은 자리 숫자의 정확성을 보장할 수 없습니다.
var n = Math.pow(2,53); // 9007199254740992 alert(n === n + 1); // true, 9007199254740992 + 1得到的值还是9007199254740992
실제 웹 개발에서 백그라운드(예: Java)에서 처리하기 위해 Long Int 유형을 Javascript에 전달해야 하는 경우 JavaScript가 JSON 데이터를 Number 유형으로 구문 분석한 후 얻은 결과는 다음과 같을 가능성이 높습니다. 원하는 것이 아닙니다. 마지막 몇 자리 숫자가 변경되었습니다.
JavaScript는 연산에 부동 소수점 값을 사용하므로 부동 소수점 숫자를 표현하기 위해 IEEE 754 표준 형식을 사용하는 다른 모든 프로그래밍 언어와 마찬가지로 소수 부분에 정밀도 문제가 있습니다. 코드의 소수 부분에 대한 동등 판단을 피하세요. (정수 부분은 정확합니다.)
var a = 0.1; var b = 0.2; alert(a + b === 0.3); // false
값이 JavaScript가 나타낼 수 있는 숫자의 상한을 초과하는 경우(오버플로), 무한대를 나타내는 Infinity(또는 -Infinity, 음의 무한대) 값으로 자동 변환됩니다. 값은 무한히 0에 가깝고 JavaScript 표현 범위(언더플로)를 초과하는 경우 0(또는 -0, 0과 동일)으로 설정됩니다. JavaScript는 오버플로 오류(0으로 나누는 경우 포함)를 발생시키지 않습니다.
var a = Number.MAX_VALUE * 2; //Infinity var b = Number.MIN_VALUE / 2; //0 var c = 1 / 0; //Infinity or NaN, 依JS执行环境不同 var d = 0 / 0; // NaN
Number 유형은 숫자가 아닌 특수 값 NaN을 정의합니다. NaN의 의미는 값을 얻어야 할 곳에서 값을 얻지 못한다는 의미입니다. NaN을 피연산자로 사용하는 모든 산술 연산의 결과는 NaN입니다.
另外NaN也是唯一一个使用对自身进行相等判断会得到false的数值。NaN的这个怪异之处破坏了JavaScript运算符的对称性。如果在代码中需要通过比较数值大小进行分支判断,就需要注意可能出现NaN的情况,因为使用NaN与其他数值进行大小比较总会得到false,而这可能不是你想要的结果。
var a = 10; a = a - "not number" // NaN alert(a === a); // false var b = 12 + a; // NaN var c = 10; alert(b >= c || b < c); // false
另一个Number类型中不常引人注目的地方是位运算。JavaScript中提供了按位操作运算符。在很多其他编程语言中,按位操作可以进行硬件级处理,所以非常快。
但是JavaScript没有整数类型,它的位操作是先把数值转换为32位整数,然后进行计算,然后再转换回去,JavaScript绝大部分运行环境是在浏览器中,与硬件相隔较远,因此位操作执行很慢。
3、字符串
与很多其他编程语言中一样,JavaScript中的字符串值也是不可变的,改变一个字符串变量的值,相当于重新生成了一个字符串并把它赋值给变量。JavaScript中的简单类型无法进行方法调用(作为this调用函数),但我们还是可以进行诸如
"abcdefg".toUpperCase();
这样的操作。这是因为JavaScript为简单数据类型提供了一种方式,把它们包装为对象类型,然后进行方法调用。”"abcdefg"“先被隐式地包装为对象,然后使用包装出的对象调用toUpperCase方法,待方法调用结束后,JavaScript再隐式地把包装对象回收。
其它简单数据类型也使用同样的方式。也可以使用JavaScript提供的构造函数显示地创建包装对象,JavaScript提供了String()、Number()和Boolean()三个构造函数,分别用于构建String、Number和Boolean类型的包装对象。
4、类型转换
ECMA-262中对数据类型的转换有详细的定义,很多JavaScript的参考资料也会列出类型转换的详细规则,这里就不再赘述了,下面只讨论一些值得注意的问题。
JavaScript有两组相等比较运算符:”===“和”!==“、”==“和”!=“。Crockford在著作《JavaScript:The Good Parts》里面列举的Bad Parts中的第一个就是”==“运算符。
原因在于”==“运算符会执行隐式的类型转换,而JavaScript中类型转换的规则又非常复杂,很容易导致代码中出现不易发现的bug。与”===“和其他编程语言中的”==“不同,JavaScript中的”==“运算符并不具备传递性: ∀x∀y∀z(x == y ∧ y == z → x == z)并不成立:
"" == "0"; // false "" == 0; // true "0" == 0; // true
Crockford和Zakas都建议不要使用“==”运算符,而使用“===”代替。若不遵循这个建议,使用“==”运算符时,请务必确保你明确知道两个比较变量的类型信息,以免发生预料之外的类型转换。
另外一个经常用到类型转换的地方是分支判断。if(和其它)语句并不要求进行分支判断的表达式结果必须为Boolean类型,而会根据特定的规则把判断表达式的结果转换为true或false后再进行判断。
if (obj !== undefined && obj !== null) { // code } // 上面的判断条件可以替换为 if (obj) { // code }
上面代码中的obj代表一个对象变量,若其值为undefined或null,则被转换为false,反之转换为true。这种方式并不完全安全,若使用的变量是简单数据类型,就需要注意一些特殊值的转换规则,否则代码可能不会按照预想的方式执行。
if (typeof num === "number" && num) { // if num is 0, get false //code }
上面代码的本意是获取一个有效的数值类型,屏蔽了其他类型和num的值为NaN的情况(NaN会转换false)。但代码中有一个纰漏,它忽略了num值为0的情况。
0值会被转换为false,从而导致下面的代码不会被执行,这可能与编码者的本意相违背。同样使用String类型作为分支条件,也要考虑""会被自动转换为false的情况。
与分支判断中的类型转换相似的情况,是采用短路方式为变量赋值。由于JavaScript中”&&“和”||“操作符的特性,我们经常采用短路方式为变量赋值。
”&&“操作符会返回表达式中第一个可以转换为false的操作数或最后一个操作数(全为true时);”||“操作符返回表达式中第一个可以转换为true的操作数或最后一个操作数(全为false时)。
var obj = obj1 || obj2 || {}; var attr = obj && pro && attr;
与分支判断一样,需要警惕表达式中可能出现的特殊值:0,"",null等。
JavaScript的类型模型,提供了极大的灵活性的同时也带来了很多陷阱,编码过程中需要小心地规避这些陷阱,因为代码审查很容易忽略它们,出现问题时,它们也往往很难被发现。
更多计算机编程相关知识,请访问:编程入门!!
위 내용은 JS의 기본 유형에 대한 더 깊은 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











WebSocket 및 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 소개: 지속적인 기술 개발로 음성 인식 기술은 인공 지능 분야의 중요한 부분이 되었습니다. WebSocket과 JavaScript를 기반으로 한 온라인 음성 인식 시스템은 낮은 대기 시간, 실시간, 크로스 플랫폼이라는 특징을 갖고 있으며 널리 사용되는 솔루션이 되었습니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법을 소개합니다.

WebSocket과 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 서론: 인터넷 기술의 급속한 발전과 함께 실시간 모니터링 시스템이 다양한 분야에서 널리 활용되고 있다. 실시간 모니터링을 구현하는 핵심 기술 중 하나는 WebSocket과 JavaScript의 조합입니다. 이 기사에서는 실시간 모니터링 시스템에서 WebSocket 및 JavaScript의 적용을 소개하고 코드 예제를 제공하며 구현 원칙을 자세히 설명합니다. 1. 웹소켓 기술

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 소개: 인터넷의 대중화와 기술의 발전으로 점점 더 많은 레스토랑에서 온라인 주문 서비스를 제공하기 시작했습니다. 실시간 온라인 주문 시스템을 구현하기 위해 JavaScript 및 WebSocket 기술을 사용할 수 있습니다. WebSocket은 TCP 프로토콜을 기반으로 하는 전이중 통신 프로토콜로 클라이언트와 서버 간의 실시간 양방향 통신을 실현할 수 있습니다. 실시간 온라인 주문 시스템에서는 사용자가 요리를 선택하고 주문을 하면

WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 오늘날의 디지털 시대에는 점점 더 많은 기업과 서비스에서 온라인 예약 기능을 제공해야 합니다. 효율적인 실시간 온라인 예약 시스템을 구현하는 것이 중요합니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. WebSocket이란 무엇입니까? WebSocket은 단일 TCP 연결의 전이중 방식입니다.

JavaScript 및 WebSocket: 효율적인 실시간 일기 예보 시스템 구축 소개: 오늘날 일기 예보의 정확성은 일상 생활과 의사 결정에 매우 중요합니다. 기술이 발전함에 따라 우리는 날씨 데이터를 실시간으로 획득함으로써 보다 정확하고 신뢰할 수 있는 일기예보를 제공할 수 있습니다. 이 기사에서는 JavaScript 및 WebSocket 기술을 사용하여 효율적인 실시간 일기 예보 시스템을 구축하는 방법을 알아봅니다. 이 문서에서는 특정 코드 예제를 통해 구현 프로세스를 보여줍니다. 우리

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

사용법: JavaScript에서 insertBefore() 메서드는 DOM 트리에 새 노드를 삽입하는 데 사용됩니다. 이 방법에는 삽입할 새 노드와 참조 노드(즉, 새 노드가 삽입될 노드)라는 두 가지 매개 변수가 필요합니다.

JavaScript에서 HTTP 상태 코드를 얻는 방법 소개: 프런트 엔드 개발에서 우리는 종종 백엔드 인터페이스와의 상호 작용을 처리해야 하며 HTTP 상태 코드는 매우 중요한 부분입니다. HTTP 상태 코드를 이해하고 얻는 것은 인터페이스에서 반환된 데이터를 더 잘 처리하는 데 도움이 됩니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. HTTP 상태 코드란 무엇입니까? HTTP 상태 코드는 브라우저가 서버에 요청을 시작할 때 서비스가
