# JavaScript
说明
JavaScript学习笔记
# 重点:
JavaScript 里一切皆对象,一切皆可储存在变量里
map方法会改变原始数组的值吗?
当数组为基础类型时原数组不变,当数组为引用类型时原数组发生改变。
下面代码段正确的输出是什么?
// 1 避免源对象被改变
const array1 = [{name:'1'},{name:'3'}]
const map1 = array1.map((x,index) => {
let obj = {...x}
obj.name = index
return obj
});
console.log(map1);
console.log(array1);
//> Array [Object { name: 0 }, Object { name: 1 }]
//> Array [Object { name: "1" }, Object { name: "3" }]
// 2 源对象被改变了
const array1 = [{name:'1'},{name:'3'}]
const map1 = array1.map((x,index) => {
let obj = x
obj.name = index
return obj
});
console.log(map1);
console.log(array1);
//> Array [Object { name: 0 }, Object { name: 1 }]
//> Array [Object { name: 0 }, Object { name: 1 }]
# forEach循环中调用异步方法,如何实现同步
准备代码:
const res = []
const arr = [1,2,3,4,5]
function t(num) {
return new Promise((resolve, reject) => {
setTimeout(()=>{
console.log('定时器', num)
resolve()
}, 1000)
})
}
function t2(item){
console.log('进入res')
res.push(item)
}
情况1: forEach内部等待异步执行完成
arr.forEach(async (item, index) =>{
await t(item)
t2(item)
})
结果:
定时器 1
进入res
定时器 2
进入res
定时器 3
进入res
定时器 4
进入res
定时器 5
进入res
情况2:forEach外部等待forEach执行完成
let asyncFun = []
arr.forEach((item, index) =>{
asyncFun.push(t(item))
t2(item)
})
Promise.all(asyncFun).then(() => {
console.log('res', res)
})
结果:
定时器 1
定时器 2
定时器 3
定时器 4
定时器 5
res (10) [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
情况3: 既需要forEach内部同步执行,又需要forEach外部同步执行
Promise.all(
arr.map( item =>{
return new Promise(async (resolve, reject) =>{
await t(item)
t2(item)
resolve()
})
})
).then(() =>{
console.log('object', res)
})
结果:
定时器 1
进入res
定时器 2
进入res
定时器 3
进入res
定时器 4
进入res
定时器 5
进入res
object (15) [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
# js获取用户浏览器版本信息
navigator.userAgent 是一个只读的字符串,声明了浏览器用于 HTTP 请求的用户代理头的值。我们可以使用它来检测浏览器信息。
function browser() {
var ua = navigator.userAgent;
var ret = {},
webkit = ua.match( /WebKit\/([\d.]+)/ ),
chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
ua.match( /CriOS\/([\d.]+)/ ),
ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
ua.match( /(?:trident)(?:.*rv:([\w.]+))?/i ),
firefox = ua.match( /Firefox\/([\d.]+)/ ),
safari = ua.match( /Safari\/([\d.]+)/ ),
opera = ua.match( /OPR\/([\d.]+)/ );
webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
ie && (ret.ie = parseFloat( ie[ 1 ] ));
firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
safari && (ret.safari = parseFloat( safari[ 1 ] ));
opera && (ret.opera = parseFloat( opera[ 1 ] )); console.log(ua);
return ret;
}
console.log(browser())
书摘 →