近期面试题总结【二】

--汉得前端

  • Js将get传递的url字符串(数据长度不定)转换成json

 

  1. 确保代码尽量简洁
  2. 尽量减少DOM访问
  3. 压缩代码
    要提供经过压缩的JavaScript页面,最有效的办法就是先用JavaScript压缩工具对你的代码压缩一下,这种压缩工具可以压缩变量和参数名称,然后提供因而获得的代码,使用了gzip压缩。

    要检查有没有未经压缩的任何jQuery插件,别忘了压缩。

    GZip压缩:其背后的想法是,缩短在浏览器和服务器之间传送数据的时间。缩短时间后,你得到标题是Accept-Encoding: gzip,deflate的一个文件。不过这种压缩方法有一些缺点。它在服务器端和客户端都要占用处理器资源(以便压缩和解压缩),还要占用磁盘空间。

    避免eval():虽然有时eval()会在时间方面带来一些效率,但使用它绝对是错误的做法。eval()导致你的代码看起来更脏,而且会逃过大多数压缩工具的压缩。

    加快JavaScript装入速度的工具:Lab.js

    有许多出色的工具可以加快JavaScript装入的速度。值得一提的一款工具是Lab.js。

    借助LAB.js(装入和阻止JavaScript),你就可以并行装入JavaScript文件,加快总的装入过程,此外,你还可以为需要装入的脚本设置某个顺序,那样就能确保依赖关系的完整性。此外,开发者声称其网站上的速度提升了2倍。

  4. 使用适当的CDN
    现在许多网页使用内容分发网络(CDN)。它可以改进你的缓存机制,因为每个人都可以使用它。它还能为你节省一些带宽。你很容易使用ping检测或使用Firebug调试那些服务器,以便搞清可以从哪些方面加快数据的速度。选择CDN时,要照顾到你网站那些访客的位置。记得尽可能使用公共存储库。

  5. 网页末尾装入JavaScript
    如果你关注用户,用户因互联网连接速度慢而没有离开你的网页,这是一个非常好的做法。易用性和用户放在首位,JavaScript放在末位。这也许很痛苦,但是你应该有所准备,有些用户会禁用JavaScript。可以在头部分放置需要装入的一些JavaScript,但是前提是它以异步方式装入。

  6. 异步装入跟踪代码
    这一点非常重要。我们大多数人使用谷歌分析工具(Google Analytics)来获得统计数据。这很好。现在看一下你把你的跟踪代码放在哪里。是放在头部分?还是说它使用document.write?然后,如果你没有使用谷歌分析工具异步跟踪代码,那也只能怪你自己。

    这就是谷歌分析工具异步跟踪代码的样子,我们必须承认,它使用DOM,而不是使用document.write,这可能更适合你。它可以在网页装入之前检测到其中一些事件,这非常重要。现在想一想这种情况,你的网页甚至还没有装入,所有用户都关闭了网页,已找到了解决页面浏览量错失的办法,

  7. Ajax优化
    Ajax请求对你网站的性能有重大影响。下面我介绍关于Ajax优化的几个要点。

    缓存你的ajax

    先看一下你的代码。你的ajax可以缓存吗?是的,它依赖数据,但是你的ajax请求大多应该可以缓存。在jQuery中,你的请求在默认情况下已被缓存,不包括script和jsonp数据类型。

    针对Ajax请求使用GET

    POST类型请求要发送两个TCP数据包(先发送标题,然后发送数据)。GET类型请求只需要发送一个数据包(这可能取决于你的cookie数量)。所以,当你的URL长度不到2K,你又想请求一些数据时,不妨使用GET。

    使用ySlow

    语言层次方面

    循环

    循环是很常用的一个控制结构,大部分东西要依靠它来完成,在JavaScript中,我们可以使用for(;;),while(),for(in)三种循环,事实上,这三种循环中for(in)的效率极差,因为他需要查询散列键,只要可以就应该尽量少用。for(;;)和while循环的性能应该说基本(平时使用时)等价。

    而事实上,如何使用这两个循环,则有很大讲究。我在测试中有些很有意思的情况,见附录。最后得出的结论是:如果是循环变量递增或递减,不要单独对循环变量赋值,应该在它最后一次读取的时候使用嵌套的++或--操作符。如果要与数组的长度作比较,应该事先把数组的length属性放入一个局部变量中,减少查询次数。

    举例,假设arr是一个数组,最佳的遍历元素方式为:

    for(var i=0, len = arr.length;i0;i--){...}局部变量和全局变量

    局部变量的速度要比全局变量的访问速度更快,因为全局变量其实是全局对象的成员,而局部变量是放在函数的栈当中的。

  8. 不使用Eval(ps:eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码)
    使用eval相当于在运行时再次调用解释引擎对内容进行运行,需要消耗大量时间。这时候使用JavaScript所支持的闭包可以实现函数模版(关于闭包的内容请参考函数式编程的有关内容)

    减少对象查找

    因为JavaScript的解释性,所以a.b.c.d.e,需要进行至少4次查询操作,先检查a再检查a中的b,再检查b中的c,如此往下。所以如果这样的表达式重复出现,只要可能,应该尽量少出现这样的表达式,可以利用局部变量,把它放入一个临时的地方进行查询。

    这一点可以和循环结合起来,因为我们常常要根据字符串、数组的长度进行循环,而通常这个长度是不变的,比如每次查询a.length,就要额外进行一个操作,而预先把var len=a.length,则就少了一次查询。

    字符串连接

    如果是追加字符串,最好使用s+=anotherStr操作,而不是要使用s=s+anotherStr。

    如果要连接多个字符串,应该少使用+=,如:s+=a;s+=b;s+=c;应该写成:s+=a + b + c;

    而如果是收集字符串,比如多次对同一个字符串进行+=操作的话,最好使用一个缓存。怎么用呢?使用JavaScript数组来收集,最后使用join方法连接起来,如下:

  9. 在JavaScript编程中所找到的提高JavaScript运行性能的一些方法,其实这些经验都基于几条原则:

    直接拿手头现成的东西比较快,如局部变量比全局变量快,直接量比运行时构造对象快等等,尽可能少地减少执行次数,比如先缓存需要多次查询的,尽可能使用语言内置的功能,比如串链接,尽可能使用系统提供的API,因为这些API是编译好的二进制代码,执行效率很高,同时,一些基本的算法上的优化,同样可以用在JavaScript中,比如运算结构的调整,这里就不再赘述了,但是由于JavaScript是解释型的,一般不会在运行时对字节码进行优化,所以这些优化仍然是很重要的.

 

  • js面向对象有哪几种方式(二面有问到)

 

  • js关键字

 

  • prototype属性

 

  • 浏览器不兼容问题

