面试题总结

本文深入探讨了TCP/IP连接过程、头文件的作用、JavaScript正则表达式、URL解析以及清除数组重复元素的方法。此外,还介绍了JavaScript实现10000以内3和5的倍数之和、回文数字检测以及AJAX的交互模型。同时,解释了JSONP的工作原理和内存泄露的概念,最后讨论了跨域问题的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. TCP/IP 建立连接的过程

2.头文件的作用是什么?

3.Js正则表达式

4.URL解析函数,将URL转化成对象形式。

5.请编写一个JavaScript函数,实现清除数据中重复的元素

求 10000 以内 3 和 5 的倍数和,写出JavaScript实现函数

回文数字

transitionEnd

解释JSONP的工作原理。

什么是内存泄露,那些操作会造成内存泄露?

 ajax 的过程是怎样的?


1. TCP/IP 建立连接的过程

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

  1. 第一次握手:建立连接时,客户端发送连接请求到服务器,并进入SYN_SEND状态,等待服务器确认;
  2. 第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答,此时服务器进入SYN_RECV状态;
  3. 第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认,客户端和服务器进入通信状态,完成三次握手

2.头文件的作用是什么?

答:

一、通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。

二、头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。

3.Js正则表达式

i 大小写不敏感

g 全局匹配,查找所有匹配而非在第一个匹配后停止

m 执行多行匹配

10进制转换为其他进制的字符串 Number.toString

Number(10进制数字).toString(36)转36进制数,最大

Number(10进制数字).toString(16)

Number(10进制数字).toString(8)

Number(10进制数字).toString(2)

生成一个用不重复的ID

                     function GenNonDuplicateID(randomLength){

                      return Number(Math.random().toString().substr(3,randomLength) + Date.now()).toString(36)

                     }

                         //Date.now返回当前日期和时间的Date对象与'1970/01/01 00:00:00'之间的毫秒值(北京时间的时区为东8区,起点时间实际为:'1970/01/01 08:00:00')

                     //GenNonDuplicateID()将生成 rfmipbs8ag0kgkcogc 类似的ID

                     var id =  GenNonDuplicateID();

                     console.log(id);

4.Ajax 编程中所使用的Javascript对象是什么(XMLHttpRequest)?

怎么去创建它(variable = new XMLHttpRequest())?

var xmlhttp;

if (window.XMLHttpRequest)

{

xmlhttp=new XMLHttpRequest();

}

else

{

xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

}

如何取服务器响应给客户端的XML对象信息使用ajax

4.URL解析函数,将URL转化成对象形式。

统一资源定位系统

function parseQueryString(url) {

                       // 先将字符串通过 split 方法,以 "?" 为分割符将其分割成数组;

                       // 该数组有两个元素,第一个为空字符串,第二个为 url 参数字符串

                       let arr = url.split('?')

                       // 将参数字符串以 "&" 符号为分隔符进行分割

                       let params = arr[1].split('&')

                       // 定义一个数组用于存储参数

                       let obj = {} 

                       // 通过循环将参数以键值对的形式存储在变量 obj 中

                       for (let i = 0; i < params.length; i++) {

                         let ams = params[i].split('=')

                         obj[ams[0]] = arr_params[1]

                       }

                    

                       return obj

                     }

                     console.log(parseQueryString('?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=splice'))

深拷贝A B 值相等,但改动 A 并不会影响 B

浅拷贝一般指的是基本类型的复制

var arr1 = new Array(12,23,34)

Var arr2 = arr1;//这就是一个最简单的浅拷贝

这是最简单的浅拷贝,因为,只是把arr1的地址拷贝的一份给了arr2,并没有把arr1的数据拷贝一份。所以,拷贝的深度不够

深拷贝一般指引用类型的拷贝,把引用类型的值也拷贝出来

const obj1 = {

                    name:'小一',

                    age:20,

                    color:['yellow','green'],

                    say(){

                        console.log(1)

                    }

                };

function deepClone(obj){

           var _obj = JSON.stringify(obj)//将一个 JavaScript 对象或值转换为 JSON 字符串

           var objClone = JSON.parse(_obj)//将返回 JavaScript 数组,而不是 JavaScript 对象。

            return objClone

        }   

         //深拷贝:A 与 B 值相等,但改动 A 不会影响 B。

        const obj3 = deepClone(obj1)

        obj3.name = '小三'

        console.log('obj1',obj1)

        console.log('obj3',obj3)

5.请编写一个JavaScript函数,实现清除数据中重复的元素

       function del(arr){

                         for(var i=0;i<arr.length;i++){

                             for(var j=i+1;j<arr.length;j++){

                                    if(arr[i]===arr[j]){

                                         arr.splice(j,1);// splice方法可以用来对js的数组进行删除,添加,替换等操作参数1下标值从j下标开始 参数2 删除几个元素

                                     }

                                 }

                             }

                       return arr;

                     }

                     var arr=[1,2,3,4,5,2,6,1];

                     var arrs=[4,1,2,2,3,4,5,2,6,1,7];

                     function test(arrs){

                            return Array.from(new Set(arrs))

                     }

                     del(arr);

                     var s = test(arrs);

                     console.log(arr);//[1,2,3,4,5,6]

                     console.log(s);

