이 글은 JavaScript 변수에 포함된 두 가지 다른 데이터 유형, 즉 기본 유형 값과 참조 유형 값의 차이점에 중점을 둡니다. 추가적으로 ECMAScript와 JavaScript의 관계에 대해서도 간략하게 다루었습니다.
제목이 JavaScript 변수인데, 좀 더 구체적으로 말하면 ECMAScript 변수여야 합니다.
1990년대 넷스케이프와 마이크로소프트는 두 가지 버전의 자바스크립트를 출시했는데, 이는 자바스크립트의 개발과 활용에 도움이 되지 않아 유럽컴퓨터제조협회(ECMA, The European Computer)를 촉발시켰다. 제조업체 협회는 JavaScript 표준화 작업을 시작하여 ECMAScript라는 새로운 스크립팅 언어를 정의하는 표준인 유명한 ECMA-262를 완성했습니다.
완전한 JavaScript 구현에는 ECMAScript, 문서 개체 모델(DOM, 문서 개체 모델) 및 브라우저 개체 모델(BOM, 브라우저 개체 모델)이 포함됩니다. JavaScript의 핵심이자 구현의 기초인 ECMAScript는 ECMA-262 표준에 지정된 구문, 유형, 명령문, 키워드, 예약어, 연산자 및 객체 측면에서 언어에 대한 설명입니다.
ECMA-262 표준에 명시된 ECMAScript 변수는 느슨한 타입으로 어떠한 형태의 데이터라도 저장할 수 있어 다양한 형태의 변수를 초기화하는 연산을 배치할 수 있다. 하나의 명령문에서 다음 코드를 실행하는 것이 적법합니다.
var message = "hello", //string age = 20, //number3 found = false; //boolean
var 연산자로 정의된 변수는 해당 변수가 정의된 범위 내에서 지역 변수가 되며, 해당 변수는 범위를 벗어나는 즉시 소멸됩니다. 예를 들어, 함수 내에서 변수를 정의하는 경우 함수가 호출될 때 변수가 생성되지만 함수가 종료된 후에는 더 이상 변수에 액세스할 수 없습니다.
ECMAScript에는 6개의 데이터 유형이 있습니다(6개만 ECMAScript는 사용자 정의 유형을 생성하는 메커니즘을 지원하지 않습니다).
기본 데이터 유형에는 underfined, null, boolean, number, string의 5가지 유형이 포함됩니다. 이 5가지 기본 데이터 유형은 값으로 액세스되며 해당 값은 기본 데이터에 속합니다. 글의 시작 부분에서 언급한 유형. 유형 값은 변수에 저장된 실제 값을 조작할 수 있는 간단한 데이터 세그먼트입니다.
여섯 번째 유형은 복합 데이터 유형인 객체로, 기본적으로 순서가 지정되지 않은 이름-값 쌍의 집합으로 구성되며 메모리에 저장됩니다. . JavaScript는 객체의 메모리 공간을 직접 조작하는 것을 허용하지 않습니다. 객체를 작동할 때 실제로는 실제 객체가 아닌 객체에 대한 참조를 작동하게 됩니다.
변수를 정의할 때 어떤 데이터형인지 지정할 필요는 없지만, 기본형과 참조형의 값에 대해 수행할 수 있는 연산은 다음과 같다. 여전히 매우 다릅니다.
속성 추가
참조 유형 값의 경우 속성 및 메소드를 추가할 수 있습니다. 다음 코드와 같이 추가, 변경 및 삭제합니다.
var obj = new object(); //创建对象并保存在obj中 obj.name = "Marry"; //添加名为name的属性,赋予字符串值“Marry” alert(obj.name); //弹出"Marry"
obj 객체가 파괴되지 않거나 name 속성이 삭제되지 않으면 이 속성은 항상 존재합니다.
기본 유형 값을 다시 살펴보세요.
var name = "Marry"; //创建字符串 name.age = 20; //添加名为age的属性,赋予number值20 alert(name.age); //弹出"underfined"
name 문자열에 age 속성이 추가되고 값 20이 할당되지만 다음에 액세스할 때 이 속성은 사라집니다.
이는 속성이 참조 유형 값에만 동적으로 추가될 수 있음을 보여줍니다.
변수 값 복사
변수에서 a의 기본 유형 값을 변수 b에 복사하면 변수 b 객체에 새 값이 생성되고 해당 값이 변수 a에 복사됩니다. 할당된 위치를 독립적으로 저장합니다. 이 두 변수를 포함하는 모든 작업은 서로 영향을 미치지 않습니다.
若从变量c向变量d复制引用类型的值,同样会将存储在变量d对象中的值复制一份放到为变量c分配的空间中,但这个值的副本实际是一个指针,与变量d指向堆内存中的同一个对象。两个变量实际引用同一个对象,改变其中一个变量,将影响另一个变量。
具体区别见如下例子:
//基本类型值 var num1 = 5;var num2 = num1; num2 = num2 + 5; alert(num1); //5alert(num2); //10/ /引用类型值 var obj1 = new object();var obj2 = obj1; obj1.name = "Marry"; alert(obj2.name); //"Marry"
函数传参
ECMAScript中所有函数的参数都是按值传递的,即将函数外部的值复制给函数内部的参数。鉴于基本类型值与引用类型值复制变量的不同,其函数传参的效果也不同。
在向参数传递基本类型值时,被传递的参数被赋给一个局部变量,函数内部参数的变化不影响函数外部的变量;向参数传递引用类型值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化将会反映在函数的外部。如下列例子:
//传递基本类型值function addnum(num) { num += 10; return num; }var num1 = 5;var num2 = addnum(num1); alert(num1); //5,无变化alert(num2); //15//传递引用类型值 function setage(obj) { obj.age = 20; }var obj1 = new object(); setage(obj1) alert(obj1.age); //20
在局部作用域中修改的对象反映在全局作用域中,很多人会以为这是按引用传递。但函数对象确实都是按值传递,见下列例子:
function setage(obj) { obj.age = 20; obj = new object(); obj.age = 30; }var obj1 = new object(); setage(obj1) alert(obj1.age); //20
此例中在函数内部为obj重新定义了一个对象,且为其age属性重新赋值,但这一变化并未反映在函数外部,说明obj1 并不是按引用传递的。实际函数内重新定义的对象为局部对象,在退出函数后就会被立即销毁。
检测类型
基本类型值可以通过typeof检测,但typeof检测引用类型时只能返回object。所以为了知道某个值是什么类型的对象,ECMAScript提供了instanceof操作符,语法如下:
result = variable instanceof constructor
如果变量是引用类型的实例,instanceof操作符就会返回true。
위 내용은 JavaScript 변수 관련 문제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!