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“优化成一块。 
}

 

posted on 2018-02-06 21:51  YKing_匆  阅读(184)  评论(0)    收藏  举报