let 和 const 对比

ES6 新增了letconst,它们声明的变量,都处于“块级作用域”。并且不存在“变量提升”,不允许重复声明。

同时,const声明的变量所指向的内存地址保存的数据不得改变:

如果要保证指向的数据结构也不可变,需要自行封装:

/**
 * 冻结对象
 * @param {Object} obj
 * @return {Object}
 */
function constantize(obj) {
    if (Object.isFrozen(obj)) {
        return obj;
    }
    Reflect.ownKeys(obj).forEach(key => {
        // 如果属性是对象,递归冻结
        typeof obj[key] === "object" && (obj[key] = constantize(obj[key]));
    });
    return Object.freeze(obj);
}
/********测试代码 **********/
const obj = {
    a: 1,
    b: {
        c: 2,
        d: {
            a: 1
        }
    },
    d: [1, 2]
};
const fronzenObj = constantize(obj);
try {
    fronzenObj.d = [];
    fronzenObj.b.c = 3;
} catch (error) {
    console.log(error.message);
}

Set 和 Map对比

题目:解释下Set和Map。

①Set 常用方法

// 实例化一个set
const set = new Set([1, 2, 3, 4]);
// 遍历set
for (let item of set) {
    console.log(item);
}
// 添加元素,返回Set本身
set.add(5).add(6);
// Set大小
console.log(set.size);
// 检查元素存在
console.log(set.has(0));
// 删除指定元素,返回bool
let success = set.delete(1);
console.log(success);
set.clear();

其他遍历方法:由于没有键名,values()keys()返回同样结果。

for (let item of set.keys()) {
    console.log(item);
}
for (let item of set.values()) {
    console.log(item);
}
for (let item of set.entries()) {
    console.log(item);
}

②Map 常用方法

Map 接口基本和 Set 一致。不同的是增加新元素的 API 是:set(key, value)

const map = new Map();
// 以任意对象为 Key 值
// 这里以 Date 对象为例
let key = new Date();
map.set(key, "today");
console.log(map.get(key));

Proxy

Powered by Fruition