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

xiaoxiao2021-02-28  91

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"));0){ return parseInt($0,16)+','; }).slice(0,-1)+')':color; } console.log(toRGB("#00ff00"));

 

说明:利用字符串的replace方法,在回调函数中将每次匹配到的2位十六进制数转换为十进制,slice(0,-1)是去掉最后一个多余的逗号

 

转载请注明原文地址: https://www.6miu.com/read-31462.html

最新回复(0)