Typescript & Javascript 开发小记 写一个简单的沙箱
深拷贝和浅拷贝是 JS 基础,很多人(包括我)可能理解两者的区别。
还有记录一下近期开发沙盒的过程。
中数组的深拷贝和浅拷贝
1 | // 现在有个数组 list,它里面有“a、b、c”,3 个变量,如下: |
重要概念
- 基本类型:Null、Undefined、Boolean、Number、String、Symbol。
- 引用类型:Object、Array、Function、Date 等。
基本类型和引用类型的区别:基本类型在内存中是直接存储数据的,引用类型则为一个内存地址,通过这个地址可以得到存储的数据。
结果及注释
1 | /** |
总结
- 浅拷贝得到的数组,其内引用类型的地址为原来的地址,基本类型没有引用地址,等同于深拷贝。即:浅拷贝后数组中的引用类型跟随原数组变化。
- 深拷贝得到的数组,引用类型的地址不为原来的地址,即:其每层引用类型的地址都是新的地址,所有数据变化不与原来的关联。
- 引用赋值得到的数组,与原来的数组一致,即:list 和 listCopy 指向同一个地址,可以得到原数组的引用地址内的数据变化。
沙盒开发
核心功能
导入模块vm模块
主要内容
上下文
这个作为沙盒的运行主体(什么都要往里送)
context
1 | //把context包装成proxy对象,来捕捉一些操作 |
保护类
Proxy
Object
Function
Array
…
1 | //冻结内置对象(不包括console,globalThis) |
权限类
isMaster()
1 | // SANDBOX_ROOT该环境变量为永久master |
输入
这边是封装了一个exec的函数
1 | //沙盒执行超时时间 |
1 | module.exports.exec = (code) => { |
输出
直接用一个try{}包起来,万事大吉
道高一尺
1 | //防止沙盒逃逸 |