文章目录
- 一、Js实现拖动元素
- 二、Js实现once效果
- 三、Js实现深拷贝
-
- 1.通用方法
- 2. 对象、数组
- 3. 数组
- 四、实现fetch(Promise封装Ajax)
一、Js实现拖动元素
const div = document.getElementsByTagName('div')[0]//是否按下
let isDown = false
//鼠标至边框
let numX = 0
let numY = 0//鼠标点下
div.onmousedown = (e) => {
//计算鼠标至边框
numX = e.clientX - div.offsetLeft
numY = e.clientY - div.offsetTop
isDown = true
}//鼠标移动
window.onmousemove = (e) => {
if(isDown) {
//移动后的左,上,偏移量
let nl = e.clientX - numX
let nt = e.clientY - numY
div.style.left = nl + 'px'
div.style.top = nt + 'px'
}
}//鼠标弹起
div.onmouseup = () => {
isDown = false
}
二、Js实现once效果
let fn = function () { console.log(1) }function onece(fn) {
let isFirst = true
return function() {
if(isFirst) {
fn.apply(null,arguments)
isFirst = false
} else {
return undefined
}
}
}
let b = onece(fn)
b() //1
b() //undefined
三、Js实现深拷贝 1.通用方法
//方法一:通用方法
function deepClone(obj) {
/*注意typeof无法判断null具体数据类型(会判断为object),因此这里用call方法*/
if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || typeof obj === 'undefined' || Object.prototype.toString.call(null) === '[object Null]') {
return obj
} else if (Array.isArray(obj)) {
let newArr = []
/*切记不能直接用这种方式:以免数组里又有对象 (无法“深度克隆”)
obj.forEach((item) => {
newArr.push(item)
})
*/
for (let i in obj) {
newArr.push(deepClone(obj[i]))
}
return newArr
} else {
let newOjb = {}
for (let i in obj) {
newOjb[i] = deepClone(obj[i])
}
return newOjb
}
}
2. 对象、数组
//方法二:JSON.stringify(针对于对象)
let obj = ['haha','lala']
let str = JSON.stringify(obj)
let newObj = JSON.parse(str)
obj[0] = '试试'
console.log(obj,newObj);
/*
1.可用于深度克隆:对象、数组
2.遇到对象里嵌套对象,可以“深度克隆”!!
3.注意:使用JSON.stringify()以及JSON.parse()它是不可以拷贝 undefined , function, RegExp 等等类型的
*/
//方法三:Object.assign()
var obj = {
a:1,
b:2
}
var newObj = Object.assign({},obj)
obj.a = 0
console.log(obj,newObj);
//只用于对象或数组
//遇到对象里嵌套对象,无法“深度克隆”
3. 数组
//ES6 三点运算符
let arr = [1,2,3,4]
let newArr = [...arr]
arr[0] = 0
console.log(arr,newArr);
四、实现fetch(Promise封装Ajax)
//封装Ajax
function myAjax(method, url, data) {
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
let method = method || 'GET' //为了防止无参,这里设置默认
let data = https://www.it610.com/article/data || null
//规定请求
xhr.open(method, url, true)
xhr.send(data)//当 readyState 属性发生变化时被调用的函数
xhr.onreadystatechange = () => {
if (xhr.status === 200 && xhr.readyState === 4) resolve(xhr.responseText)
else reject(xhr.responseText)
}})
}myAjax("GET", "/some/url.json", null)
.then(res => console.log(res))
推荐阅读
- JavaScript基础知识|ES6(Generator生成器的介绍及场景应用)
- jQuery|滚动加载图片(懒加载)实现原理
- 前端|常用优化网页加载速度方法
- python|学了这么久python,你居然还不知道什么是爬虫(看完这篇文章你就明白了!)
- ES6之解构赋值
- Leetcode344反转字符串(双指针解法)
- element-ui之el-tree默认选中第一条
- ES6之rest参数
- 书签2