面试准备(1)

 
一、js的数据类型
     首先要明白js一共有两大数据类型:1.基础类型2.引用类型
     基础类型包括:String,boolean,Number,Symbol(ES6新增),Undefined, Null
     引用类型包括:Object(Array,Date,RegExp,Function)
     扩展:基本数据类型中有两个为特殊数据类型: null, undefined
     数据类型  --- 字符串、数字、布尔、对象、Undefined 、Null、数组
 
二、数据类型判断
     1.可以精准判断数据类型object.prototype.tostring.call('');
     2.typeof    
                     类型          结果
                  undefiner     "undefined"
                     Null        "object"
                    Boolean      "boolean"
                    Number        "number"
                    String        "string"
                    Symbol        "symbol"
                    函数对象       "function"
                   任何其他对象     "object"  
 
三、强制类型转换和隐式类型转换
     1.转换成字符型 toString() //可用作2进制,16进制的转换 num.toString(2)
     2.转换成数值 Number() 注:true和false转为1和0;null返回0;undefined返回NaN;
     3.转换成整数parseInt   //将字符转为数字 parsenInt(str,10)
     4.转换成parseFloat
     1.算术运算符中会生隐式转换,+:如果任意一边为字符,都做字符拼接处理; -*/%:全部转为数值处理
     2.在运算中  true==1 false==0
     3.在判断语句中  所有非0为true,0为false;所有非空字符串为true,空字符串为false;undefined为false;空数组为true;空对象为true;
     4.to.fixed()方法会把number类型转为string类型
 
四、数组的常用方法
     1.join()     将数组的元素用字符串连接在一起 返回数据的类型为string
     2.reverse()     将数组元素颠倒排序
     3.sort()     将数组的数据按从小到大排序,先排数字,再排字母。
     4.concat()     在数组的末尾添加数据,再返回新的数组
     5.slice(n,m)     返回一个新数组,从n到m-1
     6.splice(n,m)     返回一个新数组,从n到m
     7.push()     像数组的末尾添加一个数据,返回数组的长度
     8.pop()     删除数组的最后一个数据,并返回删除的数据
     9.unshift()     在数组的头部添加一个数据,返回数组的长度
     10.shift()     删除数组的第一个元素,返回值是删除后的元素
     11.toLocaleString()     把数组转换为字符串
     12.valueOf()     返回数组对象的原始值
     13.Es5新增数组方法,map((value,key,arr)=>{});filter((value,key,arr)=>{});forEach((item,index)=>{})
     14.indexOf()     根据所查询的元素从前往后找并返回对应的索引,查询不到则返回-1
     15.lastIndexOf() 根据所查询的元素从后向前兆并返回对应的索引,查询不到则返回-1
     16.some()     用于检测数组中的元素是否满足指定条件(函数提供)
     17.every()    用于对数组元素检测判断,正确返回true,错误返回false 
 
五、字符串的常用方法      
     1.indexOf()     检测对应的元素,返回值是该元素的索引
     2.lastIndexOf()     检测最后一次出现的相同元素,返回值是元素的索引
     3.charAt()     打印出指定索引的元素,默认返回值是该字符串的第一个元素
     4.substring(n,m)     用于截取数据,返回的数据是n,m-1
     5.substr(n,m)     用于截取数据,返回数据是n到m
     6.slice(n,m)    用于截取数据,返回的数据是n,m-1
     7.split()     根据一个字符,将字符串切割成一个数组返回
     8.replace('a','b')     接受两个参数,第一个是需要替换的字符串,第二个是替换的字符串  返回结果是改变的字符串
     9.toUpperCase()    将所有小写英文字符串转为大写
     10.toLocaleUpperCase()     将所有大写字符串转为小写
     扩展:字符编码 1.字符转编码:str.charCodeAt('5')  2.编码返字符串:String.fromCharCode(100)
 
