施小喵

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
前记:我没有参加阿里巴巴的前端笔试,至于原因==,就不说了。。现在为了参加百度的前端笔试,整理一下阿里的题目

1.数组的属性的考察,splice且切片arr.splice();

请选择以下语句的正确运行结果:
var a = [1,2,3];
a.splice(1,1,2,3,4);
console.log(a);
我的答案:[1,2,3,4,3],我的思路:splice(起始位置,结束位置,后序插入的元素1,插入元素位置2...)
正确答案:[1,2,3,4,3],哈哈,我是对的,不过我的解释错了!splice(起点,长度)/(起点,0,待插元素)/(起点,长度,替换元素)
补充:其实(起点,0,待插元素)只是(起点,长度,替换元素)的特例啦

1.一个参数
splice(起点位置); //默认删除到最后
eg :
var a = [1,2,3];
a.splice(1) ;// a就变成[1]
a.splice(-1); //返回的是[3],a变成[1,2]
a.splice(-2) ; //返回的是[2,3],a变成[1]
//当起点位置 <= -a.length的时候,全部返回
a.splice(-3) ; //返回的是[1,2,3],a变成[]
2.两个参数
splice(起始位置,长度)
eg :
var a = [1,2,3];
a.splice(0,2); //返回的是[1],a变成[2,3]
//当长度大于等于 arr.length - 起点位置 时,则默认切到最后
a.splice(1,10); //返回的是[2,3],a变成[1]
//当长度 <= 0 时,则返回的是空数组[]
a.splice( 1,0 ); //返回的是[],a为[1,2,3]
3.三个及以上参数
splice(起始位置,长度,替换元素1,替换元素2,替换元素3...)
var a = [1,2,3];
a.splice( 1,2 , 77); //返回的是[2,3],a变成[1,77]
解析:数组属性
属性:
    
var a = [1,2,3];
a.length 可以对a.length进行赋值 eg:a.length
= 2 => a = [1,3](当a.length设为0时,即可清空数组) (1)数组元素添加:   i.从尾部添加:a.push(33); ii.从头部添加:a.unshift(33); (2)数组元素删除: i.从尾部删除:a.pop(); ii.从头部删除:a.shift(); (3).数组的切片:splice a.连续删除元素:splice (起点,长度) eg: var a = [1,2,3,4,5,6]; a.splice(1,2) =>a = [1,4,5,6] b.插入元素:splice(起点,0,待插元素) eg: var a = [1,2,3,4,5,6]; a.splice(1,0,9,7) => a = [1,9,7,2,3,4,5,6]; c.替换元素:splice (起点,长度,替换元素) eg: var a = [1,2,3,4,5,6]; a.splice(2,2,"a"); => a =[1,2,a,5,6]; e.数组元素的连接: join eg: var a = [1,2,3,4]; a.join('-') => '1-2-3-4' f.排序;sort(参数) (参数为函数,即比较函数) (1)从小到大 eg: var a = [4,2,1]; a.sort(function(n1,n2){return n1-n2;}) => a = [1,2,4] (2)从大到小 eg: var a = [4,2,1]; a.sort(function(n1,n2){return n2-n1;}) => a = [4,2,1] g.数组连接:concat eg: var a = [1,6,3]; var b = ["dd","ff"]; var c = a.concat(b); => c = [1,6,3,"dd","ff"] var d = b.concat(a); => d = ["dd","ff",1,6,3] 注: 数组 a 和 b 不变

 2.关于XSS,下列说法正确的是:

a.XSS的全称是Cross site script

b.CSRF是xss的一种

c.从cookie中获取用户名并输出到页面的过程不会导致XSS

d.xss都是因为后端未对数据做安全检查造成的

正确答案是:a XSS: cross site script跨域脚本攻击,重点是 跨域 和 客户端执行。
XSS攻击包括:(1)Reflected XSS,基于反射的XSS攻击,主要依靠站点服务端返回脚本,那么返回的页面自然也会返回这段脚本,从而执行它。
(2)DOM-based or local XSS,基于DOM或本地的XSS攻击
(3)Stored XSS,基于存储的XSS攻击
对于XSS攻击的预防策略是: 对提交数据的过滤,另外还有一点是谨慎返回用户提交的内容。

b: CSRF( cross-site request forgery/跨站请求伪造),CSRF与XSS非常相似,但XSS是利用用户对当前网站的信任来发起攻击,而CSRF是利用网站对用户的信任来发起攻击。
对于CSRF攻击的对付策略有:
(1)检查报头中的Referer参数确保请求发自正确的网站(但是XHR请求可调用setRequestHeader方法来修改Referer报头)
(2)对于任何重要的请求都需要重新验证用户的身份;
(3)创建一个唯一的令牌(Token),将其存在服务器端的session中及客户端的cookie中,对任何请求,都检查二者是否一致。

