1.字符型值不可变

目录

  • 关于 js 基本类型与引用类型(堆内存、栈内存的理解)

    • 1. 基本类型
    • 2. 引用类型
      • 1. 引用类型的值是可变的
      • 2. ** 同时保存在栈内存和堆内存 **
      • 3. ** 引用类型的比较是引用的比较 **
      • 4. 对象赋值

关于 js 基本类型与引用类型(堆内存、栈内存的理解)

ECMAScirpt 变量有两种不同的数据类型:** 基本类型,引用类型 **。

也有其他的叫法,比如 ** 原始类型 ** 和 ** 对象类型 ,拥有方法的类型和不能拥有方法的类型,
还可以分为
可变类型 ** 和 ** 不可变类型 **。

1. 基本类型

基本的数据类型有:undefined,boolean,number,string,null

基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值。
基本类型有以下几个特点:

  1. ** 基本类型的值是不可变的 **:

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

    ** 注意:** 所以,要改变基本类型的值。只能采取重新复制的办法,将一个新的值整个赋值给该变量!!。(要记住)

    对于下面的例子:

    lang 的值(指向的内存区块的值)并没有被改变,而是重新开辟一个内存用来储存 lang + ‘java‘,再将 这个内存地址重新复制给 lang。

    ** 注意:** 原先存储‘java‘的内存还在。系统的内存自动清理检测到该内存没有被引用时,会将其清空。

  2. ** 基本类型的比较是值的比较:**

    即:他们的值相等,就可相等。

    在用 == 比较两个不同类型的变量时会进行一些类型转换。上面的比较先把 true 转换为数字 1 再和数字 1 进行比较,结果就是 true 了。 基本类型中,当两个值的类型相同的时候,== 就相当于 ===。

  3. ** 基本类型的变量是存放在栈区的 **

    栈区是指内存里的栈内存。内存地址从高往低,因为栈内存较小,空间有限,高到低的地址易于知道剩余内存。

    栈区存储了变量符和变量的值。

2. 引用类型

1. 引用类型的值是可变的

2. ** 同时保存在栈内存和堆内存 **

? javascript 和其他语言不同,其不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。所以引用类型的值是按引用访问的,是操作对象的引用。准确地说,引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,
也可以说是该对象在堆内存的地址。
假如有以下几个对象:


3. ** 引用类型的比较是引用的比较 **

引用类型时按引用访问的,换句话说就是比较两个对象的堆内存中的地址是否相同,那很明显,person1 和 person2 在堆内存中地址是不同的.

** 所以:** 引用类型的比较中,== 和 === 没区别,都是指向同一个地址,即同一个对象是,才能相等。

4. 对象赋值

当从一个变量向另一个变量赋值引用类型的值时,同样也会将存储在变量中的对象的值复制一份放到为新变量分配的空间中。前面讲引用类型的时候提到,保存在变量中的是对象在堆内存中的地址,所以,与简单赋值不同,这个值的副本实际上是一个指针,而这个指针指向存储在堆内存的一个对象。那么赋值操作后,变其中任何一个变量,都会相互影响:

** 因此,引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响。**

原文地址:https://www.cnblogs.com/hongyong/p/11609412.html

时间: 2024-12-28 01:11:51

1.字符型值不可变的相关文章

可变字符与不可不可变字符串的心得

字符串从我接触OC开始就在用它,但是至始至终都没整明白这是个什么东东! 现在学到了这一块儿的知识,经过两天的学习,逐渐的理清楚了一些关于Nsstring和NsMutablestring的一些问题!现在我把它给梳理出来了,供各位大神们知道! 第一个是不可变字符串Nsstring的介绍: 首先是不可变字符串的创建 1 //1.不可变字符串的创建 2 //快速创建 3 NSString *str = @"这是不可变数组的快速创建"; 4 NSLog(@"%@",str);

通过char与varchar的区别,学习可变长的字符类型

