1.说一说创建ajax过程?
- 创建XMLHttpRequest对象
const xhr = new XMLHttpRequest();
- 初始化设置请求方法和url
//POST请求
xhr.open('POST',"http://localhost:xxx");
//GET请求
xhr.open('GET',"http://localhost:xxx/a=100&b=200");
- 发送(向服务器发送请求)
GET请求将参数在请求地址url中
POST请求将参数放在send()中
//POST请求
xhr.send("a=200&b=200");
//GET请求
xhr.send();
- 设置响应HTTP请求状态变化的函数
xhr.onreadystatechange = function() {
if(xhr.readyState == 4){}
}
创建完HTTP请求之后,可以将HTTP请求发送给Web服务器了。发送HTTP请求的目的是为了接收从服务器中返回的数据。从创建XMLHttpRequest对象开始,到发送数据、接收数据、XMLHttpRequest对象一共会经历以下5中状态。
- 未初始化状态。在创建完XMLHttpRequest对象时,该对象处于未初始化状态,此时XMLHttpRequest对象的readyState属性值为0。
- 初始化状态。在创建完XMLHttpRequest对象后使用open()方法创建了HTTP请求时,该对象处于初始化状态。此时XMLHttpRequest对象的readyState属性值为1。
- 发送数据状态。在初始化XMLHttpRequest对象后,使用send()方法发送数据时,该对象处于发送数据状态,此时XMLHttpRequest对象的readyState属性值为2。
- 接收数据状态。Web服务器接收完数据并进行处理完毕之后,向客户端传送返回的结果。此时,XMLHttpRequest对象处于接收数据状态,XMLHttpRequest对象的readyState属性值为3。
- 完成状态。XMLHttpRequest对象接收数据完毕后,进入完成状态,此时XMLHttpRequest对象的readyState属性值为4。
此时接收完毕后的数据存入在客户端计算机的内存中,可以使用responseText属性或responseXml属性来获取数据。
- 设置获取服务器返回数据的语句
状态码:200-300是成功
if(xhr.status >= 200 && xhr.status < 300 ) {
//处理服务器端结果
result.innerHTML = xhr.response;//响应体,将数据进行局部渲染
}
2.Vue生命周期的阶段有哪些?
Vue生命周期分为四个阶段:
第一阶段(创建阶段):beforeCreate,create
第二阶段(挂载阶段):beforeMount,mounted
第三阶段(更新阶段):beforeUpdate,update
第四阶段(销毁阶段):beforeDestroy,destroyed
3.说一说HTML语义化?
<hander>表示页面头部
<nav>表示导航栏
<main>表示页面主要内容
<artical>表示文章内容
<footer>表示页面尾部
页面语义化的优点:更有利于修改与维护,更有利于理解页面结构,更有利于SEO。
4.如何判断对象是否属于某一个类
- typeOf可以判断number,string,undefined, null, Symbol类型的属性,但对于Array,正则对象,Date对象等数据使用typeOf打印出来是Object。
- instanceof可以来判断某个对象的类型,左边是对象,需要判断该对象是否属于某个类的实例对象或者是否为继承父类的构造函数。
- constructor可以判断typeof无法判断的对象类型
- 也可以使用Object.prototype.toString.call()来进行判断类型,这也是最常用的方法。
5.字符串相加编程题
由于字符串数据范围最大为100000,所以不能直接将字符串转化为数字进行相加减。
先判断是否有空字符串,如果一个为空字符串,那么直接返回另一个即可。
如果没有空字符串,我们规定,让s为长的字符串,t为短的字符串,从后往前进行运算。
在计算过程中,我们定义count变量来存放进位,ch进行两数相加,将相加得到的字符串放入str数组中以char类型进行存放。在相加时要判断t字符串是否小于0,小于0则不可继续参与加法运算。
运算完之后将char数组转化为字符串,然后判断进位是否为1,若为1,需要加上。
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
public String solve (String s, String t) {
// write code here
if(s.length() == 0 || t.length() == 0) return s.length() == 0 ? t : s;
if(s.length() < t.length()) {
String temp = s;
s = t;
t = temp;
}
int carry = 0;
char []res = new char[s.length()];
for(int i = s.length() - 1; i >= 0; i--) {
int ch = s.charAt(i) - '0' + carry;
int j = i - s.length() + t.length();
if(j >= 0) ch += t.charAt(j) - '0';
carry = ch / 10;
ch = ch % 10;
res[i] = (char)(ch + '0');
}
String output = String.valueOf(res);
if(carry == 1) output = '1' + output;
return output;
}
}
6.链表编程题
将链表分为前半段和后半段,然后将后半段进行反转,反转之后将两段进行交叉连接。
首先使用快慢指针,慢指针一次走一步,快指针,一次走两步,当快指针走到最后一个时,慢指针刚好走到最中间。将后半段的链表放入一个新链表中。
将后半段链表进行反转,新建一个链表pre,将newhead的下一个链表节点用next进行标记,将当前节点指向pre(此时是在newhead链表中),将newhead更新到pre中,然后newhead指向next.
将两个链表进行重组(原链表前半段和newhead链表),先将newhead.next节点进行存储,然后将newhead.next指向head.next,再将head.next指向newhead。完成这一操作之后第一阶段的连接完成,将head指向下一个数字(数字2),newhead指向下一个数字(数字5),以此类推。
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public void reorderList(ListNode head) {
if (head == null || head.next == null || head.next.next == null) return;
//找中点
ListNode slow = head;
ListNode fast = head;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
ListNode newHead = slow.next;
//将slow的下一个置为null
slow.next = null;
newHead = reserveList(newHead);
while (newHead != null) {
ListNode temp = newHead.next;
newHead.next = head.next;
head.next = newHead;
head = newHead.next;
newHead = temp;
}
}
//反转链表
private ListNode reserveList(ListNode head) {
if (head == null) return null;
ListNode pre = null;
while (head != null) {
ListNode next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
}