JAVASCRIPT之数据类型

本文深入解析ECMAScript中数据类型的两大类别:基本类型与引用类型。详细阐述了它们的定义、特性及操作差异,包括复制变量值时的区别,并通过实例展示了参数传递过程中的行为表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据类型

在ECMAScript中变量可能包含两种不同类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。

基本数据类型:undefined, null, boolean, number 和 string。 这5种基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值。

引用类型的值是保存在内存中的对象。Javascript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。

 定义基本类型值和引用类型值的方式是类似的:创建一个变量并为该变量赋值。但是,当这个值保存到变量中以后, 对不同类型值可以执行的操作则大相径庭。

对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法。如下面例子:

var person = new Object();
person.name = "Nicholas";
console.log(person.name);   //Nicholas
delete(person.name);
console.log(person.name);   //undefined
person.getName = function() {
    alert("John");
}
person.getName();           //John
delete(person.getName);
person.getName();           //person.getName is not a function

但是不能给基本类型的值添加属性, 尽管这样做不会导致任何错误。比如:

var name = "Nicholas";
name.age = 29;
console.log(name.age);      //undefined

在复制变量值的时候,基本数据值和引用类型值也存在不同。

引用类型值复制变量值如下:

var obj1 = new Object();
obj1.name = "HaHa";
var obj2 = obj1;
console.log(obj1.name);     //HaHa
console.log(obj2.name);     //HaHa
obj2.name = "HeiHei";
console.log(obj1.name);     //HeiHei
console.log(obj2.name);     //HeiHei

可以观察到将obj1复制给obj2之后, 修改obj2中的name值,obj1中的name值也发生了改变; 原因是将obj1复制给obj2的时候,只是将obj1保存的对象的地址值复制给了obj2(浅拷贝), 所以此时obj1和obj2都指向了同一块内存区域,所以修改obj2的值会在obj1上体现。

基本类型值复制变量值如下:

var num1 = 5;
var num2 = num1;
console.log(num1);      //5
console.log(num2);      //5
num2 = 6;
console.log(num1);      //5
console.log(num2);      //6

可以观察到,改变num2的值并不会改变num1的值,原因是在将num1的值复制给num2的时候,是将num1的值拷贝了一份给num2,num2中此时保存的是num1的值得一个副本, 所以再次修改num2的值不会影响到num1的值。

在参数传递的过程中,基本数据值和引用数据值也有很大的差别,如下:

基本数据类型参数:

function addTen(num) {
    num += 10;
    return num;
}

var a = 5;
console.log(addTen(a));     //15
console.log(a);             //5

在上述例子中, 变量a的类型为number基本数据类型, 初始值为5; 调用addTen方法的时候, 将变量a赋值给参数num, 由于a是基本数据类型,所以这个时候是将a的值拷贝一份给参数num, 此时, num的值为5, 变量a的值仍然是5, 此时的变量a和num已没有什么关系; 执行 num+=10 时,num的值为15;执行完addTen方法之后,变量num销毁;因变量a和num已没有关系,所以变量a的值没有发生改变,依旧是5。

引用数据类型参数:

function addAttribute(obj) {
    obj.name = "Nicholas";
    return obj;
}

var person = {};

console.log(person.name);               //undefined
console.log(addAttribute(person).name); //Nicholas
console.log(person.name);               //Nicholas

在上述例子中,变量person的类型为Object引用类型,刚开始并没有给person对象定义name属性,所以引用person.name的时候返回undefined; 调用addAttribute方法的时候,将person对象的地址值复制给参数obj,此时变量person和obj指向同一块内存区域,所以在方法中往参数obj添加name属性之后, 在person对象中也得以体现。

NOTE:可通过 typeof 操作符获取一个变量的数据类型

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值