js引用类型和值类型

JavaScript060

js引用类型和值类型,第1张

(1)值类型:字符串、数值、布尔值、undefined、null

(2)引用类型:对象、数组、函数

(1)值类型:

1、占用空间固定,保存在栈中

2、保持和复制的都是值的本身

3、基本数据类型都是值类型

4、一个方法在执行时会创建一个内存栈,并在执行结束后自然销毁,栈里面存储的是基础变量和一些对象的引用变量,基础变量的值是存储在栈中,而引用变量存储在栈中的指向堆中的数组或者对象的地址,这就是为什么 修改引用类型 总会影响到其他这个动作的引用变量。

(2)引用类型:

1、占用空间不固定,保存在堆。

2、保存和复制的是指向对象的一个指针。

3、堆内存的对象不会随方法的结束而被销毁,即使方法结束后,这个对象还可能被另一个引用变量所使用,那么这个对象依然不会销毁,只有一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会去核实的时候回收它。

(1)动态属性;定义基本类型值和引用类型值的方式是类似的。但是,当这个值保存到变量中以后,对不同类型值可以自行的操作大相径庭。对于引用类型的值,我们可以为它已经属性和方法,也可以改变和删除其属性的方法,但是,我们不能给基本类型的值添加属性,只能给引用类型值动态的添加属性,以便将来使用。

(2)如果从一个变量向另一个变量复制基本类型值,会在变量对象上创建一个新值,然后把该值分钟到为新变量分配的位置上。

(3)传递参数;在向参数传递基本类型的值时,被传递的值会分钟给一个局部变量(即命名参数)。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。

基本数据类型(按值访问):Undefined 、 Null 、 Boolean 、 Number 和 String

引用数据类型(按引用访问):object、Array、function

typeof(检测基本数据类型时 typeof 是非常得力的助手)可以返回以下6种类型:undefined  、 boolean 、 number 、string、object(对象和null都是object类型)、function

instanceof(用于检测引用类型):所有引用类型的值都是 Object 的实例,person(引用类型值) instanceof Object永远都是true。

要知道是什么类型的对象,使用instanceof 操作符接上想要判断的类型,例如colors instanceof Array。

基本数据类型复制:复制的是该变量的副本,这两个变量可以参与任何操作而不会相互影响

引用数据类型复制:复制的是该变量的指针,该指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一 个变量

传参:基本类型和引用类型全部是按值传递,相当于把参数复制一份给到function的局部变量

为了便于操作基本类型值,ECMAScript 还提供了 3 个特殊的引用类型: Boolean 、 Number 和

String 。

Number 类型重写了 valueOf() 、 toLocaleString() 和 toString()方法。除了继承的方法之外, Number 类型还提供了一些用于将数值格式化为字符串的方法。 toFixed() 方法会按照指定的小数位返回数值的字符串表示。

String 对象的方法也可以在所有基本的字符串值中访问到。其中,继承的 valueOf() 、 toLocale-String() 和 toString() 方法,都返回对象所表示的基本字符串值。String 类型的每个实例都有一个 length 属性。

字符方法:两个用于访问字符串中特定字符的方法是: charAt() 和 charCodeAt() 。

var stringValue = "hello world"

alert(stringValue.charAt(1))//"e"

alert(stringValue.charCodeAt(1))// 输出"101",小写字母 "e" 的字符编码

字符串操作方法

1、concat:拼接字符串,可接收任意多字符串,不改变原字符串值,虽然 concat() 是专门用来拼接字符串的方法,但实践中使用更多的还是加号操作符(+)。

var stringValue = "hello "

var result = stringValue.concat("world", "!")

alert(result)//"hello world!"

alert(stringValue)//"hello"

2、三个基于子字符串创建新字符串的方法: slice() 、 substr() 和 substring() 。都接收1或2个参数。

slice() 、substring()在接收正数参数时,第一个参数是字符串截取的起始位置,第二个是字符串结束位置。

substr()在接收正数参数时,第一个参数同上,第二个参数是截取长度。

当第一个参数为负数的时候,slice()和substr()按照参数+字符串长度结果来截取;substring()将负参数转换为0;

当第二个参数为负数的时候,slice()按照参数+字符串长度结果来截取;substr()和substring()将负参数转换为0;

3、字符串位置方法:有两个可以从字符串中查找子字符串的方法: indexOf() 和 lastIndexOf()

4、trim():删除字符串前后空格,不改变原字符串值

5、字符串大小写转换方法

字符串大小写转换的方法有 4 个: toLowerCase() 、 toLocaleLowerCase() 、 toUpperCase() 和toLocaleUpperCase() 。

6、字符串的模式匹配方法

match() 方法只接受一个参数,要么是一个正则表达式,要么是一个 RegExp 对象。返回数组。

search()参数同上。返回要查找的在字符串中第一次出现的位置。

字符串替换:var result = text.replace("at", "ond")

7、localeCompare() 方法

var stringValue = "yellow"

alert(stringValue.localeCompare("brick"))//1

在前面返回1,同样位置返回0,在后面返回-1

JS基本数据类型的变量存放的是基本类型数据的实际值;而引用数据类型的变量保存对它的引用,即指针。

JS基本数据类型:null undefined number boolean

string比较特殊

引用数据类型:function object array

var a = 11

var b = 1

b = 12

console.log(a)//11 a的值不会随b值得改变而改变

var a = [1,2,3]

var b = a

a[0] = 2

console.log(b[0]) //2, b的值随着a的值改变而改,因为他们指向同一个内存地址

var a = [1,2,3]

var b = a

b = [11, 12, 13]//b指向了另一个内存地址,与a断开关联

a[0] = 2

console.log(b[0]) //11,b的值不随a的值改变而改变

比如说 var a = 11是基本数据类型,因此变量a存放的就是1这个值

var b = [1,2,3],[1,2,3]是引用数据类型,[1,2,3]是放在内存中的,而变量b存放的是[1,2,3]的地址,而不是[1,2,3]这个值

当使用b这个变量时,js解释器会通过b存放的内存地址,找到内存中的相应地址,将其中的值取出来返回