JS踩坑整理(三)
Object.create(null)和Object.create({})的区别
Object.keys()获取对象所有的属性名,返回值为一个数组
let obj = {a:1,b:2,c:3};
console.log(Object.key(obj));
//------输出: ["a", "b", "c"]
JSON.parse("{‘status’:0}")报错
JSON.parse的属性名必须用双引号包起来**’{“status”:0}’**,不然会报错
末尾不能出现逗号,不然也会报错
数组的方法
push:数组尾部添加
pop:数组尾部删除
shift:数组开头删除一个元素,返回删掉的值
unshift:数组开头添加一个或多和元素,返回长度
声明变量的提升
无论在哪个地方声明了变量,js引擎都会将他的声明放在 范围作用域的顶部
函数声明的提升
代码执行之前会读取函数的声明,也就是说函数的调用可以放在函数的声明之前
无论在那个地方声明了变量,js引擎都会将他的声明放在 范围作用域的顶部
函数的声明会覆盖变量的声明
实现异步编程的方式
- 回掉函数,优点是方便理解,部署缺点是不利于代码维护阅读,流程会很乱
- 事件监听,可绑定多个事件,每个事件可指定多个回掉函数,有利于实现模块化,缺点是程序会变成事件驱动型,运行不清晰
- Promises对象,是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口
事件流 事件捕获 事件冒泡
事件流:从页面中接收事件的顺序。也就是说,当一个事件产生时,这个事件的传播过程,就是事件流
事件冒泡:具体到不具体
事件捕获:不具体到具体,最具体的节点最后接收事件
闭包 堆栈溢出 内存泄漏,如何防止内存泄漏
闭包:能够读取其他函数内部变量的函数
堆栈溢出:不顾堆栈重分配的数据块大小,写入过多数据,导致数据越界,覆盖了别的数据,(递归)
settimeout的第一个参数使用字符串而非函数,会引发内存泄漏
防止内存泄漏
- 不要动绑定事件
- 不要动态添加,用事件冒泡在父容器监听事件
- 如果违反以上原则,需要手动销毁 destroy方法
- 少创建dom,少绑定事件
什么是自执行函数,用于什么场景以及好处
声明一个函数立即调用【(function(){})()】
创建了一个独立的作用域
优点:防止变量扩散到全局,避免作用于污染利用立即执行特性,返回需要的业务函数或对象,避免每次通过条件判断来处理
事件委托
利用冒泡的原理,将事件添加到父级上,出发执行效果
新添加的元素也会有之前的事件
数组合并
var arr1 = [1,2,3],arr2 = [4,5,6]
//第一种
arr1 = arr1.connet(arr2)
//第二种
Array.prototype.push.apply(arr1,arr2);
//第三种
for (var i=0; i < arr2.length; i++) {
arr1.push( arr2[i] );
}
jquery中get()和eq()
get() :取得其中一个匹配的元素
eq():获取第N个元素
on事件委托
$(function(){
$("#lists").on("click","li",function(event){
var target = $(event.target);
target.css("background-color","red");
})
})
** $.map和 $.each有什么区别**
map()方法主要用来遍历操作数组和对象,会返回一个新的数组。$.map()方法适用于将数组或对象每个项目新阵列映射到一个新数组的函数;
each()主要用于遍历jquery对象,返回的是原来的数组,并不会新创建一个数组。
jQuery和zepto的区别
zepto是针对移动端的库,有一些触摸事件可以用来做交互如tap swipe等事件
不支持IE浏览器
zepto代码量小,性能比较好
jq中prop和attr的区别
html结构中的元素本身就带的固有属性,使用prop
自定义属性使用attr
预编译语言或预编译处理器
比如sass less
是css的预处理语言,通过编程的方式生成css代码方便实现一些直接编写代码比较困难的代码
由于这些事css的预处理语言,不能被直接用的,必须经过编译
CSS 预处理器是一种语言用来为 CSS 增加一些编程的的特性,无需考虑浏览器的兼容性问题,例如你可以在 CSS 中使用变量、简单的程序逻辑、函数等等在编程语言中的一些基本技巧,可以让你的 CSS 更见简洁,适应性更强,代码更直观等诸多好处
ajax的执行流程
- 创建ajax对象,XMLHttpRequest,创建一个异步调用的对象
- 创建新的http请求。制定请求方法,url,
- 设置响应函数
- 发送请求send
- 获取异步调用返回的数据
http状态码
200:请求成功
201:请求成功并且服务器创建了新的资源
302:服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求。
304:自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
400:服务器不理解请求的语法。
404:请求的资源(网页等)不存在
500: 内部服务器错误
split()和join()
split 切割成数组的形式
join将数组转化成字符串
slice() splice()
slice() 方法可从已有的数组中返回选定的元素
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。
移动端300ms延迟
当我们点击页面的时候移动端浏览器并不是立即作出反应,而是会等上一小会儿才会出现点击的效果
因为浏览器需要判断用户到底进行的是什么操作,双击或是缩放
js继承的方式
1.使用对象冒充实现继承
2.采用call、Apply方法改变函数上下文实现继承
3.原型链方式继承