六、常用的事件
     1.onclick:鼠标点击某个对象
     2.ondbclick:鼠标双击某个对象
     3.onclick:鼠标点击某个对象
     4.onmousemove:鼠标被移动
     5.onmouseout:鼠标从某个元素上移开
     6.oncontextmenu:鼠标右键点击事件
     7.onmouseover:鼠标被移到某个元素之上
     8.onmouseup:某个鼠标按键被松开
     9.onkeydown:某个键盘的键被按下
     10.onkeypress:某个键盘的键被按下或按住
     11.onkeyup:键盘的键被松开
     12.onabort:图像加载被中断
     13.onerror:当加载文档或者图像时发生某个错误
     14.onload:某个页面或者图像被完成加载
     15.onunload:用户退出页面
     16.onblur:元素失去焦点
     17.onfoucs:元素获得焦点
     18.onchange:用户改变域的内容
     19.onreset:重置按钮被点击
     20.onsubmit:提交按钮被点击
     21.onselect:文本被选中
     22.onresize:窗口或者框架被调整尺寸
 
七、闭包
     概念:闭包就是能够读取其它函数内部变量的函数。并且让局部变量变成自由变量的环境 本质上就是将函数内部与函数外部连接了一个桥梁。
     用途:一是可以读到取函数内部的变量,二是让这些变量的值始终保存在内存上。
     注意:
          1.由于闭包会使函数内部的变量都保存在内存中,内存消耗很大,因此不要滥用闭包,否者会造成网页的性能问题,ie中可能会导致内纯泄露。
          2.闭包会在父函数的外部改变父函数内部的变量值
     解决:在退出函数之前,将不使用的局部变量全部删除。
     
     例:实现f1()()()=100;
            function f1(){
                var a=100;
                return function f2(){
                      return function f3(){
                           console.log(a);
                      }
                }
             }
     
 
八、值类型判断
undefined==null      //true
undefined===null     //false
0==false             //true
1==true              //true
1===true             //false
2==true              //false
[ ]==false           //true
[ ]===false          //false
[ ]==![ ]            //true
[ ]===[ ]            //false
0=""                 //true
NaN==NaN             //false
"two"=="three"       //false
"two">"three"        //true
.3-.2==.4-.3         //false
{x:1}==={x:1}        //false  
-------------------------------------
alert(typeof null);        //object
alert(typeof undefined);   //undefined
alert(typeof NaN);         //number
alert(NaN == undefined);   //false
alert(NaN == NaN);         //false
var str = "123abc";
alert(typeof str++);       //number
alert(str);                //NaN
 
 
九、cookie、sessionStorage、localStorage
     cookie:也叫做会话跟踪技术,通俗的说,就是每当客户端请求一次,服务器端就响应一次,并且客户端将接受到的结果保存在本地机上,一个保存了用户信息的文件,称谓Cookie 。
     特点:1.只能使用文本文件  
          2.文件有大小限制4K~10K  
          3.数量限制,小于50条   、
          4.读取有域名限制,不可跨域读取  
          5.时效限制
     sessionStorage:是HTML5新增的一个会话存储对象,用于临时保存同一窗口的数据,在关闭窗口或标签页之后将会删除这些数据。
     特点:1.同源策略限制:同域名,同端口,同协议
          2.单标签页限制:sessionStorage操作限制在单个标签页中,在此标签页进行同源页面访问都可以共享sessionStorage数据。
          3.只在本地存储:seesionStorage的数据不会跟随HTTP请求一起发送到服务器,只会在本地生效,并在关闭标签页后清除数据。
          4.存储方式:seesionStorage的存储方式采用key、value的方式。value的值必须为字符串类型
          5.存储数据大小:不同的浏览器存储的上限也不一样,但大多数浏览器把上限限制在5MB以下。
     localStorage:本地存储,可用于长久保存整个网站的数据,保存的数据没有过期时间,直到手动去除。
     特点:1.同源策略限制:同域名,同端口,同协议
          2.只在本地存储:localStorage的数据不会跟随HTTP请求一起发送到服务器,只会在本地生效。
          3.存储方式:localStorage的存储方式采用key、value的方式。value的值必须为字符串类型
          4.存储数据大小:不同的浏览器存储的上限也不一样,但大多数浏览器把上限限制在5MB以下。
          5.同浏览器共享。localStorage的数据可以在同一个浏览器的不同标签页的同源页面之间共享。
          
 
十、call、apply、bind、with、eval
     call和apply:都是用来改变this指向用的,call和apply是立即执行,第一个参数表示执行时候的作用域,第二个参数表示传递的参数。call和apply的参数形式也有数不同,call的第二个参数是接收多个参数,apply为数组。
     bind:只是为了绑定,需要调用才可以执行,第一个参数表示执行时候的作用域,第二个参数表示传递的参数。
     with:with语句用于设置代码在特定对象中的作用域。
     eval:用法:eval("("+data+")")
 