3.变量声明提前及this,作用域的考察

var foo = 1;
function main()
{
   alert(foo);
   var foo = 2;
   alert( this.foo );
   this.foo = 3;      
}
main();
new main();
以下两种方式调用函数时,alert的结果?
undefined 、1 、undefined 、undefined
答案

 4.跨域问题?

a.  通过jsonp方式可以发送post请求其他域名下的接口
b.  通过iframe设置document.domain可以实现跨域
c.  可以利用flash的http请求,来处理跨域问题
d.  i.aliyun.com中可以ajax请求www.aliyun.com/info.jsom错误!超链接引用无效
关于跨域问题下面哪些说法是正确的
这题的答案不是我很确定,
但是a肯定是错误的,通过jsonp跨域,需要后台代码的配合,而且只能发送get请求,所以目前不是很推荐了,推荐的是cors(跨源资源共享)
b是正确的,但是前提是两者的一级域名是一样,二级域名不同的情况下,才能使用iframe的document.domain来实现跨域

d是不正确的,浏览器的同源策略限制就是: 一 :不能通过ajax的方法去请求不同源中的文档 。二 : 浏览器中不同的框架之间是不能进行js的交互操作的

c中flash跨域,没研究过,暂且默认正确吧

选b 、c
答案

5.css的单位

a . px是相对于显示器屏幕分辨率的相对长度单位
b . em是相对于body标签font-size的单位
c . rem 是相对于其父元素来设置字体大小的
d . pt(point)是印刷常用单位"磅",大小为1/72英寸
关于css中的单位以下哪些说法是正确的
这题以前还真没有注意过,
a .px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。
b.  em是定义文字大小的值,也就是文本中font-size属性的值。例如:定义某个元素的文字大小为12pt,那么,对于这个元素来说1em就是12pt。单位em的实际大小是受到字体尺寸的影响的。 
c . Rem和em一样也是一个相对单位,但是和em不同的是rem总是相对于根元素(如:root{}),而不像em一样使用级联的方式来计算尺寸。这种相对单位使用起来更简单。
d .pt(point)是印刷常用单位"磅",它是一个物理度量单位,1pt=1/72英寸(in).在CSS之外point是最常用的尺寸类型(可能这就是css支持point的原因)。


补充一个: 
百分比: %
以百分比为单位的长度值是基于具有相同属性的父元素的长度值。
答案

6.程序题,考察的属性访问器,可以实现数据的双向绑定