转自http://www.uphtm.com/database/232.html 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定的长度,而varchar属于可变长的字符类型. char与varchar的区别 char (16)长度固定, 如'www.uphtm.com' 存储需要空间 14个字符 varchar(16) 可变长 如'www.uphtm.com' 需要存储空间 15字符, 从上面可以看得出来char 长度是固定

使用分类的方法,去除空格,算字符个数

1 #import "NSString+extendString.h" 2 3 @implementation NSString (extendString) 4 //1.声明一个字符串反转(比如@”123”调用方法后返回@”321”) 5 + (NSString*)revertWithString:(NSString*)str 6 { 7 //定义一个可变字符串 8 NSMutableString *string = [NSMutableString string]; 9 //2.获

字符编码转换说明及深浅copy介绍

编码说明: 常用编码介绍: ascii 数字,字母 特殊字符. 字节:8位表示一个字节. 字符:是你看到的内容的最小组成单位. abc : a 一个字符. 中国:中 一个字符. a : 0000 1011 unicode: 万国码 起初: a : 0000 1011 0000 1011 中: 0000 1011 0000 1111 升级: a : 0000 1011 0000 1011 0000 1011 0000 1011 中: 0000 1011 0000 1111 0000 1011 00

第一部分

#java 基础 ##java运行机制和jvm java 不是纯粹的编译语言也不是纯粹的解释语言 编译 生吃.class文件 不是特定平台的机械码 平台无关的字节码 解释 jvm负责执行字节码  jvm是一个抽象的计算器 有 指令集,寄存器,类文件格式,栈,垃圾回收, 储存区.(实现了java与平台无关性) jdk java SE Development KIt java标准版开发包 jre java Runtine Environment  java运行环境 jvm在jre里面 javaEE中

java疯狂讲义笔记整理(第二版第一部分)

第一章    java语言概述 1.1    java语言的发展简史 1990末:    sun公司“Green计划”(James Gosling领导)        ----目的是智能家电编写一个通用嵌入式控制系统,为此创建oak 1992夏天:    "Green计划"完成新平台的部分功能 1992年11月:    "Green计划"被转为"FirstPerson有限公司"-一个sun的全资子公司,致力于创建一个高度互动的设备 1994夏天:

OCI函数简单解析(转载)

OCL函数参考 下面的表列出了Open Client库支持的函数.需要注意的是所涉及到的头文件必须由用户提供,Postgres Plus Advance Server本身并不提供这些文件. 表9-54 与连接,认证和初始化相关的函数 函数名称 描述 OCIEnvCreate 创建一个OCI环境 OCIEnvInit 初始化一个OCI环境句柄 OCIInitialize 初始化OCI环境 OCILogoff 释放一个会话 OCILogon 创建一个登录连接 OCILogon2 使用不同的方式创建一

第9篇-JAVA面向对象-常用类Ⅴ

第9篇-JAVA面向对象-常用类Ⅴ 每篇一句 :巨轮寻深水而航行 初学心得: 没有胆大的猜测就没有伟大的发现 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-04-13| JAVA面向对象 Ⅴ] 1.JAVA Scanner类 java.util.Scanner 是 Java5 的新特征,读者可以通过 Scanner 类来获取用户的输入 创建 Scanner 对象的基本语法格式: Scanner s = new Scanner(System.in); 使用 next 方法代码: 1

[WuDe]C#程序设计教程 - 第1章 C#程序设计基础

第1章 C#程序设计基础 1.1 C#基础 概述 .NET是一个平台 C#是一门语言 编译原理 1) 编写源代码 2) C#编译器将C#源代码编译成MSIL 3) 将中间代码交给CLR的即时编译器(JIT)将微软中间语言转化成相应的机器码(CPU指令) 4) 交给CPU运行机器码 被CLR所管理的代码叫做托管代码,不能够被CLR管理的代码叫做非托管代码,非托管代码运行效率高,但是相对安全性较低;托管代码运行效率较低,但代码相对是安全的. 标识符 以字母/下划线/数字组成,且第一个字符必须为字母或