一、JavaScript值类型和引用类型有哪些 (1)值类型:数值、布尔值、null、undefined、string(字符串在赋值运算中会按引用类型的方式来处理)。
(2)引用类型:对象、数组、函数。
值类型一般是一些固定的字节大小的;引用类型往往存储数组,对象,函数这些实现很难知道占据内存大小的量。
二、如何理解值类型和引用类型及举例
我们可以用“连锁店”和“连锁店钥匙”来理解。 (1)值类型理解:变量的交换等于在一个新的地方按照连锁店的规范标准(统一店面理解为相同的变量内容)新开一个分店,这样新开的店与其它旧店互不相关、各自运营。【值类型例子】
function chainStore() {
var store1='Nike China'; var store2=store1; store1='Nike U.S.A.'; alert(store2); //Nike China } chainStore(); //把一个值类型(也可以叫基本类型)store2传递给另一个变量(赋值)时,其实是分配了一块新的内存空间,因此改变store1的值对store2没有任何影响,因为它不像引用类型,变量的交换其实是交换了指像同一个内容的地址。
(2)引用类型理解:变量的交换等于把现有一间店的钥匙(变量引用地址)复制一把给了另外一个老板,此时两个老板同时管理一间店,两个老板的行为都有可能对一间店的运营造成影响。
【引用类型例子】
function chainStore() {
var store1=['Nike China'];
var store2=store1; alert(store2[0]); //Nike China store1[0]='Nike U.S.A.'; alert(store2[0]); //Nike U.S.A. } chainStore(); //在上面的代码中,store2只进行了一次赋值,理论上它的值已定,但后面通过改写store1的值,发现store2的值也发生了改变,这正是引用类型的特征,也是我们要注意的地方。
基本数据类型使用值(value)的方式进行比较
var a = "Roger";
var b = "Roger";
if (a == b) // => true
if (a === b) // => true
引用类型通过引用(reference)进行比较
var a = { x: 1, y: 7 };
var b = { x: 1, y: 7 };
if (a == b) // => false
if (a === b) // => false
b = a;
if (a == b) // => true
if (a === b) // => true
基本数据类型使用值(value)的方式进行传递
function foo(bar) {
bar = 2;
}
var a = 1;
foo(a);
alert(a); // => 1
引用类型通过引用(reference)方式进行传递
function foo(bar) {
bar.x = 2;
}
var a = { x: 1, y: 7 };
foo(a);
alert(a.x); // => 2
注意 去引用之后将不能再修改原来的值 (此时bar指向了{x:2}这个对象,不再指向{x:1,y:2})
function foo(bar) {
bar = { x: 2 };
}
var a = { x: 1, y: 7 };
foo(a);alert(a.x); // still 1