历经4个月的奋战,终于找到一本好书

本书从基础知识出发,逐步引导读者理解并掌握编译器设计的核心概念和技术。适合缺乏经验的新手,通过实践操作加深对词法分析、语法分析等编译原理的理解。

《编译器设计之路》-----书的名字

从4月份开始迷上编译原理,从一头雾水到拨云见日,中间历经的艰辛实在是难于细表。不过幸运的是终于找到了一本好书。

什么编译原理龙书虎书鲸书,都是一些有经验的人看的,新手根本看不进去。连基本数据结构都设计不出来的人,你跟他讲什么词法分析,自动机,语法分析,LL(1),LR,代码优化什么的,都是浪费唇舌,不如一步步设计数据结构,设计基本算法,熟悉基本流程,设计简单文法,实现简单的小语言,提供源码分析;而这一切正是这本书的优点所在,不要大谈特谈什么高深理论,先让人入门再说,龙说适合入门之后提高阶段看,对于连Lexer都写不好的人,实在是高深莫测。

-------------------------------

后记:

当时觉得好,只是因为但是水平太渣了。现在我已经不觉得那本书有多好了,不过一本入门书。不过连编译器的基本数据结构都不会设计的人可以看看。高手请忽略我

在 JavaScript 中,实现对象深度拷贝的方法有以下几种: 1. **JSON 序列化和反序列化**:利用 `JSON.stringify()` 和 `JSON.parse()` 可以实现对象的深拷贝。不过该方法存在一定的限制,例如无法复制函数和原型链等,同时也不能复制循环引用对象。示例代码如下: ```javascript let obj = { foo: "bar", arr: [1, 2, 3], nestedObj: { a: 1, b: 2 } }; let copy = JSON.parse(JSON.stringify(obj)); ``` 2. **手动实现深拷贝函数(递归方式)**:通过递归实现对对象及其嵌套属性的深度复制。示例代码如下: ```javascript function deepCopy(obj) { let copy = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (typeof obj[key] === "object") { copy[key] = deepCopy(obj[key]); } else { copy[key] = obj[key]; } } return copy; } ``` 3. **利用循环和递归的方式**:可以定义一个函数,结合循环和递归对对象进行深度克隆。示例代码如下: ```javascript function deepClone(obj, newObj) { var newObj = newObj || {}; for (let key in obj) { if (typeof obj[key] === 'object') { newObj[key] = (obj[key].constructor === Array) ? [] : {}; deepClone(obj[key], newObj[key]); } else { newObj[key] = obj[key]; } } return newObj; } ``` 4. **使用第三方库**:使用第三方库如 lodash、underscore 等,可以快速、简单地实现对象的深拷贝。以 lodash 为例,示例代码如下: ```javascript const _ = require('lodash'); let obj = { foo: "bar", arr: [1, 2, 3], nestedObj: { a: 1, b: 2 } }; let copy = _.cloneDeep(obj); ``` 5. **使用 `Object.defineProperties`**:使用 `Object.defineProperties(newObj, Object.getOwnPropertyDescriptors(oldObj))`,可以拷贝 `function`、`Symbol`、`Set`、`Map` 类型数据 [^4]。 6. **ES6 扩展运算符**:虽然它通常用于浅拷贝,但在一些简单对象的情况下可以结合其他逻辑实现深拷贝的部分效果。不过对于复杂的嵌套对象,还是需要结合递归等方法。示例代码如下: ```javascript let obj = { a: 1, b: { c: 2 } }; let newObj = { ...obj }; // 对于嵌套对象,还需进一步处理 if (typeof newObj.b === 'object') { newObj.b = { ...newObj.b }; } ``` 7. **`Object.assign()` 方法**:`Object.assign()` 方法可以将多个对象的属性复制到目标对象中,但通常用于浅拷贝,对于嵌套对象不能实现深度复制。如果要用于深拷贝,需要结合其他方法处理嵌套对象。示例代码如下: ```javascript let obj = { foo: "bar", arr: [1, 2, 3], nestedObj: { a: 1, b: 2 } }; let copy = Object.assign({}, obj); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值