JS笔记
Sonder
2019-09-11
8455字
21分钟
浏览 (3.8k)
获取url问号后面的参数
function getQueryString(variable) {
var query = window.location.href.split("?")[1];
if (query) {
var vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
if (pair[0] == variable) {
return pair[1];
}
}
}
}
function parseQuery() {
var query = {};
var href = window.location.href;
var index = href.indexOf("?");
if (index !== -1) {
var queryArr = href.slice(index + 1).split("&");
for (var i = 0, len = queryArr.length; i < len; i++) {
var arr = queryArr[i].split("=");
if (arr.length === 2) query[arr[0]] = String(arr[1]);
}
if (query.prefix) query.prefix = decodeURIComponent(query.prefix);
// console.log(query);
}
return query;
}
获取列表某个字段
function getFields(input, field) {
var output = [];
for (var i = 0; i < input.length; ++i) output.push(input[i][field]);
return output;
}
修改数组对象的Key和指定的值
convertKey (arr) {
return arr.map(item => ({
label: item.gameName,
value: item.gameCode
}))
},
截取时间戳
function timeRange(time) {
let timeRange = time ? time.split("~") : [];
let start = timeRange ? timeRange[0] : "";
let end = timeRange ? timeRange[1] : "";
return [start, end];
}
如何将 JS 日期转换为ISO标准
toISOString() 方法用于将js日期转换为ISO标准。 它使用ISO标准将js Date对象转换为字符串。
var date = new Date();
var n = date.toISOString();
console.log(n);
// YYYY-MM-DDTHH:mm:ss.sssZ
如何在JS中克隆对象
var x = {myProp: "value"};
var y = Object.assign({}, x);
解析浏览器上的url
decodeURIComponent
var href = decodeURIComponent(window.location.href);
获取二维数组下面的某个键里面的值
结果:
[
{ Q:123,R:101,lng:103.55,lat:34.55 },
...
]
期望结果:
[
{ lng:103.55,lat:34.55 },
...
]
function jsonFun(data) {
let output = [];
data.forEach(obj => {
let temp_obj = {
lng: obj["lng"],
lat: obj["lat"]
};
output.push(temp_obj);
});
//数组转json字符串
return JSON.stringify(output);
}
倒计时
setInterval(function(){
var time=new Date();
var year=time.getFullYear();
var month=time.getMonth()+1;
var day=time.getDate();
var hour=checkTime(time.getHours());
var minite=checkTime(time.getMinutes());
function checkTime(i){
if(i<10) return "0"+i;
return i;
}
var box=document.getElementById("nowtime");
box.innerHTML=year+"-"+month+"-"+day+" "+hour+":"+minite;
},6000);
向js文件传值
<script src="../about.js" hiddenComment="true"></script>
about.js
var script=document.getElementsByTagName("script");
//获取最后一个js文件
var endScript = script[script.length-1]
var hiddenComment= endScript.getAttribute("hiddenComment");
console.log(hiddenComment)
数字格式化
function paddingNum(number){
return number.toLocaleString()
}
console.log(paddingNum(1236699.12))
对象中出现两次以上的为true,否则为false
function duplicatedWord(chars) {
var map = new Map();
for (var i = 0; i < chars.length; i++) {
if (map.has(chars[i])) {
map.set(chars[i], 'true');
continue;
} else {
map.set(chars[i], 'false');
}
}
return map;
}
执行顺序(异步)
同步可以保证顺序一致,但是容易导致阻塞;异步可以解决阻塞问题,但是会改变顺序性,根据不同的需要去写你的代码。
setTimeout(function(){console.log(1)},0);
new Promise(function(resolve,reject){
console.log(2);
resolve();
}).then(function(){console.log(3)
}).then(function(){console.log(4)});
process.nextTick(function(){console.log(5)});
console.log(6);
//输出2,6,5,3,4,1
setTimeout(() => console.log('a'));
Promise.resolve().then(
() => console.log('b')
).then(
() => Promise.resolve('c').then(
(data) => {
setTimeout(() => console.log('d'));
console.log('f');
return data;
}
)
).then(data => console.log(data));
//b f c d a
如何实现sleep的效果(es5或者es6)
https://www.nowcoder.com/tutorial/96/7a253a443122467b8d022ca88d33ec62
- 通过promise来实现
function sleep(ms){
var temple=new Promise(
(resolve)=>{
console.log(111);setTimeout(resolve,ms)
});
return temple
}
sleep(500).then(function(){
console.log(222)
})
//先输出了111,延迟500ms后输出222
- 通过async封装
function sleep(ms){
return new Promise((resolve)=>setTimeout(resolve,ms));
}
async function test(){
var temple=await sleep(1000);
console.log(1111)
return temple
}
test();
//延迟1000ms输出了1111
写一个函数,第一秒打印1,第二秒打印2
for(let i =0; i< 5;i++){
setTimeout(function(){
console.log(i)
},1000*i)
}
把多维数组变成一维数组的方法
https://www.nowcoder.com/tutorial/96/f34606528fb24c529210c6e4196c1cfc
1、递归
function flatten(arr) {
var result = [];
for (var i = 0, len = arr.length; i < len; i++) {
if (Array.isArray(arr[i])) {
result = result.concat(flatten(arr[i]))
}
else {
result.push(arr[i])
}
}
return result;
}
2、toString
function flatten(arr) {
return arr.toString().split(',').map(function(item){
return +item
})
}
3、用ES6给的flat方法
var arr1 = [1, 2, [3, 4]];
arr1.flat();
// [1, 2, 3, 4]
var arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]
var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
// [1, 2, 3, 4, 5, 6]
//使用 Infinity 作为深度,展开任意深度的嵌套数组
arr3.flat(Infinity);
// [1, 2, 3, 4, 5, 6]
正则
从字符串当中找到自己想要的
const str = 'qwbewrbbeqqbbbweebbbbqee';
var i = str.match(/b{1,5}/g)
// str.match(/b+/g);
console.log(i)
// Array(4)
// 0: "b"
// 1: "bb"
// 2: "bbb"
// 3: "bbbb"
// length: 4
代码回收规则
- 全局变量不会被回收。
- 局部变量会被回收,也就是函数一旦运行完以后,函数内部的东西都会被销毁。
- 只要被另外一个作用域所引用就不会被回收
//三个变量没有被回收
var i = 1;
var i = 2;
var add = function() {
var i = 0;
return function()
{
i++;
console.log(i);
}
}();
add();
清空数组
- arrayList = []
- arrayList.length = 0;
- arrayList.splice(0, arrayList.length);
JavaScript回调函数
回调函数
function add(num1, num2, callback){
var sum = num1 + num2;
callback(sum);
}
function print(num){
console.log(num);
}
add(1, 2, print); //=>3
jQuery中大量的使用了回调函数
$("#btn").click(function() {
alert("button clicked");
});
Js类型判断
- typeof
- instanceof
- Object.prototype.toString
在html渲染数组中判断是不是最后一个
<li v-for="(item,index) in data" :key="index">
<span class="mr-15">{{ item }}</span>
<img v-if="index !== data.length - 1" src="@/assets/images/goods/arrow.png" alt="">
</li>
JS使用递归删除children中长度为空的数组
removeEmptyArrayEle(arr) {
if(arr.length){
for(let i in arr){
if(arr[i].children.length) {
this.removeEmptyArrayEle(arr[i].children)
} else {
delete arr[i].children;
}
}
}
return arr;
},
回到锚点位置
var linkc = document.querySelector('#linkc')
var cc = document.querySelector('#cc')
to(toEl,n = 80) {
let bridge = toEl;
let body = document.body;
let height = 0;
do {
height += bridge.offsetTop;
bridge = bridge.offsetParent;
} while (bridge !== body)
window.scrollTo({
top: height - n,
behavior: 'smooth'
})
},
linkc.addEventListener('click', function () {
to(cc)
});
删除数组某个值
//https://www.h5w3.com/521.html
function removeByValue(arr, val) {
for(var i=0; i<arr.length; i++) {
if(arr[i] == val) {
arr.splice(i, 1);
break;
}
}
}
var somearray = ["mon", "tue", "wed", "thur"]
removeByValue(somearray, "tue");
//somearray will now have "mon", "wed", "thur"
把sessionStorage存的值转为对象
checkBe(obj) {
if (!(typeof obj == 'object')) {
return;
}
for (let key in obj) {
if (obj.hasOwnProperty(key)
&& (obj[key] == null || obj[key] === undefined || obj[key] === '')) {
delete obj[key];
}
}
return obj;
}
// 存
sessionStorage.setItem('select_game', JSON.stringify(this.objName))
// 取
let select_game = sessionStorage.getItem('select_game');
if(select_game && select_game !== '{}') {
this.getSelectData = this.checkBe(JSON.parse(select_game))
}
获取数组第一个
var arr = [1,2,3...........10000];
我需要的是[1],后面无限多的不需要,怎么获取呀
this.selectArr.slice(0,1);
input只能输入价格
<input type="text" v-model="inputGroupScreen.priceMin" oninput="value=value.replace(/[^\d.]/g,'').replace(/\.{2,}/g, '.').replace(/^(\d+)\.(\d\d).*$/, '$1.$2')" class="numberInput" placeholder="请输入" min="0">
// vue要加@
@oninput