JAVASCRIPT之数据类型 叁歲伎倆 2022-03-16 01:16 164阅读 0赞 ## 数据类型 ## 在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 操作符获取一个变量的数据类型
还没有评论,来说两句吧...