十一、JS原型、原型链
     原型: 每创建一个函数,函数上都有一个属性为 prototype,它的值是一个对象。 这个对象的作用在于当使用函数创建实例的时候,那么这些实例都会共享原型上的属性和方法。
     原型链: 在 JavaScript 中,每个对象都有一个指向它的原型(prototype)对象的内部链接(proto)。这个原型对象又有自己的原型,直到某个对象的原型为 null 为止(也就是不再有原型指向)。这种一级一级的链结构就称为原型链(prototype chain)。 当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止;到查找到达原型链的顶部(Object.prototype),仍然没有找到指定的属性,就会返回 undefined.
 
十二、Ajax
     概念:异步(Asynchronous)的 JavaScript 和 XML。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。AJAX 是一种用于创建快速动态网页的技术。
     ajax原理和XmlHttpRequest对象:Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。
     流程:
          1.let xhr=window.XMLHttpRequest?(new XMLHttpRequest()):(new ActiveXObject("Microsoft.XMLHTTP"));
          2.xhr.open(method,url,asyn);
          3.xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
          4.xhr.send(data);
          5.xhr.onreadystatechange=function(){
           if(xhr.readyState==4 && xhr.status==200){
                //返回数据xhr.responseText
           }
     }
HTTP 状态码
          readyState
    1**:请求收到,继续处理
    2**:操作成功收到,分析、接受
    3**:完成此请求必须进一步处理
    4**:请求包含一个错误语法或不能完成
    5**:服务器执行一个完全有效请求失败
    ajax.status
    100——客户必须继续发出请求
    101——客户要求服务器根据请求转换HTTP协议版本
------------------------------------------------
    200——交易成功
    201——提示知道新文件的URL
    202——接受和处理、但处理未完成
    203——返回信息不确定或不完整
    204——请求收到,但返回信息为空
    205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
    206——服务器已经完成了部分用户的GET请求
---------------------------------------------------
    300——请求的资源可在多处得到
    301——删除请求数据
    302——在其他地址发现了请求数据
    303——建议客户访问其他URL或访问方式
    304——客户端已经执行了GET,但文件未变化
    305——请求的资源必须从服务器指定的地址得到
    306——前一版本HTTP中使用的代码,现行版本中不再使用
    307——申明请求的资源临时性删除
----------------------------------------------------------
    400——错误请求,如语法错误
    401——请求授权失败
    402——保留有效ChargeTo头响应
    403——请求不允许
    404——没有发现文件、查询或URl
    405——用户在Request-Line字段定义的方法不允许
    406——根据用户发送的Accept拖,请求资源不可访问
    407——类似401,用户必须首先在代理服务器上得到授权
    408——客户端没有在用户指定的饿时间内完成请求
    409——对当前资源状态,请求不能完成
    410——服务器上不再有此资源且无进一步的参考地址
    411——服务器拒绝用户定义的Content-Length属性请求
    412——一个或多个请求头字段在当前请求中错误
    413——请求的资源大于服务器允许的大小
    414——请求的资源URL长于服务器允许的长度
    415——请求资源不支持请求项目格式
    416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
    417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求
---------------------------------------------------------------------------------------------
    500——服务器产生内部错误
    501——服务器不支持请求的函数
    502——服务器暂时不可用,有时是为了防止发生系统过载
    503——服务器过载或暂停维修
    504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长
    505——服务器不支持或拒绝支请求头中指定的HTTP版本
AJAX的优点:
     1.无刷新更新数据。
     2.异步与服务器通信。
     3.前端与后端分离。
     4.节省带宽。
AJAX的缺点:
    1.不同版本的浏览器对 XMLHttpRequest 对象支持度不足(比如 IE5 之前);
    2.前进、后退的功能被破坏(因为 Ajax 永远在当前页,不会记录前后页面);
    3.搜索引擎的支持度不够(因为搜索引擎爬虫还不能理解 JS 引起变化数据的内容);