function A( params )
{
   params = params || {};
for ( var key in params )
  {
  Object.defineProperty( this ,key ,{
     get: function() {
       console.log("此时的key为"+key); //加上这一句就明白了,为什么a.x,a.y ,a.z 都是Z了,因为key值一直保持着z   return params[key];   },    enumerable : false
   });
  }   
}
var a = new A({
    "x" : "X",
    "y"  : "Y",
    "z"  : "Z"
})  
有上述程序,以下描述不正确的是:
a. 运行console.log(a.x)的结果是X
b. a.y()的运行结果是抛出TypeError:string is not a function的错误
c. 运行a.z = "XYZ"的结果是a对象的x属性的值更改为XYZ
这题考察的是ecma5中的property的特性改写:
答案分析:
答案a中的a.x的结果是Z,并且a.y,a.z的结果都是Z
答案b中的描述是正确的,
答案c中的a.z的值是不可更改的

 Object.defineProperty 方法提供了一种直接的方式来定义对象属性或者修改已有对象属性。其方法原型如下,

 Object.defineProperty(obj, prop, descriptor)

其中,

  • obj ,待修改的对象
  • prop ,带修改的属性名称
  • descriptor ,待修改属性的相关描述

descriptor 要求传入一个对象,其默认值如下,

/**
* @{param} descriptor
*/

{
configurable: false,
enumerable: false,
writable: false,
value: null,
set: undefined,  
get: undefined
}
  1. configurable ,属性是否可配置。可配置的含义包括:是否可以删除属性( delete ),是否可以修改属性的 writable、 enumerable 、 configurable 属性。
  2. enumerable ,属性是否可枚举。可枚举的含义包括:是否可以通过 for...in 遍历到,是否可以通过 Object.keys() 方法获取属性名称。
  3. writable ,属性是否可重写。可重写的含义包括:是否可以对属性进行重新赋值。
  4. value ,属性的默认值。
  5. set ,属性的重写器(暂且这么叫)。一旦属性被重新赋值,此方法被自动调用。
  6. get ,属性的读取器(暂且这么叫)。一旦属性被访问读取,此方法被自动调用。
在ECMAScript 3标准中,上面三个属性的值均为true且不可改:新建对象的property是可写的、可被枚举的、可删除的;而在ECMAScript 5标准中,可通过property的描述对象(property descriptor)来对这些属性进行配置和修改。
如果将property的值信息也作为property的属性来看的话,对象中的property拥有四个属性:value、writable、enumerable和configurable。

举例 :
var o = {}; Object.defineProperty(o, 'name', { value: 'erik' }); console.log(Object.getOwnPropertyDescriptor(o, 'name')); // Object {value: "erik", writable: false, enumerable: false, configurable: false} Object.defineProperty(o, 'age', { value: 26, configurable: true, writable: true }); console.log(o.age); // 26 o.age = 18; console.log(o.age); // 18. 因为age属性是可重写的 console.log(Object.keys(o)); // []. name和age属性都不是可枚举的 Object.defineProperty(o, 'sex', { value: 'male', writable: false }); o.sex = 'female'; // 这里的赋值其实是不起作用的 console.log(o.sex); // 'male'; delete o.sex; // false, 属性删除的动作也是无效的

不过还是有一点需要额外注意一下, Object.defineProperty() 方法设置属性时,属性不能同时声明访问器属性( set 和 get)和 writable 或者 value 属性。 意思就是,某个属性设置了 writable 或者 value 属性,那么这个属性就不能声明 get set 了,反之亦然。  

笔者注:

采用通常的方式定义对象:

var a = { x : 1, y : 2};

Object.getOwnPropertyDescriptor( a, "x");  // {value : 1,writable : true , enumerable : true , configurable : true}

var b = {};

Object.defineProperty( b , "x", {

  value : 1

});

Object.getOwnPropertyDescriptor(b , "x"); // {value : 1 ,writable : false, enumerable : false, configurable : false}

总结:传统方式下定义对象默认是可重写的,可枚举的,可删除,修改的

delete a.x ;// 返回true,a变成了{ y : 2}

delete b.x ; //返回false,b还是{ x : 1}
View Code

7.没有

8.问答题

编写一个js函数,传入仅包含数字的多维数组,返回拍平后的结果。
比如: 传入[1,[1,2]],返回[1,2,3]
好吧,我觉得这个题目考察的递归的算法思想,但是有一种很简便的方法,将其变成的字符串来操作!
哇偶!Amazing 字符串!
function flatten ( arr )
{
  var str = arr + "";
  return str.split(",");
}                        
amazing!的答案
function flatten ( arr )
{
  var returnArr = [];
  function getArr( newArr )
  {
    for ( var i = 0 ; i < newArr.length ; i++ )
    {
        if ( typeof newArr[i] === "number" )
        {
            returnArr.push( newArr[i] );
        }
        else 
        {
            getArr( newArr[i]);
        }
    }
  }
  getArr(arr);
  return returnArr;
} 
递归算法答案

9.document.write?

页面A的域名是:http://www.taobao.com, 页面B的域名是:http://www.tmall.com ,如果A使用iframe引用B,如何做到iframe的高度自适应(即B内容有多高,iframe就有多高)

10.js实现格式话输出,比如输入999999999,输出为999,999,999

11运用js设置cookie、读取cookie 、删除cookie

function setCookie( name ,value ,iDay)
{
   var oDate = new Date();
   oDate.setDate ( oDate.getDate() + iDay) ;
   document.cookie  = name + "=" +value +( iDay ? "; expires=" + oDate.toGMTString() : "");    
}
//多条cookie以'; '分隔
function getCookie( name )
{
    var arr = document.cookie.split("; ");
    for ( var i = 0 ; i < arr.length ; i++ )
    {
        var arr2 = arr[i].split("=");
        if ( arr2[0] == name )
        {
            return arr2[1];
        }
    }
    return ""
}          
读取cookie
function delCookie(name)
{
    var exp = new Date();
    exp.setTime(exp.getTime() - 1);
    var cval=getCookie(name);
    if(cval!=null)
    {
        document.cookie= name + "="+ cval+ ";expires="+exp.toGMTString();
    }
}
View Code

12.给出css,添加css完成一个样式设置,

13.编写一个js函数,parseQueryString,它的用途是把url参数解析为一个对象,例如:

var url = http : //witmax.cn/index.php?key=0&key1=1&key2=2

 

posted on 2015-09-26 18:14  施小喵  阅读(537)  评论(0编辑  收藏  举报