js数据类型

js数据类型

js数据类型分两大类:基本数据类型,引用数据类型,由于在内存中存放形式不同,所以这两种的对变量的访问机制也不同。基本类型是按值访问,可以直接得到变量值。引用类型则是按引用访问。在访问引用类型的值是先得到存该值的地址,再通过该地址得到变量值。以下的特殊性数据类型是对于基本数据类型中null和undefined两种来说,

基本数据类型

包括:字符串string,数字number,布尔值boolean,NULL,undefined

特点:

  1. 基本类型值大小固定,变量值存放在栈内存中。

  2. 基本类型值初始化:当用var关键字声明初始化一个变量之后,将变量名与一个栈内存地址绑定,并将变量的值存放在该地址的空间内。

  3. 基本类型值之间赋值:当基本类型之间发生变量的赋值操作时,会将栈空间中的值进行copy,并将该副本赋值给另一个变量,存放在另一个变量名绑定的内存空间中。变量值改变不会相互影响。

  4. 基本类型值重赋值(不可改变的原始值):如果对一个已经声明了的变量重新赋值,其实是切断了该变量与内存地址之间的绑定联系,将指针指向了新的栈空间,并将新值存在新空间内。之前地址就变成了野房间,野房间内的数据也不会凭空销毁,直到下一次与变量绑定时,被变量值覆盖。

引用数据类型

包括:数组Array,对象object

特点:

  1. 引用类型由于可以修改,可以不管的扩充成员,所以它们的大小是无法确定的,会降低变量查寻的速度,因此无法放在栈内存中。所以要保存一个引用类型,需要在堆内存中开辟一块空间去保存引用类型的数据。

  2. 引用类型值初始化:引用类型的值存放在堆中。变量名绑定的栈空间内存放的是一个指针,存放16进制的地址值,大小固定,所以存放在栈中,该地址就是变量值所在的堆地址。

  3. 引用类型值间赋值:该赋值不同与基本类型值之间的赋值。当赋值发生时,拷贝的依然是栈空间内的内容。但由于这是一个地址值,所以两个引用类型变量所指的就是同一个堆空间。此时,变量值改变会相互影响。

  4. 通过函数方法对对象进行改变,例如数组的push(),splice()等方法,实际上也是通过指针寻址,并在原来的变量值上做修改,所以依然是会相互影响的。

  5. 引用类型值重赋值:引用类型重赋值,在堆中开辟了一个新房间,并将栈中指针指向了新的堆地址。此时,a、b变量值改变就不会相互影响了。

特殊性数据类型

包括:空对象null,未定义undefined

特点(区别):

  1. null是一个表示"无"的对象,转为数值时为0;
    undefined是一个表示"无"的原始值,转为数值时为NaN。

  2. 双等于判断时着两者均转换为0,因此相等;在if 语句中着两者均转换为false

  3. null表示"没有对象",即该处不应该有值,如函数返回了一个不存在的对象就用Null代替。常用于一下几处:

    • 作为原型链的重点

    • 作为函数的参数表示函数的参数不为对象

  4. undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。情况如下:

    • 变量声明但为赋值时默认为undefined
    • 函数在调用时应该提供的参数未提供时该参数默认为undefined
    • 对象的属性未被赋值时,默认为undefined
    • 函数没有返回值时,默认为undefined

作者:zhengxue_er
来源:CSDN
原文:https://blog.csdn.net/qq_38177305/article/details/84451478
版权声明:本文为博主原创文章,转载请附上博文链接!

不可变数据类型

包括:string,number,Boolean,Null,undefined

解释:js不可改变(string,number,Boolean,Null,undefined)类型的值

可变数据类型

包括:对象object,数组Array

解释:js可以改变对象属性值和数组的值

对于可变数据类型和不可变数据类型的进一步理解

//示例1

var myStr = "Bob";

myStr[0] = "J";

console.log(myStr); //Bob

如上这种用法无法实现将“Bob”改为“Job”,是因为在js中字符串的数组操作本就比较不规范,用下标获取字符串的某个字符是不标准的,最正确的做法是使用 charAt(index) 方法(当 index 的取值不在 str 的长度范围内时,str[index] 会返回 undefined,而 charAt(index) 则返回空字符串)。

//示例2

var myStrNew = "Bob";

myStrNew = "Job";

console.log(myStrNew); //Job

而对于示例2,我们要清楚,虽然有前面的那个结论,但结论中所说的不能改变指的是字符串字面量(string literal)的各个字符不能被改变

针对字符串变量,有很多方法都可以应用在其上面,这些所有的方法看上去返回了一个修改后的字符串,实际上返回的是一个新的字符串值

如果我们要 “改变” 某个字符串变量的值,唯一的方法是重新给它赋一个值,在示例2的赋值过程中,改变的其实只是 myStrNew 的指向(可以把 myStrNew 理解为指向 Bob 这个字符串字面量的指针),而 Bob 这个字符串字面量自始至终都没有被改变,至于它是在何时被垃圾回收机制回收的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值