JS中可以把变量分成两部分,基本类型和引用类型。
JavaScript值类型和引用类型有哪些
(1)值类型:数值、布尔值、null、undefined。
(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的值也发生了改变,这正是引用类型的特征,也是我们要注意的地方。
引用类型值的一些问题:
1、动态属性。
JS中对象的属性可以动态的添加并且赋值的,比如:
var obj = new Object();
obj.name = 'zjzhome';
console.log(obj.name) //zjzhome
但是基本类型不可以添加属性,虽然这样做不报错。
2、复制值
引用类型复制和简单类型不同,复制完成后新值和之前的值都是引用的同一个对象,所以之前的值改变,也会影响复制后的值,看个例子:
var obj1 = new Object()
obj1.name = 'zjzhome'
var obj2 = obj1
console.log(obj2.name); //zjzhome
obj1.name = 'zjz'
console.log(obj2.name) //zjz
3、函数传参
JS中所有函数传参都是按值传递的。
function setName(obj) {
obj.name = 'zjzhome'
}
var person = new Object()
setName(person)
console.log(person.name) //zjzhome
看了上面的例子可能会觉得对象是按引用传递的,我们把例子修改一下:
function setName(obj) {
obj.name = 'zjzhome';
obj = new Object();
obj.name = 'zjz'
}
var person = new Object()
setName(person)
console.log(person.name) // zjzhome
person的值并没有因为obj的修改而改变,说明不是按引用传递的。如果是按引用传递的,obj和person指向同一个对象,当obj改变,person也会改变。
4、类型检测
typeof用于检测简单类型,对于对象,我们更想知道的是什么类型的对象。所以引进了instanceof操作符。
person instanceof Object 这样来检测person是不是Object。
person instanceof Array 这样来检测person是不是Array。