AJAX缓存问题:
    1、在ajax发送请求前加上 xmlHttpRequest.setRequestHeader(“Cache-Control”,”no-cache”);
    2、在服务端加 header(“Cache-Control: no-cache, must-revalidate”);
    3、在ajax发送请求前加上 xmlHttpRequest.setRequestHeader(“If-Modified-Since”,”0″);
    4、在 Ajax 的 URL 参数后加上 "?fresh=" + Math.random(); //当然这里参数 fresh 可以任意取了
    5、第五种方法和第四种类似,在 URL 参数后加上 "?timestamp=" + new Date().getTime();
    6、jQuery提供一个防止ajax使用缓存的方法:cache: false
   
 
十三、get、post
     GET:一般用于查询数据,使用URL传递参数,由于浏览器对地址栏长度有限制,所以对使用get方式所发送信息的数量有限制,同时浏览器会记录(历史记录,缓存)中会保留请求地址的信息,包括地址后面的数据。get 只能发送普通格式(URL 编码格式)的数据。
     POST:一般用于向服务器发送数据,对所发送的数据的大小理论上是没有限制,浏览器会缓存记录地址,但是不会记录 post 提交的数据。post 可以发送纯文本、URL编码格式、二进制格式的字符串,形式多样。
     在以下情况中,请使用 POST 请求:
          1.以提交为目的的请求(类似语义化,get 表示请求,post 表示提交);
          2.发送私密类数据(用户名、密码)(因为浏览器缓存记录特性)
          3.向服务器发送大量数据(数据大小限制区别);
          4.上传文件图片时(数据类型区别);
 
十四、跨域
     (1)为什么发生跨域
    1.浏览器限制:当你的请求是跨域的时候,浏览器出于安全考虑,会进行一些校验,如果是跨域问题,浏览器就会报错;
    2.跨域问题:只要是协议、域名、端口中有一个不同,都会被当成不同的域;
    3.XHR(XMLHttpRequest)请求,如果不是这个请求,浏览器也不会报跨域请求。
(2)如何解决跨域
    1.阻止浏览器做校验:方法百度~
    2.jsonp方法
    3.让服务器支持跨域
    4.在前台隐藏跨域
(3)Jsonp
    1.概念: 由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。
    2.使用jsonp后台服务器要进行改动么? 要改动
    3.jsonp实现原理:使用jsonp在向后台发送数据的时候,发送了一个callback参数,而后台在发现有callback这个参数的时候,就知道是jsonp请求,就会把json的数据变成javascript,而callback的值就是作为函数名,返回的数据作为函数的参数。
    4.区别:
         (1)请求类型不同,不是xhr类型,是script,所以浏览器不会最校验。
         (2)返回数据不一样,其他返回值是一个json数据,而jsonp返回值是一个javascript脚本。
    5.jsonp的弊端
         (1).服务器需要代码改动;
         (2).只支持get方法,因为是通过script标签发出请求;
         (3).发送的不是XHR请求;
(4)服务器支持跨域  
      后端配置:  
//配置cors中间件
     app.use(cors({
          "origin": ["http://localhost:3000", "http://localhost:3001".......], //允许所有前端域名
          "credentials": true, //允许携带凭证
          "methods": "GET,HEAD,PUT,PATCH,POST,DELETE", //被允许的提交方式
          "allowedHeaders": ['Content-Type', 'Authorization'] //被允许的post方式的请求头
     }));
//路由响应时
                              res.setHeader('Access-Control-Allow-Origin',req.headers.origin);//当前服务允许跨域
           前端配置:
                    {credentials:'include'}  
 
跨域代码实例:
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jsonp跨域请求</title>
</head>
<body>
</body>
<script type="text/javascript" src="http://127.0.0.1/project/jsonp/jsonp.js"></script>
/*凡是拥有src这个属性的标签都拥有跨域的能力,如img,iframe,script。那我们就可以把数据装载到JS文件内,供客户端调用和进一步处理。*/
</html>
     ----------------------------------------------------------------------------------------------------------------------
/*回调函数(全局,否则无法找到)接收并处理跨域请求的返回的数据*/
function callback(data) {
    var data="跨域请求的数据结果:"+data
    console.log(data)
    document.body.innerHTML=data;
}
window.onload=function () {
    var oScript=document.createElement('script');
    /*创建script标签*/
    oScript.src="http://127.0.0.1/project/jsonp/jsonp.php?callback=callback";
    /*设置script标签src属性值为跨域请求的文件并指定接收返回结果的回调函数*/
    document.body.appendChild(oScript);
    /*创建的标签加载到body页面*/
    document.body.removeChild(oScript)
    /*跨域请求完成标签废弃,进行移除*/
}
     ---------------------------------------------------------------------------------------------------------------------
