const 和 let
优先用const, 如果值需要被改变则用let;
当用const声明引用数据类型时比如:声明一个对象、声明一个数组时地址不会改变,改变的是里面的内容。
用Object.freeze(对象),可以将对象冻结,使其值不会发生改变。只能使指定对象冻结,不会影响更深层的值。
Object.keys(对象)返回一个当前对象、属性组成的数组
封装一个冻结函数,使该对象的每一层都能使其值不变:
function myFreeze(obj){
Object.freeze(obj);
Object.keys(obj).forEach(function(key){
if(typeof obj[key]=='object'){
myfreeze(obj[key]);}
}
//声明常量 const //声明变量 let 优先使用const,后续如果要改变值再考虑用let
优先用const,确实需要改变值才用let声明

递归冻结,keys第一次见

freeze只能冻结基本数据类型,而不能冻结嵌套的对象如数组

freeze冻结堆内存

不可被改变指的是引用地址不变,但存在于堆内存中的数据可以改变

const 声明基本数据类型的时候。number , 布尔,字符串,undefind是不能改变的
const 声明 引用数据 object array 类型的时候,是可以进行改变的,
因为 修改的是引用地址的内容,并不是引用的地址。
如果需求里 需要 对象和数组 也是不可修改的,可以用 Object.freeze().冻结这个对象或者函数。就可以不被改变了,但是他只能作为浅层次的冻结,只能冻结第一层。深层次的无法冻结
解决方案
使用递归 将深层次的对象或者数组进行冻结
function myFreeze(obj){
//将第一层冻结住
Object.freeze(obj);
// Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组
console.log(Object.keys(obj)) //['name', 'year', 'extension']
Object.keys(obj).forEach(function(key){
if(typeof obj[key] == 'object'){
console.log(typeof obj[key])
myFreeze(obj[key])
}
})
}
Object.freeze() 不仅能冻结对象 还能冻结数组呀
Object.freeze()只能浅层次冻结,嵌套引用不能冻结
//自行封装冻结 递归
function myFreeze(obj){
Object.freeze(obj);
Object.keys(obj).forEach(function(key){
if(typeof obj[key] == 'object'){
myFreeze(obj[key]);
}
})
}
let & const

深层次冻结
优先使用const 如果需要改变才使用let
Object.keys()返回的是参数对象内部键数组
Object.freeze()冻结属性,浅冻结
const 声明的变量不能改变栈存储的值(基本数据类型和引用数据类型的引用地址)
function myFreeze(obj) {
Object.freeze(obj)//冻结(只能冻结第一层)
Object.keys(obj).forEach(function (key) {
if (typeof obj[key]==='object'){
myFreeze(obj[key])
}
})
}es6递归冻结数据
1.Object.freeze();
数据冻结,浅层次冻结只能冻结第一层;
适用:对象、数组;
深层次冻结自己封装:
function myFreeze(obj) {
Object.freeze(obj);
Object.key(obj).forEach(key =>{
if(typeof obj[key] === 'object'){
myFreeze(obj[key]);
}
})
}
2.let vs const 优先使用const
object.freeze(obj)可以浅层次的冻结常量对象或数组
声明变量用let
声明常量用const
object.freeze封装方法:修改底层数据

Object.freeze:只能作为浅层次的冻结

Object.freeze:冻结数据

const常量也能被更改
