作者丨辉哥(知乎ID:hui-g-5-19)
这是一篇反面教材,希望也能引起部分程序员的警惕。
最近半个月时间,经过几次面试,差不多已经对自己有了定位————距离腾讯T3岗位还是有一点距离。
因为在一家小公司呆的习惯了(6年),公司没有人在技术层面超过我,作为技术核心,感觉自己很牛,活在一个小圈子里面,几乎不会主动去了解新技术,甚至对php以及js本身都不能算精通。
所以变故出现的时候,我才发现自己的技术脱节有多厉害,虽然之前的面试并没有做专门的准备,但是与6年前找工作的情形相比,差距非常的大。
下面是我整理的一部分遇到的面试题,我尽量用我所知道的知识来进行陈述,肯定会有很多误解以及遗漏,希望大家能够指正。
公司1:
1、mysql_ral_scap_stringmysql_scap_string有什么本质的区别,有什么用处,为什么被弃用?
答:mysql_ral_scap_string需要预先连接数据库,并可在第二个参数传入数据库连接(不填则使用上一个连接)
两者都是对数据库插入数据进行转义,但是mysql_ral_scap_string转义时,会考虑数据库连接的字符集。
它们的用处都是用来能让数据正常插入到数据库中,并防止sql注入,但是并不能做到%防止sql注入。
再问:为什么不能%防止?
答;因为客户端编码以及服务器端编码不同,可能产生注入问题,但是其实这种场景不多见。
继续答:被弃用的原因是官方不再建议使用mysql_xx的数据库操作方式,建议使用pdo和mysqli,因为不管从性能跟安全来看,mysqli都比mysql要好。
衍生出来的问题是mysqli的连接复用(持久化)问题,这一块我并没有答好。
2、什么是内存泄漏,js内存泄漏是怎么产生的?
答:内存泄漏是因为一块被分配内存既不能被使用,也不能被回收,直到浏览器进程结束。
产生泄漏的原因是闭包维持函数内局部变量,不能被释放,尤其是使用闭包并存在外部引用还stIntrval的时候危害很大。
备注:我觉得这块回答并不好,因为肯定不是闭包的原因。
我查了一下资料,从比较浅的方位来再回答一下这个问题:
产生泄漏的原因有好几种:
(1)页面元素被删除,但是绑定在该元素上的事件未被删除;
(2)闭包维持函数内局部变量(外部不可控),使其得不到释放;
(3)意外的全局变量;
(4)引用被删除,但是引用内的引用,还存在内存中。
从上述原因上看,内存泄漏产生的根本原因是引用无法正确回收,值类型并不能引发内存泄漏。
对于每个引用,都有自己的引用计数,当引用计数归零或被标记清除时,js垃圾回收器会认为该引用可以回收了。
3、什么是闭包,跟原型链、作用域链有什么关联
答:闭包是指存在于一个作用域链分支的函数域内的函数,该函数可以向上逐级访问作用域链上的变量,直到找到为止。当闭包存在外部引用时,js会维持闭包自身以及所在函数作用域链的内存状态。
备注:这个是我自己瞎说的。
继续答:跟原型链没有什么关联,函数的原型(prototyp)主要用于实现继承,原型链可用于追溯继承关系,与作用域链类似,都是向上逐级访问属性,直到被找到,原型链的顶层是null,可以理解为所有的objct都继承至null,所以null的类型是objct。
继续答:作用域链可以看作是一个树形结构,由根节点window向下扩散,下层节点可以访问上层节点,但是上层节点无法访问下层节点,产生闭包的函数作用域属于节点中的一个,向下扩散后闭包函数产生叶子节点,叶子节点之间可以互相访问,当访问的变量在叶子节点中无法找到时,向上层节点查找,直到被找到为止,这个概念有点类似原型链上的属性查找。
4、一台电脑配置无限好,可以同时打开多少个网页
答:-0=(端口数)
5、ip地址能被伪造吗?