汉得二面(还是偏基础):

  • js验证码实现,包括噪点,
  • canvas charts
  • canvas渲染
  • es6创建js对象
     
  • typescript基础数据类型有什么
  • git操作
  • 需要学习vue,react
  • 技术有些老旧过时,应多看es6以上标准
  • angular模块、组件、服务的关系
  • 原生安卓接触过吗
  • DOM&BOM区别
  • js操作数组
  • nodejs写服务端
  •  

 

 

--其它公司

  • 软件测试流程

--其它地方总结  

来自https://www.cnblogs.com/sun927/p/5663820.html

 

  • JavaScript中如何检测一个变量是一个String类型?请写出函数实现

 typeof(obj) == 'string'

obj.constructor == String;

  • 为什么利用多个域名来存储网站资源会更有效?

确保用户在不同地区能用最快的速度打开网站,其中某个域名崩溃用户也能通过其他郁闷访问网站

  • 请尽可能详尽的解释AJAX的工作原理。
    创建ajax对象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp))
    判断数据传输方式(GET/POST)
    打开链接 open()
    发送 send()
    当ajax对象完成第四步(onreadystatechange)数据接收完成,判断http响应状态(status)200-300之间或者304(缓存)执行回调函数
  • 什么是FOUC?你如何来避免FOUC?
    由于css引入使用了@import 或者存在多个style标签以及css文件在页面底部引入使得css文件加载在html之后导致页面闪烁、花屏
    用link加载css文件,放在head标签里面
  • 网页中实现一个计算当年还剩多少时间的倒数计时程序,要求网页上实时动态显示“××年还剩××天××时××分××秒”
    var oDate = new Date();
    var oYear = oDate.getFullYear();

    var oNewDate = new Date();
    oNewDate.setFullYear(oYear, 11, 31, 23, 59, 59);
    var iTime = oNewDate.getTime()-oDate.getTime();

    var iS = iTime/1000;
    var iM = oNewDate.getMonth()-oDate.getMonth();
    var iDate =iS

 

--简历技术补充了解

  • 析构函数

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值