ECMAScript 变量包含两种不同的数据类型:基本类型和引用类型
基本类型:String、Number、Boolean、Undefined、Null
引用类型:Object
(补充:判断一个变量是否为null
,直接用===
来判断就可以了)
下面来谈一下两者的一些区别:
获取数据类型
使用typeof获取数据类型,返回值为字符串类型
//基本类型
var mag = "strings";
var age;
console.log(typeof mag); //“string”
console.log(typeof age); //"undefined
console.log(typeof 5); //"number"
//引用类型
var person = {
name:"Jack”,
age:18
};
console.log(typeof person); //"object"
注意:
使用typeof判断null的数据类型时会返回“object”,但是并不代表null就是Object类型的值,这只是历史遗留的问题,现在使用null作为对象的占位符。
两种类型赋值时的区别
基本类型存储的是数据本身的变量是值类型的数据。值类型复制数据是直接将存储的数据复制一份进行赋值,两份数据在内存中是完全独立的,互不影响。
var str = "lalala";
var str1 = str;
str = "lvelvelve";
console.log(str); //lvelvelve
console.log(str1); //lalala
而引用类型存储的是数据在内存中的地址,即数据在内存中单独存储。赋值的时候,是将变量中存储的地址复制一份单独存储。但是两个变量不独立,修改其中那个对象时,另外一个引用对象来访问时,也会访问到修改后的值。
var p1 = {
name:"xxx",
type:430
}
var p2 = p1;
p1.name = "111";
p1.type = 100;
console.log(p1); //{name:"111",type:100}
console.log(p2); //{name:"111",type:100}
两种数据在函数中的使用
在探讨这个问题之前,需要对下面两个概念有比较清楚的认识:
实参:函数调用的时候,实际传入的参数
形参:函数声明的时候,用来占位的变量名,没有实际的数据
注意:
函数调用的时候,会默认地将实参赋值给形参。
简单类型做函数的参数:
函数内部的变量,也就是形参和实参只是简单的赋值操作,两份数据独立存储于内存,在函数内部对该对象进行修改,不会影响到外面的变量。下面来看一个例子:
var num = 10;
function changeNumber(num1) {
num1 = 100;
console.log(num1); //100
}
changeNumber(num);
console.log(num); //10
引用类型做函数的参数
在该过程中,还是将实参存储的地址赋值给了形参。在函数内部,形参同样指向该对象,所以在函数内部对该对象进行修改,会影响到外面的变量。
var obj = {
name : "aaa"
};
function jinhua(param){
param.name = "bbb";
}
jinhua(obj);
console.log(obj.name); //bbb
注意:
如果在函数内部重新创建对象,并为该形参赋值,那么两个对象不会再有联系,修改其中一个对象,另外一个将不会被影响。
var obj = {
name : "xxx"
};
function jinhua(param){
param.name = "bbb";
//下面的这句代码,重新创建了一个对象,修改了param的指向
//但是,obj还指向原来的那个对象 所以,在修改param的时候,修改的是
//新创建的对象,跟obj没有关系
param = {
name:"yyy"
};
param.name = "xxx";
}
jinhua(obj);
console.log(obj.name); //bbb