原始值:原始类型的值就是原始值,原始值有string,、number、boolean、null和undefined五种。
valueOf() 和 toString() 方法的使用:
1. null和undefined没有valueOf和toString方法,调用时报错。
2. 默认情况下调用的是valueOf方法:
每个JavaScript对象的 valueOf 方法定义不同:
对象 返回值
String 字符串值
Number 数字值
Boolean Boolean 值
Object 对象本身
Array 数组的元素被转换为符 串,这些字符串由逗号 分隔,连接在一起。 其操作与 Array.to String 和 Array.join方 法相同
Function 函数本身
Date 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC
(1)调用对象的valueOf方法,如果返回值是原始值直接返回,否则返回对象本身。
(2)对于数组,如果不重写其toString()方法,其默认实现就是调用数组的 join()方法返回值作为toString()的返回值。
原始值存储在栈中。意思就是说,当一个原始变量把值赋给另一个原始变量时,只是把栈中的内容复制给另一个原始变量,此时这两个变量互不影响,即当一个变量值改变时,另一个变量不会因此而发生任何变化。
引用值:
引用值是指一些复合类型数据的值,包括Object,function,Array,RegExp,Data,引用值于原始值不同,引用值把引用变量存储在栈中,而实际的对象存储在堆中。每一个引用变量都有一根指针指向其堆中的实际对象。
var a = [1,2,3] ;
var b = a ;
a.push(4) ;
console.log(b) ; //输出1,2,3,4
a = [12] ;
console.log(b) ; //输出1,2,3,4
console.log(a) ; //输出12
引用值a赋值给b时,各自的变量名存储在栈中,而实际对象值都指向堆中的同一个地址,当变量a通过方法改变值时,实际上时改变堆中内容,因此,此时b的值也会相应的改变。
当a通过非方法改变值时,系统会为该引用变量重新创建一个堆房间,此时,a的指针指向新的堆地址。
原始值与引用值的区别:
1.原始值存放在栈内存中,引用值存放在堆内存中。
2.复制变量时的不同(1)原始值:将一个保存原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的。(2)引用值:将一个保存对象内存地址的变量复制给另一个变量时,是把这个内存地址赋值给新变量,也就是说这两个变量都指向了堆内存中的同一个对象,他们中任何一个作出的改变都会反映在另一个身上。(这里要理解的一点就是,复制对象时并不会在堆内存中新生成一个一模一样的对象,只是多了一个指向这个对象指针的变量而已)如:
var a=1;
var b=a;
var a=2;
console.log(b)//1,彼此独立,互不影响
var arr1=[1,2];
var arr2=arr1;
arr1.push(3);
console.log(arr2)//[1,2,3]
//arr1和arr2指向堆内存中同一个地址,一个作出的改变会反映在另一个身上
var arr3=[1,2];
var arr4=arr3;
arr3=[6,7];//此时arr3指向的是另开辟的一个内存空间。
console.log(arr4)//[1,2]