>  기사  >  웹 프론트엔드  >  js의 기본 유형 및 참조 유형

js의 기본 유형 및 참조 유형

不言
不言원래의
2018-04-10 14:10:101144검색

이 글에서 공유한 내용은 js의 기본 유형과 참조 유형에 관한 것입니다. 특정 참조 값이 있습니다. 필요한 친구가 참조할 수 있습니다.


js의 기본 유형 및 참조 유형


https://blog.csdn.net/shuidinaozhongyan/article/details/72520842에서 재인쇄됨

기본 유형: 숫자, 문자열, 부울, Null, 정의되지 않음.

참조 유형: Object, Array, Date, RegExp, Function

null과 정의되지 않음의 차이.

참조: http://www.ruanyifeng.com/blog/2014/03/undefine-vs-null.html

1. 유사성

1. 솔직히 거의 차이가 없습니다.

var a=null;  
var b=undefined;

2. 정의되지 않음과 null은 if 문에서 자동으로 false로 변환되며, 동등 연산자는 둘이 동일하다고 직접 보고합니다.

if (!undefined) 
    console.log('undefined is false');// undefined is falseif (!null) 
    console.log(&#39;null is false&#39;);// null is falseundefined == null// true<span style="font-family:Georgia, serif;color:#111111;"><span style="font-size:16px;letter-spacing:-.12px;word-spacing:2.4px;background-color:rgb(245,245,213);"><strong>
</strong></span></span>

위 코드는 둘의 행동이 얼마나 유사한지 보여줍니다!

undefine과 null의 의미와 사용법이 비슷한데 왜 두 개의 값을 동시에 설정해야 할까요? 이렇게 하면 이유 없이 JavaScript의 복잡성이 증가하고 초보자에게 문제가 되지 않나요? Google이 개발한 JavaScript 언어를 대체하는 Dart 언어는 null만 있고 정의되지 않은 것은 없음을 명확하게 규정합니다!

2.

최근 신간 "자바스크립트를 말하다"를 읽다가 우연히 이 질문에 대한 답을 발견했습니다!

알고 보니 이는 JavaScript의 역사와 관련이 있습니다. 1995년 자바스크립트가 탄생할 당시에는 처음에는 자바와 마찬가지로 "nothing"을 나타내는 값으로 null만 설정되었습니다.

C 언어의 전통에 따르면 null은 자동으로 0으로 변환되도록 설계되었습니다.

Number(null)// 05 + null// 5

그러나 JavaScript 디자이너인 Brendan Eich는 두 가지 이유로 이것만으로는 충분하지 않다고 생각합니다.

우선 null은 Java와 마찬가지로 객체로 취급됩니다. 그러나 JavaScript 데이터 유형은 기본 유형(primitive)과 복합 유형(complex)의 두 가지 범주로 나뉩니다. Brendan Eich는 "없음"을 나타내는 값이 객체가 아닌 것이 가장 좋다고 생각합니다.

두 번째로, JavaScript의 초기 버전에는 오류 처리 메커니즘이 포함되어 있지 않았습니다. 데이터 유형 불일치가 발생하면 유형이 자동으로 변환되거나 자동으로 실패하는 경우가 많습니다. Brendan Eich는 null이 자동으로 0으로 변환되면 오류를 찾기가 어려울 것이라고 생각합니다.

그래서 Brendan Eich는 또 다른 undefine을 디자인했습니다.

3. 초기 디자인 JavaScript의 초기 버전은 다음과 같이 구별됩니다. null은 "없음"을 나타내는 개체이며 숫자 값으로 변환되면 0이 됩니다. NaN으로 변환됩니다.

Number(undefined)// NaN5 + undefined// NaN

4. 현재 사용법 그러나 위의 구분은 실제로 실행 불가능하다는 것이 곧 입증되었습니다. 현재 null과 정의되지 않음은 기본적으로 동의어이며 약간의 차이점만 있습니다.

null은 "개체 없음"을 의미합니다. 즉, 거기에 값이 없어야 합니다. 일반적인 사용법은 다음과 같습니다.

(1) 함수의 매개변수로, 함수의 매개변수가 객체가 아님을 나타냅니다.

(2)는 객체 프로토타입 체인의 끝점 역할을 합니다.

Object.getPrototypeOf(Object.prototype)

// null

undefound는 "누락된 값"을 의미합니다. 즉, 여기에 값이 있어야 하지만 아직 정의되지 않았음을 의미합니다. 일반적인 사용법은 다음과 같습니다.

(1) 변수가 선언되었지만 값이 할당되지 않은 경우 정의되지 않은 것과 같습니다.

(2) 함수 호출시 제공해야 할 매개변수가 제공되지 않았으며, 매개변수가 정의되지 않음과 동일합니다.

(3) 개체에 할당된 속성이 없으며 이 속성의 값이 정의되지 않습니다.

(4) 함수가 값을 반환하지 않으면 기본적으로 정의되지 않은 값을 반환합니다.

var i;
i // undefinedfunction f(x){console.log(x)}
f() // undefinedvar  o = new Object();
o.p // undefinedvar x = f();
x // undefined

객체는 참조 유형인가요?

 Object是一个基础类型,其他所有类型都从Object继承了基本行为。比如原型链中它的原型为null。
참조형과 기본형의 차이점은 무엇인가요? 어느 것이 힙에 있고 어느 것이 스택에 있습니까?

1. 기본형 변수는 스택 영역에 저장됩니다. (스택 영역은 메모리에 있는 스택 메모리를 말합니다.)

그러면 저장 구조는 다음과 같습니다.

js의 기본 유형 및 참조 유형

스택 영역에는 변수 식별자가 포함됩니다. 및 변수의 값.

2.

Javascript는 다른 언어와 다르게 메모리 위치에 직접 접근하는 것을 허용하지 않습니다. 즉, 객체의 메모리 공간을 직접 조작할 수 없다는 뜻입니다. 실제로 이는 운영 개체에 대한 참조이므로

참조 유형의 값은 참조로 액세스됩니다.
정확히 말하면 참조 유형을 저장하려면 메모리의 스택 영역과 힙 영역이 필요합니다(힙 영역은 메모리 내의 힙 메모리를 나타냄). 스택 영역 메모리는 변수 식별자와 객체에 대한 포인터를 저장합니다.
또한 힙 메모리에 있는 객체의 주소라고 할 수 있습니다.
다음과 같은 개체가 있다고 가정합니다.

var person1 = {name:&#39;jozo&#39;};var person2 = {name:&#39;xiaom&#39;};var person3 = {name:&#39;xiaoq&#39;};

그러면 이 세 개체의 메모리 저장 상황은 다음과 같습니다.

js의 기본 유형 및 참조 유형

js의 기본 유형 및 참조 유형

Reprinted from https://blog.csdn .net /shuidinaozhongyan/article/details/72520842

기본 유형: 숫자, 문자열, 부울, Null, 정의되지 않음.

참조 유형: Object, Array, Date, RegExp, Function

null과 정의되지 않음의 차이.

참조: http://www.ruanyifeng.com/blog/2014/03/undefine-vs-null.html

1. 유사성

1.在JavaScript中,将一个变量赋值为undefined或null,老实说,几乎没区别。

var a=null;  
var b=undefined;

2.undefined和null在if语句中,都会被自动转为false,相等运算符甚至直接报告两者相等。

if (!undefined) 
    console.log(&#39;undefined is false&#39;);// undefined is falseif (!null) 
    console.log(&#39;null is false&#39;);// null is falseundefined == null// true<span style="font-family:Georgia, serif;color:#111111;"><span style="font-size:16px;letter-spacing:-.12px;word-spacing:2.4px;background-color:rgb(245,245,213);"><strong>
</strong></span></span>

上面代码说明,两者的行为是何等相似!

既然undefined和null的含义与用法都差不多,为什么要同时设置两个这样的值,这不是无端增加JavaScript的复杂度,令初学者困扰吗?Google公司开发的JavaScript语言的替代品Dart语言,就明确规定只有null,没有undefined!

二、

最近,我在读新书《Speaking JavaScript》时,意外发现了这个问题的答案!

原来,这与JavaScript的历史有关。1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示”无”的值。

根据C语言的传统,null被设计成可以自动转为0。

Number(null)// 05 + null// 5

但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。

首先,null像在Java里一样,被当成一个对象。但是,JavaScript的数据类型分成原始类型(primitive)和合成类型(complex)两大类,Brendan Eich觉得表示”无”的值最好不是对象。

其次,JavaScript的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或者默默地失败。Brendan Eich觉得,如果null自动转为0,很不容易发现错误。

因此,Brendan Eich又设计了一个undefined。

三、最初设计
JavaScript的最初版本是这样区分的:null是一个表示”无”的对象,转为数值时为0;undefined是一个表示”无”的原始值,转为数值时为NaN。

Number(undefined)// NaN5 + undefined// NaN

四、目前的用法
但是,上面这样的区分,在实践中很快就被证明不可行。目前,null和undefined基本是同义的,只有一些细微的差别。

null表示”没有对象”,即该处不应该有值。典型用法是:

(1) 作为函数的参数,表示该函数的参数不是对象。

(2) 作为对象原型链的终点。

Object.getPrototypeOf(Object.prototype)
// null

undefined表示”缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:

(1)变量被声明了,但没有赋值时,就等于undefined。

(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。

(3)对象没有赋值的属性,该属性的值为undefined。

(4)函数没有返回值时,默认返回undefined。

var i;
i // undefinedfunction f(x){console.log(x)}
f() // undefinedvar  o = new Object();
o.p // undefinedvar x = f();
x // undefined

Object是引用类型嘛?

 Object是一个基础类型,其他所有类型都从Object继承了基本行为。比如原型链中它的原型为null。

引用类型和基本类型有什么区别?哪个是存在堆哪一个是存在栈上面的?

1.基本类型的变量是存放在栈区的(栈区指内存里的栈内存)

那么它的存储结构如下图:

js의 기본 유형 및 참조 유형

栈区包括了 变量的标识符和变量的值。

2.

javascript和其他语言不同,其不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间,那我们操作啥呢? 实际上,是操作对象的引用,
所以引用类型的值是按引用访问的。
准确地说,引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,
也可以说是该对象在堆内存的地址。
假如有以下几个对象:

var person1 = {name:&#39;jozo&#39;};var person2 = {name:&#39;xiaom&#39;};var person3 = {name:&#39;xiaoq&#39;};

则这三个对象的在内存中保存的情况如下图:

js의 기본 유형 및 참조 유형

相关推荐:

JS引用类型的介绍

위 내용은 js의 기본 유형 및 참조 유형의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:Threejs로 빠른 시작다음 기사:Threejs로 빠른 시작