前端面试题2019.02.28
1、用 js 写出几种去除 string 空格的方法。
(1)、使用js循环
//供使用者调用 function trim(s){ return trimright(trimleft(s)); } //去掉左边的空白 function trimleft(s){ if(s == null) { return ""; } var whitespace = new string(" \t\n\r"); var str = new string(s); if (whitespace.indexof(str.charat(0)) != -1) { var j=0, i = str.length; while (j < i && whitespace.indexof(str.charat(j)) != -1){ j++; } str = str.substring(j, i); } return str; } //去掉右边的空白 function trimright(s){ if(s == null) return ""; var whitespace = new string(" \t\n\r"); var str = new string(s); if (whitespace.indexof(str.charat(str.length-1)) != -1){ var i = str.length - 1; while (i >= 0 && whitespace.indexof(str.charat(i)) != -1){ i--; } str = str.substring(0, i+1); } return str; }
(2)使用正则
string.prototype.trim = function()
{
return this.replace(/(^\s*)|(\s*$)/g, "");
}
string.prototype.ltrim = function()
{
return this.replace(/(^\s*)/g, "");
}
string.prototype.rtrim = function()
{
return this.replace(/(\s*$)/g, "");
}
//去左空格;
function ltrim(s){
return s.replace(/(^\s*)/g, "");
}
//去右空格;
function rtrim(s){
return s.replace(/(\s*$)/g, "");
}
//去左右空格;
function trim(s){
return s.replace(/(^\s*)|(\s*$)/g, "");
}
(3)使用jq
$trim(str)
2、如何获取浏览器url中查询字符串中的参数?
function getquery(name) { var reg = new regexp("(^|&)"+ name +"=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if (r!=null) return unescape(r[2]); return null; }
3、比较 typeof 与 instanceof ?
相同点:都常用来判断一个变量是否为空,或者是什么类型的。
不同点:tyoeof返回字符串用来说明变量的数据类型,instanceof 返回布尔值,用来判断变量是否属于某个对象的实例。
4、如何理解闭包?
一般指可以访问另一个函数作用域变量的的函数。当一个变量想要反复调用,又想避免全局污染的情况下,会使用到闭包。缺点是所占用的空间不容易被释放,需要手动清除。
5、jquery的几种选择器分别是?
(1)、基本选择器
* #id element .class
(2)、层次选择器
ancestor descendant parent > child prev + next prev ~ siblings
(3)、基本过滤器选择器
:first :last :not :even :odd :eq :gt :lt :header :animated
(4)、内容过滤器选择器
:contains :empty :has :parent
(5)、可见性过滤器选择器
(6)、属性过滤器选择器
(7)、子元素过滤器选择器
(8)、表单选择器
(9)、表单过滤器选择器
具体可参考
6、浏览器的内核分别是什么?
ie内核:trident
firefox内核:gecko
safari内核:webkit
opera内核:presto=>blink
chrome内核:blink
7、浏览器本地存储?
cookie、localstorag、sessinstorage。
localstorage读取数据需要在 协议、主机名和端口相同的情况下,而sessionstorage在满足上面的条件时还要求在同一窗口(标签页)。
cookie默认关闭窗口清除数据,可通过setcookie设置存储时间。
localstorage永久存储,可设置保存时间。
sessionstorage 会话级存储,关闭页面自动销毁。相当于cookie的默认。
cookie是数据会在蔑称发送http请求的时候,同时发送给服务器。 而localstorag、sessinstorage 则不会。
8、你了解的web攻击技术?
(1)、xss跨站攻击技术:主要是攻击者往网页里嵌入恶意脚本,或者通过改变html元素属性来实现攻击,主要原因在于开发者对用户的变量直接使用导致进入html中会被直接编译成js,通常的get请求通过url来传参,可以在url中传入恶意脚本,从而获取信息,解决方法:特殊字符过滤。
(2)、sql注入攻击:主要是就是通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的sql命令,比如select * from test where username="wuxu" or 1=1,这样会使用户跳过密码直接登录,具体解决方案:1、特殊字符过滤,不要用拼接字符串的方法来凑sql语句。2、对sql语句进行预编译,比如java的preparedstatement。3、关闭错误信息,攻击者可能会通过不断的尝试来得到数据库的一些信息,所以关闭错误信息变得重要起来。4、客户端对数据进行加密,使原来传进来的参数因为加密而被过滤掉。5、控制数据库的权限,比如只能select,不能insert,防止攻击者通过select * from test ;drop tables这种操作。
(3)、远程目录包含攻击,原理就是注入一段用户能控制的脚本或代码,并让服务端执行。比如php中的include($filename),而此filename由用户传入,用户即可传入一段恶意脚本,从而对服务其造成伤害,解决方法:当采用文件包含函数的时候,不应动态传入,而应该有具体的文件名,如果动态传入,要保证动态变量不被用户所控制。
(4)、会话劫持:这是一种通过获取用户session id后,使用该session id登录目标账号的攻击方法,此时攻击者实际上是使用了目标账户的有效session。会话劫持的第一步是取得一个合法的会话标识来伪装成合法用户,因此需要保证会话标识不被泄漏,通俗一点就是用户在登录时,唯一标示用户身份的session id被劫持,使得攻击者可以用这个session id来进行登录后操作,而攻击者主要是通过 窃取:使用网络嗅探,xss攻击等方法获得。而第一种方式网络嗅探,我们可以通过ssl加密,也就是https来对报文进行加密,从而防止报文被截获,而第二种方式xss攻击,方式在第一种已经给出,不再赘述。此外通过设置httponly。通过设置cookie的httponly为true,可以防止客户端脚本访问这个cookie,从而有效的防止xss攻击,还有就是设置token验证。关闭透明化session id。透明化session id指当浏览器中的http请求没有使用cookie来存放session id时,session id则使用url来传递。
9、iframe的优缺点?
优点:(1)、能够完整展示嵌入网页。(2)、页面和程序分类(3)、一个iframe可多次调用,代码复用性高。(4)、加载第三方内容如:图标、广告等可使用 iframe 解决。
缺点:(1)、兼容性差,在移动端无法完全显示。(2)、结构混乱,多个框架会出现滚动条,用户体验差。(3)、会产生多个页面,不利于管理。(4)、会增加服务器的 http 请求。
10、编写一个方法,去掉一个数组的重复元素。
function unique(arr){ //set数据结构,它类似于数组,其成员的值都是唯一的 return array.from(new set(arr)); // 利用array.from将set结构转换成数组 }