求 10000 以内 3 和 5 的倍数和,写出JavaScript实现函数

var sum = 0;

                     // sum = 3%3

                     for(var a = 0 ; a<=10; a++){

                            if(a%3==0 || a%5==0){

                                   sum+=a;

                            }

                     }

                     console.log(sum);//234168

回文数字

//对称数的逆序数等于自身:回文数字

                            let isSymmetry = function(num) {

                                  nInversionNumber = +(num.toString().split("").reverse().join(""));

                                  if (num === nInversionNumber && num >= 10) {

                                         return true;

                                  }

                                  return false;}

       //1-number之间的对数

       let arr = [],number = 10000;

       for (let j = 0; j < number; j++) {

              isSymmetry(j) ? arr.push(j) : false

       }

       console.log(arr, '返回对数数组')

transitionEnd

事件什么时候触发?它会冒泡吗?怎么冒泡的,冒泡到哪里?

transitionend 事件在 CSS 完成过渡后触发 。如果过渡在完成前移除,过渡事件将不被触发

会冒泡,冒泡到父级

解释JSONP的工作原理。

json 是一种数据格式

jsonp 是一种数据调用的方式,

联系 带callback的json就是jsonp

工作原理:

jsonp之所以能跨域,是因为他并不是发送ajax请求,并不是利用XMLHTTPRequest对象和服务端进行通信,利用的是动态创建的script标签,而script标签是没有同源策略限制的,可以跨域的。创建script标签,然后将其src,指向我们真实的服务端的地址,在这个地址的后面有一个参数比如calback=a,然后服务端可以解析到这个url中的callback=a,服务端在返回的数据时,就会调用a方法,去包裹一段数据,然后返回这段js代码,相当于在前端去执行这个a方法。那么在前端发送请求之前,就要在window上去注册这个a方法,那么在服务端返回这个a方法执行的时候,就可以去之前在window上定义的a方法中获得数据了

什么是内存泄露,那些操作会造成内存泄露?

内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。

  1. 意外的全局变量引起的内存泄漏
  2. 闭包引起的内存泄漏
  3. 没有清理的DOM元素引用
  4. 被遗忘的定时器或者回调
  5. 子元素存在引用引起的内存泄漏

Ajax是什么?Ajax的交互模型?同步和异步的区别?如何解决跨域问题?

即异步 JavaScript XMLAjax是一种用于创建快速动态网页的技术。

 

异步模式下:

当我们使用AJAX发送完请求后,可能还有代码需要执行。这个时候可能由于种种原因导致服务器还没有响应我们的请求,但是因为我们采用了异步执行方式,所有包含AJAX请求代码的函数中的剩余代码将继续执行。如果我们是将请求结果交由另外一个JS函数去处理的,那么,这个时候就好比两条线程同时执行一样。

同步模式下:

当我们使用AJAX发送完请求后,后续还有代码需要执行,我们同样将服务器响应交由另一个JS函数去处理,但是这时的代码执行情况是:在服务器没有响应或者处理响应结果的JS函数还没有处理完成return时,包含请求代码的函数的剩余代码是不能够执行的。就好比单线程一样,请求发出后就进入阻塞状态,直到解除阻塞,余下的代码才会继续执行。

1jsonp跨域

JSONPJSON with Padding:填充式JSON),应用JSON的一种新方法,

JSONJSONP的区别:

 1JSON返回的是一串数据、JSONP返回的是脚本代码(包含一个函数调用)

 2JSONP 只支持get请求、不支持post请求

 (类似往页面添加一个script标签,通过src属性去触发对指定地址的请求,故只能是Get请求)

2nginx反向代理:

  www.baidu.com/index.html需要调用www.sina.com/server.php,可以写一个接口www.baidu.com/server.php,由这个接口在后端去调用www.sina.com/server.php并拿到返回值,然后再返回给index.html

  

3PHP端修改header

  header(Access-Control-Allow-Origin:*);//允许所有来源访问

header(Access-Control-Allow-Method:POST,GET);//允许访问的方式

 ajax 的过程是怎样的?

  1. 创建XMLHttpRequest对象,也就是创建一个异步调用对象.
  2. 创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.
  3. 设置响应HTTP请求状态变化的函数.
  4. 发送HTTP请求.
  5. 获取异步调用返回的数据.
  6. 使用JavaScript和DOM实现局部刷新.

工作原理

1.用户将请求交给Ajax引擎处理. (请求)

2.Ajax引擎接收到用户请求之后,自己发起新的URL请求,向服务器获取数据.

3.服务器接收到请求之后,根据自身进行业务处理,最终将结果返回 返回给引擎.

4.Ajax引擎通过事先规定好的 回调函数实现返回值的传递. 当用户获取返回值之后,则开始调用函数中的内容.

局部刷新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值