网站首页 > 技术文章 正文
1.JS基本数据类型
Number String boolean null undefined Object
null类型进行typeof操作符后,结果是object,原因在于,null类型被当做一个空对象引用。
2.typeof的返回值类型
- number:NaN
- boolean
- string
- undefined:undefined 不存在的变量
- object:对象,数组,null
- Function:Array Date
- symbol:typeof Symbol() // ES6提供的新的类型
3.操作数组的方法
- shift:从数组中把第一个元素删除,并返回这个元素的值。
- unshift:在数组的开头添加一个或更多元素,并返回新的长度
- push:在数组的末尾添加元素,并返回新的长度
- pop:把数组的最后一个元素删除,并返回该元素的值
- slice:读取数组指定的元素,不会对原数组进行修改
- splice:操作数组指定的元素,会修改原数组,返回被删除的元素
- concat reverse join split sort
4.操作字符串的方法
- charAt(index):返回指定索引处的字符串
- concat(str1,str2,…):连接多个字符串,返回连接后的字符串的副本
- indexOf(str):返回str在父串中第一次出现的位置,若没有则返回-1
- match(regex):搜索字符串,并返回正则表达式的所有匹配
- replace(str1,str2):str1也可以为正则表达式,用str2替换str1
- substr(start,length):从字符索引start的位置开始,返回长度为length的子串
- substring(from,to):返回字符索引在from和to(不含)之间的子串
- search(regex):基于正则表达式搜索字符串,并返回第一个匹配的位置
- valueOf():返回原始字符串值
5.JS有哪些内置对象
- 数据封装类对象:Object、Array、Boolean、Number、String
- 其他对象:Function、Arguments、Math、Date、RegExp、Error
- ES6新增对象:Symbol、Map、Set、Promises、Proxy、Reflect
6.函数声明和函数表达式的区别
函数声明有变量提升,现代浏览器不会对if语句中的函数声明进行提升
函数声明的自执行必用()将函数声明括起来后自执行,函数表达式可以直接自执行
7.JavaScript的原型,原型链?有什么特点?
- 每一个js对象(除了null)都有_proto_内部属性,这个属性会指向该对象的原型
- js中每个函数除了_proto_之外,还预置了prototype属性,当函数对象作为构造函数创建实例时,该prototype属性值将被作为实例对象的原型_proto_
- 每个原型都有一个 constructor 属性指向关联的构造函数 实例原型指向构造函数
- prototype属性的作用就是包含可以由特定类型的所有实例共享的属性和方法,也就是让该函数所实例化的对象们都可以找到公用的属性和方法Person === Person.prototype.constructorperson. proto === Person.prototypeObject.prototype. proto === null
- 原型链:当一个对象调用的属性/方法自身不存在时,就会去自己 _proto_关联的前辈 prototype 对象上去找,如果没找到,就会去该 prototype 原型_proto_关联的前辈 prototype 去找。依次类推,直到找到属性/方法或 undefined 为止。从而形成了所谓的“原型链”
- 原型特点:JavaScript对象是通过引用来传递的,当修改原型时,与之相关的对象也会继承这一改变
8.call& apply& bind
- call和apply都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向(对象原本没有这个方法,借用别人的)。Call和apply会直接调用函数;bind可以指定this的指向,返回一个新的函数,不改调用函数
- apply、call 作用完全一样,只是接受参数的方式不太一样
func.call(this, arg1, arg2); func.apply(this, [arg1, arg2])
实例 - 数组追加 Array.prototype.push.apply(array1, array2);
- 获取数组中的最大值和最小值 Math.max.apply(Math,array1)
- 验证是否是数组,因为Array的toString方法被重写过,所以调用Object的toString(),Object的toString方法结果是[object 对象类型] Object.prototype.toString.call(obj) === ‘[object Array]’
- Javascript如何打印数组的值 console.log.apply(console,arr)
使用bind改变setInterval等定时器中的this,这里的this原本指向window
setInterval(function(){}.bind(this),1000);
9.实现继承
- 拷贝:把父对象的所有属性和方法,拷贝进子对象(不算继承)
- 原型链继承:将父类的实例作为子类的原型(创建子类实例时,无法向父类构造函数传参)
- 构造函数绑定:使用 call 或 apply 方法,将父对象的构造函数绑定在子对象上(不能继承父类原型上的方法)
- 原型+构造组合继承(为了弥补上两种的不足):借用构造函数继承父对象的属性,通过原型让子类继承父类的方法
- ES6 语法糖 extends
10.通过new创建一个对象的时候,函数内部有哪些改变 手写new方法
- 创建一个空对象
- 将所创建对象的__proto__属性值设为构造函数的prototype的属性值
执行构造函数中的代码,构造函数中的this指向该对象,并且最后隐式的返回 this - Object.create方法创建一个新对象,使用现有的对象来提供新创建的对象的proto
11.this对象的理解
- this 总是指向函数的直接调用者
- 如果有 new 关键字,this 指向 new 出来的实例对象
- 在事件中,this指向触发这个事件的对象,特:IE下 attachEvent 中的this总是指向全局对象Window
12.eval
- eval的功能是把对应的字符串解析成JS代码并运行
- 应该避免使用eval,不安全,非常耗性能(先解析成js语句,再执行)
- 由JSON字符串转换为JSON对象的时候可以用 eval(’(’+ str +’)’);
13.JavaScript实现异步编程
- 回调函数
- 事件监听
- 发布/订阅
- Promises对象
- Async await
14.事件冒泡 事件捕获 事件委托(代理)
- 事件冒泡会从当前触发的事件目标一级一级往上传递,依次触发,直到document为止
- 事件捕获会从document开始触发,一级一级往下传递,依次触发,直到真正事件目标为止。
- 事件监听,第三个参数是布尔值,默认false,false是事件冒泡,true是事件捕获
document.getElementById(‘box3’).addEventListener(‘click’, sayBox3, false); - 事件委托通过监听一个父元素,来给不同的子元素绑定事件,减少监听次数,从而提升速度
- 老版IE不支持addEventListener removeEventListener而使用attachEvent detachEvent,IE里的事件对象是window.event,事件源是srcElement,阻止冒泡写法window.event.cancelBubble = true;
15.Jquery的on bind delegate
- $("#id").bind(“click”,function(){})
- $("#id").on(“click”,".class",function(){})
- $(“div”).delegate(“p”, “click”, function () {});
- on可以将子元素的事件委托给父元素进行处理;on可以给动态添加的元素加上绑定事件
16.Promise机制
- Promise有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)
- Promise对象接受一个回调函数作为参数, 该回调函数接受两个参数,分别是成功时的回调resolve和失败时的回调reject;另外resolve的参数除了正常值以外, 还可能是一个Promise对象的实例;reject的参数通常是一个Error对象的实例。
- Promise用来解决回调地狱问题, 可以链式调用
- Promise.all:将多个Promise实例包装成一个新的Promise实例。当所有的promise都返回成功时才成功同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。
- Promise.race:当其中一个promise有返回结果时就返回该结果,无论结果本身是成功还是失败。
17.Ajax Asynchronous JavaScript and XML
- 原理:通过XmlHttpRequest对象来向服务器发送异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。
- 优点: 实现局部刷新 异步 界面与应用分离
- 缺点:破坏了浏览器的机制(back),安全问题,对搜索引擎的支持较弱,不能很好地支持移动设备
- 参数: url type async cache默认为true,设置为false将不会从浏览器缓存中加载请求信息。 dataType success error
- XMLhttprequest对象:XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。通过XMLHttpRequest对象,Web开发人员可以在页面加载以后进行页面的局部更新
- 实现流程:创建XMLHttpRequest对象,创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息,设置响应HTTP请求状态变化的函数,发送HTTP请求,获取异步调用返回的数据,使用JavaScript和DOM实现局部刷新
- 解决浏览器缓存问题:anyAjaxObj.setRequestHeader(“Cache-Control”,“no-cache”)。 jquery cache:false
18.ajax请求的时候get 和post方式的区别
- 一个在url后面 ,一个放在虚拟载体里面
- get有大小限制(只能提交少量参数)
- 安全问题
- 应用不同 ,请求数据和提交数据
19.内存泄漏
用动态存储分配函数内存空间,在使用完毕后未释放,导致一直占据该内存单元。直到程序结束。
常见内存泄漏:
- 不需要的全局变量(未声明或者this指向window)
- 被遗忘的定时器和回调。
- 脱离DOM的引用:DOM已经被动态删除了,但还保存着他的引用
闭包
20.http协议状态码
- 1开头:信息状态码 (100 继续 101:切换协议)
- 2开头:成功状态码(200 请求成功 201 创建新资源 202 接受但未处理 203 非授权信息 204 无内容)
- 3开头:重定向状态码(302:临时移动 304:请求的网页未修改)
- 4开头:客户端错误状态码(400错误请求 401 未授权 404 找不到资源)
- 5开头:服务端错误状态码(500 服务器内部错误 502 错误网关 503 服务不可用 504 网关超时)
21.跨域
只要协议,域名,端口有任何一个的不同,就被当作是跨域。
解决办法:
- 跨域资源共享(CORS):使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是失败,服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的,只需要在后台中加上响应头来允许域请求
- 通过jsonp跨域:用使用script标签实现跨域访问,可在url中指定回调函数。缺点:只支持GET方式是一种脚本注入行为存在一定的安全隐患。如果返回的数据格式有问题或者返回失败了,并不会报错
- 通过修改document.domain来跨子域。两个网页一级域名相同,只是二级域名不同,只要设置相同的document.domain,两个网页就可以共享Cookie,这种方法只适用于 Cookie 和 iframe 窗口
- 使用window.name来进行跨域:window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个
- 使用HTML5的window.postMessage方法跨域
- 通过WebSocket进行跨域
22.js克隆
浅克隆:浅克隆的对象的引用值是拷贝对象里的引用,这两个对象里面的引用指向的地方是一致的。
深克隆:这两个对象里的引用的独立拷贝的,不指向同一个地方
深克隆方法:
- Object.assign(对于对象属性值为引用类型时只是浅拷贝)
- 使用JSON.parse()和JSON.stringify()对对象进行深拷贝
JSON.parse(JSON.stringify(obj)); 不支持function,undefined,Date,不能克隆它继承的值 - 递归拷贝
23.js循环
- for-in 循环主要用于遍历对象 可以遍历原型属性,使用hasOwnProperty判断是否是自身属性
- for-of循环(ES6)可以获取到键值
- foreach循环
- Jquery的each
- map()循环 对原数组的每个元素进行操作,并返回一个新数组
- filter()过滤循环 返回结果为true的成员组成一个新数组返回
- some() 返回一个布尔值,判断数组成员是否符合某种条件,其中一个返回true,整个方法都返回true
- every()与some()相反,所有返回true,整个方法返回true,否则返回false
- reduce()依次处理每一个成员,最终累计为一个值(reduceRight从右向左执行)
- Object.keys方法遍历对象的属性
- Object.getOwnPropertyNames()能返回不可枚举的属性 比如length
24.js延迟加载的方式
defer:只支持IE async setTimeout 放在body后面
25.ES6新特性
- 变量声明:const和let局部变量,不提升,块级作用域,const声明时用大写,声明时必须被赋值
- 模板字符串 反引号(``)
- 箭头函数
不需要 function 关键字来创建函数 省略return关键字 继承当前上下文的this关键字 - 函数的参数默认值function printText(text = ‘default’) {}
- 解构 const point = [10, 25, -34]; const [x, y, z] = point; console.log(x, y, z);
- for-of 循环
- 展开运算符(…) 结合数组const produce = […fruits,…vegetables]; 剩余参数;不确定参数
class 继承
26.立即执行函数
jQuery开篇用的就是立即执行函数。立即执行函数常用于第三方库,好处在于隔离作用域,任何一个第三方库都会存在大量的变量和函数,为了避免变量污染(命名冲突)
两种常见形式:( function(){…} )()和( function (){…} () )
除了使用()运算符之外,!,+,-,=等运算符都能起到立即执行的作用
27.闭包
闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域
特性:函数内嵌套函数;内层函数可以引用外层的参数和变量;闭包内的变量和参数不会被gc回收
闭包经典题目解决办法:使用let代替var或者使用立即执行函数
28.排序
- 冒泡排序 比较相邻的元素。如果第一个比第二个大,就交换他们两个
- 选择排序 依次找到剩余元素最小值,放置排好序的末尾(第一个放在开头)
- 插入排序 即构建有序序列,未排序数据依次从已排序数据按从后往前比较,插入到合适的位置
- 快速排序 找出一个基准值,通过比较大小分为两个序列,递归查找直到leng的长度小于
- 希尔排序
- 归并排序
还有其他想了解的可以私信我。
- 上一篇: 22个JavaScript开发技巧合集
- 下一篇: 前端JS小技巧
猜你喜欢
- 2024-11-21 浅析GIF 格式图片的存储与解析
- 2024-11-21 如何用2 KB代码实现3D赛车游戏?2kPlus Jam大赛了解一下
- 2024-11-21 快速了解ES6的代理与反射
- 2024-11-21 「实战」蘑菇街 PC 端首页,瀑布流布局的实现原理与细节技巧
- 2024-11-21 Knative 驾驭篇:带你 '纵横驰骋' Knative 自动扩缩容实现
- 2024-11-21 ECMAScript 6使用教程总结
- 2024-11-21 一道二进制子串算法,让面试官都解不出来?
- 2024-11-21 高级前端进阶,为什么要使用call、apply、bind?
- 2024-11-21 碎片时间学编程「202]:分组数组元素
- 2024-11-21 从入门到入土:Lambda完整学习指南,包教包会(上)
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-