JS笔试题(1)【阿里巴巴】

来源:互联网 发布:马泰尔家族知乎 编辑:程序博客网 时间:2024/05/03 02:21

1、请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。

答案:

Array.prototype.getRepeat=function(){var newArr=[];for (var i = 0; i < this.length; i++) {for (var j = i+1; j < this.length; j++) {if (this[i]===this[j]) {newArr.push(this.splice(j--,1)[0]);}}}return newArr;}console.log(['a','b','c','a','c','d','b','e'].getRepeat()); //["a", "b", "c"]

说明:由于slice返回的是数组,所以加[0]将元素取出来
拓展:若返回值是去重后的新数组。

Array.prototype.getRepeat=function(){var newArr=[];for (var i = 0; i < this.length; i++) {for (var j = i+1; j < this.length; j++) {if (this[i]===this[j]) {newArr.push(this.splice(j,1)[0]);}}}return this;}console.log(['a','b','c','a','c','d','b','e'].getRepeat()); //["a", "b", "c"]
2、请填充代码,使mySort()能使传入的参数按照从小到大的顺序显示出来。

function mySort() {
    var tags = new Array();//使用数组作为参数存储容器
    __________________
    return tags;//返回已经排序的数组

var result = mySort(50,11,16,32,24,99,57,100);//传入参数个数不确定
console.info(result);//显示结果

答案:

function mySort() {    var tags = new Array();//使用数组作为参数存储容器    if(arguments.length){tags=[...arguments].slice(0);tags.sort(function(item1,item2){return item1-item2;})}    return tags;//返回已经排序的数组} var result = mySort(50,11,16,32,24,99,57,100);//传入参数个数不确定console.info(result);//显示结果
说明:tags=[...arguments].slice(0);是利用ES6的扩展运算符将实参转换为数组并复制
3、javascript里面的继承怎么实现,如何避免原型链上面的对象共享。
答案:通过原型链实现继承,借用构造函数避免原型对象共享
继承:

function SuperType(){      this.property=true;  }      SuperType.prototype.getSuperValue=function(){      return this.property;  }      function SubType(){      this.subproperty=false;  }          //继承了SuperType  SubType.prototype=new SuperType();      SubType.prototype.getSubValue=function(){      return this.subproperty;  }      var instance=new Son();  alert(instance.getSuperValue());       //true      alert(instance instanceof Object);     //true  alert(instance instanceof SuperType);  //true  alert(instance instanceof SubType);    //true
以上代码定义了两个类型:SuperType和SubType。每个类型分别有一个属性和方法。它们主要区别就是SubType继承了SuperType,而这继承是通过创建SuperType新实例,并将这个新实例赋给SubType.prototype实现的。实现的本质就是重写原型对象,代之以新类型的实例。
原型链的问题:原型对象共享
解决方法:在构造函数中定义属性,而不是在原型中定义属性
4.请问在javascript程序中,alert(undefined==null)的输出结果是
A、null
B、undefined
C、true
D、false
以上答案都不正确

答案:C 
说明:==是true ===是false
5、下面有关浏览器中使用js跨域获取数据的描述,说法错误的是?
A、域名、端口相同,协议不同,属于相同的域
B、js可以使用jsonp进行跨域
C、通过修改document.domain来跨子域
D、使用window.name来进行跨域

答案:A
说明:域名、端口、协议三者必须相同,才能称为相同的域
1.CORS
CORS(Corss-Origin Resource Sharing,跨资源共享),基本思想是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应的成功或失败。即给请求附加一个额外的Origin头部,其中包含请求页面的源信息(协议、域名和端口),以便服务器根据这个头部决定是否给予响应。 

2.document.domain 
将页面的document.domain设置为相同的值,页面间可以互相访问对方的JavaScript对象。 
注意:不能将值设置为URL中不包含的域;
松散的域名不能再设置为紧绷的域名。
3.图像Ping

  var img=new Image();   img.onload=img.onerror=function(){   ... ...   }   img.src="url?name=value"; 
请求数据通过查询字符串的形式发送,响应可以是任意内容,通常是像素图或204响应。 
图像Ping最常用于跟踪用户点击页面或动态广告曝光次数。 
缺点:只能发送GET请求;
无法访问服务器的响应文本,只能用于浏览器与服务器间的单向通信。 
4.Jsonp

var script=document.createElement("script"); script.src="url?callback=handleResponse"; document.body.insertBefore(script,document.body.firstChild);

JSONP由两部分组成:回调函数和数据
回调函数是接收到响应时应该在页面中调用的函数,其名字一般在请求中指定。
数据是传入回调函数中的JSON数据。
优点:能够直接访问响应文本,可用于浏览器与服务器间的双向通信。  
缺点: JSONP从其他域中加载代码执行,其他域可能不安全;
难以确定JSONP请求是否失败。 

5.Comet
Comet可实现服务器向浏览器推送数据。
Comet是实现方式:长轮询和流
短轮询即浏览器定时向服务器发送请求,看有没有数据更新。
长轮询即浏览器向服务器发送一个请求,然后服务器一直保持连接打开,直到有数据可发送。发送完数据后,浏览器关闭连接,随即又向服务器发起一个新请求。
其优点是所有浏览器都支持,使用XHR对象和setTimeout()即可实现。
流即浏览器向服务器发送一个请求,而服务器保持连接打开,然后周期性地向浏览器发送数据,页面的整个生命周期内只使用一个HTTP连接。
6.WebSocket
WebSocket可在一个单独的持久连接上提供全双工、双向通信。
WebSocket使用自定义协议,未加密的连接时ws://;加密的链接是wss://。
  var webSocket=new WebSocket("ws://");   webSocket.send(message);   webSocket.onmessage=function(event){        var data=event.data;         ... ....   }
注意:必须给WebSocket构造函数传入绝对URL; 
WebSocket可以打开任何站点的连接,是否会与某个域中的页面通信,完全取决于服务器; WebSocket只能发送纯文本数据,对于复杂的数据结构,在发送之前必须进行序列化JSON.stringify(message))。
优点:在客户端和服务器之间发送非常少的数据,减少字节开销。
6、在文件/home/somebody/workspace/somemodule.js中第一行引用了一个模块:require(‘othermodule‘),请问required 的查找模块的顺序 ?
A./home/somebody/workspace/node_modules/othermodule/index.js 
B./home/somebody/workspace/node_modules/othermodule.js 
C.CORE MODULES named othermodule 
D./home/somebody/node_modules/othermodule/index.js

A、C D A B
B、C B D A
C、C B A D
D、C D B A

答案:C
说明:(node.js知识)
(1)首先,Node在当前目录下查找package.json(CommonJS包规范定义的包描述文件),通过JSON.parse()解析出包描述对象,从中取出main属性指定的文件名进行定位。如果文件缺少扩展名,将会进入扩展名分析的步骤。
(2)而如果main属性制定的文件名错误,或者压根没有package.json文件,Node会将index当做默认文件名,然后依次查找index.js、index.node、index.json.
(3)如果在目录分析的过程中没有定位成功任何文件,则自定义模块进入下一个模块路径进行查找。如果模块路径数组都被遍历完毕,依然没有查找到目标文件,则会抛出查找失败异常。   
按照上面的思路,首先应该查找package.json文件,看看里面有没有核心模块,应该是C最先,othermodule不是核心模块,那么接着应该进入扩展名分析的步骤,就应该是查找othermodule. js,对应B,紧接着就是以index为默认文件名,也就是A,再接下来就是上一个文件目录D了
7、编写一个JavaScript函数,输入指定类型的选择器(仅需支持id,class,tagName三种简单CSS选择器,无需兼容组合选择器)可以返回匹配的DOM节点,需考虑浏览器兼容性和性能。
/**
* @param selector {String} 传入的CSS选择器。
* @return {Array}
*/ 
var query = function(selector){ 
return [];//返回查找到的节点数组
}

答案:
var query = function(selector){    var arr = [];    if(/^#/.test(selector)){ //匹配id选择器        arr.push(document.getElementById(selector.slice(1));    }else if(/^\./.test(selector)){ //匹配类选择器        var values = document.getElementsByClassName(selector.slice(1);        if(values.length != 0){ //判断是否匹配到                 arr.push(...values);       }    }else{ //匹配标签选择器        var values = document.getElementsByTagName(selector);        if(values.length != 0){ //判断是否匹配到           arr.push(...values);       }    }    return arr;//返回查找到的节点数组}
8、请编写一个JavaScript 函数toRGB,它的作用是转换CSS中常用的颜色编码。 
要求:
alert(toRGB("#0000FF"));   // 输出 rgb(0, 0, 255)
alert(toRGB("invalid"));   // 输出 invalid
alert(toRGB("#G00"));      // 输出 #G00

答案:
function toRGB(color){var reg=/^#[0-9a-f]{6}/i;return reg.test(color)?'rgb('+color.slice(1).replace(/[0-9a-f]{2}/ig,function($0){return parseInt($0,16)+',';}).slice(0,-1)+')':color;}console.log(toRGB("#00ff00"));
说明:利用字符串的replace方法,在回调函数中将每次匹配到的2位十六进制数转换为十进制,slice(0,-1)是去掉最后一个多余的逗号

原创粉丝点击