2020-01-16 - 草稿 - 草稿

原始值:原始类型的值就是原始值,原始值有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]

你可能感兴趣的:(2020-01-16 - 草稿 - 草稿)