>웹 프론트엔드 >JS 튜토리얼 >JavaScript 변수 관련 문제에 대한 자세한 설명

JavaScript 변수 관련 문제에 대한 자세한 설명

迷茫
迷茫원래의
2017-03-26 17:02:291423검색

이 글은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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