const声明常量的注意事项基本与let相同,也是有四个说明点: 1:只在当前代码块下作用 2:作用域不会被提升 3:不能重复声明 4:声明的常量必须赋值 重点要说一下的是第四点: { let str ; str = '藏三'; console.log(str) } 上面这样写是没什么问题的,然后改成下面的代码: { const str ; str = '藏三'; console.log(str) } 这样写是不行的,首先设置好的编辑器会先一步提示错误(标红或者红波浪线),然后浏览器控制台也会报错 Missing initializer in const declaration 另外这个常量赋值后是无法再次修改的。 最后要记住的是用const声明对象的问题: { const obj = {name:'张山'}; console.log(obj.name); obj.name = '李四'; console.log(obj.name); } 上面代码输出结果是 张山 李四 这种现象的原因就是: 在内存中有栈区和堆区的概念,创建的对象都是存放在堆区的,通过一个地址来描述这个对象,然后栈区就是用来关联这个地址的。也就是说,const obj = {name:'张山'};存放的是obj的地址,根据这个地址找到存放内容的地方,而obj.name = '李四';改的是根据地址找到的内容存放区。所以并没修改const定义的obj对象,但是不能给obj赋值,这里的赋值就是说你不能再给一个对象实例 obj={name:'王五'} TIPS: 栈区和堆区的含义: 栈区(stack):由编译器自动分配释放 ,存放函数的参数值、局部变量的值等,内存的分配是连续的,类似于数组,当我们声明变量时,编译器会自动接着当前栈区的结尾来分配内存。 堆区(heap):由程序员分配释放, 若程序员不释放,程序结束时由OS回收,内存的分配不是连续的,类似于链表。 变量存放的位置 C/C++程序占用的内存分为以下几部分: 1. 栈区(栈在内存中的位置)存放的变量(局部变量、函数参数等)由编译器自动分配释放。 2. 堆区存放的变量(用new,malloc,calloc,realloc等分配内存函数得到的变量)由程序员分配释放。 3. 全局区(静态区)存放全局变量和静态变量。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束时由OS回收。 4. 常量区存放常量。程序结束时由OS回收。 例如: int a = 0; //全局初始化区 char *m1; //全局未初始化区 void main() { int b; //栈 char s[] = “abcd“;//栈 char *m2; //栈 char *m3 = “1“; //1 在常量区,m3在栈上 static int c =0; 全局初始化区 m2= (char *)malloc(5); //分配来的5字节的区域就在堆区 strcpy(m1, “1“); //1放在常量区,编译器可能会将它与m3所指向的 “1“优化成一块。 }
浙公网安备 33010602011771号