<?php
    $arr = array(
        '测试数据1!',
        '测试数据2!',
        '测试数据3!'
    );
    $arr = json_encode($arr);
    //数组格式转换为字符串
    $callback = $_GET['callback'];
    //获取回调函数的名称
    echo $callback.'('.$arr.')';
    //返回回调函数并传参
?>
     
     
 
 
十五、promise 
一、什么是promise
     1.promise对象用于异步计算
     2. 是一个构造函数,它实际上是对回调函数的一种封装 对异步编程的一种改进。
     3.可以将异步操作队列化,按照期望的预期执行,返回符合预期的结果。
     4.可以在对象之间传递promis,帮助我们处理队列。
二、promise的特点
      1.Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称Fulfilled)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
      2.一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从Pending变为Resolved和从Pending变为Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
     Promise的优点:
           Promise对象可以将异步操作以同步操作的流程表达出来,避免层层嵌套的回调函数。Promise对象提供统一的接口,使得控制异步操作更加容易。
     Promise的缺点:
          1.无法取消Promise,一旦新建它就会立即执行,无法中途取消。
          2.如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。
          3.当处于Pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
三、Promise函数的参数使用
       resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从Pending变为Resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
      reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从Pending变为Rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
四、promise的then方法使用
       1 . Promise的then方法 指定Resolved状态和Reject状态的回调函数。
       2.then方法可以接受两个回调函数作为参数。
       3.第一个回调函数:Promise对象的状态变为Resolved时调用
       4.第二个回调函数:Promise对象的状态变为Reject时调用。第二个函数是可选的,不一定要提供。这两个函数都接受Promise对象传出的值作为参数。
       5.并且then方法支持链式调用
五、catch方法的使用
      catch方法 catch方法是.then(null, rejection)的别名,用于指定发生错误时的回调函数。Promise对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch语句捕获。一般来说,不要在then方法里面定义Reject状态的回调函数(即then的第二个参数),总是使用catch方法。如果没有使用catch方法指定错误处理的回调函数,Promise对象抛出的错误不会传递到外层代码,即不会有任何反应。
六、promise构造函数身上的方法          
Promise.all():Promise.all方法用于将多个Promise实例,包装成一个新的Promise实例。
var p = Promise.all([p1,p2,p3]);
promise.all方法接受一个数组作为参数,p1、p2、p3都是Promise对象的实例。
p的状态由p1、p2、p3决定,分成两种情况。
     (1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
     (2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
Promise.race():将多个Promise实例,包装成一个新的Promise实例。
var p = Promise.race([p1,p2,p3]);
上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数
 
十六、JS事件流模型
    事件流描述的是从页面中接收事件的顺序。 DOM 结构是树形结构,当页面中的某一个元素触发了某个一个事件,事件会从最顶层的 window 对象开始,向下传播到目标元素,途径的祖先节点都会触发对应的事件,如果当前节点的该事件绑定了事件处理函数的话,则会执行该函数当事件达到目标元素并执行绑定函数(如果有绑定的话)后,事件又会向上传播到 window 元素,途径的祖先节点都会触发对应的事件(如果绑定事件处理函数的话)
    事件流包含三个阶段:
         事件捕捉阶段:事件开始由顶层对象触发,然后逐级向下传播,直到目标的元素;
   处于目标阶段:处在绑定事件的元素上;
   事件冒泡阶段:事件由具体的元素先接收,然后逐级向上传播,直到不具体的元素
     
 
十七、浅拷贝与深拷贝
     对于字符串类型,浅拷贝是对值得复制,对于对象来说,浅拷贝是对对象地址的复制,并没有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,如果修改其中一个值,则另一个也会改变,而深拷贝则是开辟新的栈,两个对象对应的地址也不一样,修改一个对象的属性,不会改变另一个对象的属性。
     深拷贝:let data = JSON.parse(JSON.stringify(obj));//对于循环嵌套的对象
 

猜你喜欢

转载自www.cnblogs.com/alongup/p/8954823.html