文章目录
-
- var 和let const的区别
- typeof返回哪些数据类型
- 列举强制类型转换和隐式类型转换
- 手写深度比较,模拟lodash.isEqual
- split()和join()的区别
- 数组的 pop push unshift shift 分别做什么
- slice和splice的区别
- [10,20,30].map(parseInt)
- ajax请求get 和post的区别
- 函数call和apply的区别
- 事件代理(委托)是什么
- 闭包是什么,有何特性,有何影响
- 如何组织事件冒泡和默认行为
- 查找、添加删除、移动 节点的方法?
- 如何减少DOM 操作?
- 解释jsonp原理,为何不是真正的ajax
- document load和ready的区别
- 函数声明和函数表达式的区别
- new Object()和Object.create的区别
- this的使用场景
- 判断字符串以字母开头,后面字母数字下划线,长度6-30
- 关于作用域和自由变量的场景题
- 手写字符串 trim 方法,保证浏览器兼容性
- 如何获取多个数字中的最大值
- 如何用JS实现继承?
- 如何捕获异常
- 什么是json
- 获取当前页面url参数
- 手写深拷贝
- 介绍一下RAF requestAnimateFrame
- 前端性能如何优化?一般从哪几个方面考虑?
- Map和Set
- 数组求和-Array.reduce
阮一峰es6入门
var 和let const的区别
- var是ES5 语法,let const 是ES6语法;var 有变量提升(有变量的定义,但没有赋值)
- var和let 是变量,可修改;const 是常量,不可修改;
- let const 有块级作用域,var 没有
typeof返回哪些数据类型
- 值类型:string、number、boolean、undefine、symbol
- 应用类型·:object array null归于object
- function
列举强制类型转换和隐式类型转换
- 强制:parseInt parseFloat toString 等
- 隐式 : if、逻辑运算、==、+ 拼接字符串
手写深度比较,模拟lodash.isEqual
// 实现如下效果
const obj1 = {
a: 10, b: {
x: 100, y: 200 }}
const obj2 = {
a: 10, b: {
x: 100, y: 200 }}
isEqual(obj1, obj2) === true
// 遍历值-递归
function isObject() {
return typeof object === 'object' && obj !== null
}
function isEqual(obj1, obj2) {
if(!isObject(obj1) || !isObject(obj2) ) {
// 不是对象则判断两个值类型是否相等
return obj1 === obj2
}
if(obj1 === obj2) {
return true
}
// 两个都是对象或者数组,且不相等
// 1.先取出obj1 和obj2 的keys,比较个数
const obj1keys = Object.keys(obj1)
const obj2keys = Object.keys(obj2)
if (obj1keys.length !== obj2keys.length) {
return false
}
// 2.以obj1为急转,和obj2 一次递归比较
for (let key in obj1 ) {
// 比较当前的key 的val递归
const res = isEqual(obj1[key], obj2[key])
if (!res) {
return false
}
}
return true
}
split()和join()的区别
- split()字符串以指定符号切割成数组
- join()数组通过指定符号连接成字符串
数组的 pop push unshift shift 分别做什么
[10,20,30]
- pop()删除数组的最后一个元素,返回删除的那个元素,改变原数组[10,20]
- push()往数组末尾添加元素,返回数组的长度,改变原数组[10,20,30,40]
- shift()删除数组的第一个元素,返回删除的那个元素,改变原数组[20,30]
- unshift()往数组开头添加元素,返回数组的长度,改变原数组[40,10,20,30]
纯函数
1.不改变原函数 2.返回一个数组
- concat():arr.concat([50,60,70])
- map
- filter
- slice(): arr.slice(2,3)获取指定位置的数据
非纯函数
- forEach(): 遍历,可能改变原数组
- some,evey reduce不改变原数组,不返回一个新数组
slice和splice的区别
(start从零开始数,-1表示倒数第一个的下标)
- slice:返回新数组,slice(start, end)返回从[start,end)的元素,start为负数表示倒数第几个元素
- splice:改变原始数组,splice(start, number, item) ,从start这个开始剪切掉number个元素,然后再添加item进去。
[10,20,30].map(parseInt)
返回[10,NaN,NaN]
parseInt()函数用来将字符串转化为整数,第二个参数是转换的进制
- parseInt第一个参数不是数字或者是负号会返回NaN
- 是数字则会继续解析第二个参数
- 如果是0x开头会当作十六进制
- 如果是0开头,会当作八进制
- 小数时,会向下取整
var num1 = parseInt("123.45") //123
var num2 = parseInt("123num") //123
[10,20,30].map(parseInt) //[10,NaN,NaN]
[10,20,30].map((item, index) => {
return parseInt(item, index)
})
parseInt(10, 0) === parseInt(10, 10) // 10
parseInt(20, 1) // NaN
ajax请求get 和post的区别
- get一般用于查询操作,post 一般用户提交操作
- get 参数拼接在url上,post 放在请求体内(数据体积可更大)
- 安全性:post 易于防止 CSRF
函数call和apply的区别
fn.call(this, p1,p2)
fn.apply(this, arguments)
穿参数的方式不同
事件代理(委托)是什么
const p1 = document.getElementById('p1')
const body = document.body
bindEvent(p1, 'click', e => {
e.stopPropag