关于js的“基本类型与引用类型的区别”

关于“js 基本类型与引用类型的区别”,看到一句话不太理解。。

基本类型的值是不可变得
任何方法都无法改变一个基本类型的值,比如一个字符串:

var name = 'jozo';

name.toUpperCase(); // 输出 'JOZO'

console.log(name); // 输出  'jozo'

=============
而此时,要是 name = 'jozo111'的话,返回结果就是 jozo111 了啊。。

那这个值不就改变了嘛?
为啥说是“基本类型的值是不可变”的呢。。

希望各位大神给讲解下。

非常感谢!

阅读 4.2k
6 个回答
  1. 有的方法不改变数据自身, 比如Array.map, 但有的方法改变数据自身,比如Array.sort,这只是因为这些方法实现原因
  2. 引用类型实际上你变量保存的之数据指针,数据在堆上, 指针在栈上。 访问他的时候,先访问指针,指针映射到堆的真实数据
  3. 字符串赋值后,会指向一个新的指针, 并不是原指针的数据修改了

https://blog.csdn.net/Winston...

name 的初始值是 'jozo' , 通过 name = 'jozo111' 赋值后,name 只是指向 'jozo111,'jozo' 并没有被变成。

说的是调用对象自身的方法,会创建新的对象,你去看下 toUpperCase 的源码就知道咋回事了,你那个是赋值语句

说的是调用方法,不是赋值操作,基本类型的赋值相当于是一个深拷贝。你调用slice,substr, split等方法都不会改变基本类型的值

比如有一个名字叫array的数组(引用类型)里面的数值为123: var array = [1,2,3];
“可改变“的意思是,当array[0] = 5;此时这个数组变成了[5,2,3],内存里还是只有这一个数组。

你的例子中”不可改变“就是说,当name=jozo111时,内存里面会同时存在两个object,jozojozo111, 只是name现在指向jozo111,但并没有把jozo这个字符串改变。

当name重新赋值的时候,name已经不是原来的name了,储存地址已经发生了改变

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题