js实用技巧

vue相关

vue2.x的响应式

  1. 实现原理

。对象类型:通过Object.defineProperty()对属性的读取 修改进行拦截(数据劫持)。

。数组类型:通过重写更新数组的一些列方法来实现拦截,(对数组的变更方法进行了包裹)。

Object.defineProperty(data, 'name', {
     get(){
         return person.name
     },
    set(value){
        console.log('有人修改了name属性,被我发现了,我要去更新name属性了')
        person.name = value
    }
})
  1. 存在问题 。新增属性 删除属性,界面不会更新 。直接通过下标修改数组,界面不会自动更新

vue3.x的响应式

。通过Proxy (代理): 拦截对象中任意属性的变化,包括:属性值的读写 属性的添加 属性的删除等

。通过Reflect(反射):对被代理对象的属性进行操作

MDN文档中描述的Proxy与Reflect:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect

const p = new Proxy(person, {
    //拦截读取属性
    get(target, prop){
        return Reflect.get(target, prop)
    },
    //拦截修改属性或添加属性
    set(target, prop, value){
        return Reflect.set(target, prop, value)
    },
    //拦截删除属性
    deleteproprty(target, prop) {
        return Reflect.deleteproprty(target, prop)
    }
})

p.name = 'hi'

vue...中数组方法链式简写

//原本的
const countryModelList = this.$lodash.cloneDeep(res.records)
const keys = countryModelList.map(model => {
    return model.modelId
})
this.filterForm.values = this.modelList
    .filter(item => {
    return keys.includes(item.id)
})
    .map(f => {
    return f.key
})
//简写后
const countryModelList = this.$lodash.cloneDeep(res.records)
const keys = countryModelList.map(model => model.modelId)
this.filterForm.values = this.modelList.filter(item => keys.includes(item.id)).map(f => f.key)

vue中...运算扩展符使用

//原本的
const { brandCode, period, deptCode } = this.bandObj
const params = { brandCode, period: this.$utils.formatDate(new Date(period), 'yyyyMM'), deptCode }
console.log(params) //{brandCode: "Infinix", period: "202108", deptCode: "Infinix BU"}
//改版后
const { period } = this.bandObj
const params = { ...this.bandObj, period: this.$utils.formatDate(new Date(period), 'yyyyMM') }
console.log(params) //{brandCode: "Infinix", deptCode: "Infinix BU", period: "202108"}

vue中...对象解构多层结构

//number one
const user = {
    id:1,
    name:'xiaoming',
    age: 20,
    sex: '女',
    edcation:{
        degree:'Master'
    }
}
const { edcation:{ degree } } = user
console.log(degree) // prints: Master
//number two 1.取别名 2.设置默认值
const user = {
    id:1,
    name:'maiming',
    age: 20,
    sex: '女',
    // hobby: 'Swimming',
    education:{
        degree:'Master',
        user: {
            userId: 2,
            userName:'maiming-1',
        }
    }
}
const { sex: gender, hobby = 'running', education:{ user: {userId: id, userName} } } = user
console.log(gender,hobby, id, userName) // 女 running 2 maiming-1

javascript实用技巧

提前退出和提前返回

  /*
     1.需求
       如果没有动物 抛出异常
       打印出动物名称
       打印出动物类型
       打印出动物性别
   */

function printAnimalDetails(){
    var result = null
    if(animal){
        if(animal.type){
            if(animal.name){
                if(animal.positioning){
                    result = `${animal.name} is a ${animal.positioning} ${animal.type}`
                }else{
                    result = 'no animal positioning'
                }
            }else{
                result = 'no animal name'
            }
        }else{
            result = 'no animal type'
        }
    }else{
        result = 'no animal'
    }
    return result
}

建议写法

const printAnimalDetails = ({ type, name, gender } = {}) =>{
    if(!type) return 'no animal type'
    if(!name) return 'no animal name'
    if(!gender) return 'no animal gender'
    return `${name}is a ${gender}的${type}`
}

let getResult = printAnimalDetails({type:'狗子', name:'佩奇', gender:'雌性'})
console.log('@@@@@@@@', getResult)

对象字面量

//需求:基于颜色打印水果
//1. switch...case
function printFruits(color){
    switch (color) {
        case 'red':
            return ['apple']
            break;
        case 'yellow':
            return ['banana']
            break;
        default:
            return []
            break;
    }
}
let res = printFruits('red')
console.log(res)

//2.对象字面量 0-建议
const fruitsColor = {
    red: ['apple'],
    yellow : ['banana']
}

function printFruits2(obj, color){
    return obj[color] || []
}
console.log(printFruits2(fruitsColor, 'yellow'))
console.log(printFruits2(fruitsColor, null))

//3.map 1-建议
const fruitsColorMap = new Map().set('red',['apple']).set('yellow', ['banana'])
function printFruits3(obj, color){
    return obj.get(color) || []
}
console.log(printFruits3(fruitsColorMap, 'red'))
console.log(printFruits3(fruitsColorMap, null))

some-every运用场景

//需求:检查所有颜色是否都是red
const fruits = [
    {name: 'apple', color: 'red'},
    {name: 'banana', color: 'yellow'},
    {name: 'orange', color: 'yellow'},
    {name: 'pitaya', color: 'red'}
]

//every
const isAllRed = (fruits) => {
    return fruits.every(f => f.color === 'red')
}
console.log('@@@@@@@@', isAllRed(fruits))

//需求:检查是否有一个颜色是red
//some
const hasOneRed = (fruits) => {
    return fruits.some(f => f.color === 'red')
}
console.log('@@@@@@@@', hasOneRed(fruits))

find和filter

const fruits = ['apple', 'banana', 'orange', 'peach', 'plum']

//1.对满足的length 只会返回第一个元素
//2.对不满足的返回undefined
let getResult = fruits.find((item, index, data) => {
    // console.log('@@@@@@@',item, index, data )
    return item.length === 5
})
console.log('@@@@@@--find', typeof getResult, getResult)


//1.对满足的length 返回满足条件的数组
//2.对不满足的返回[]
let getResult2 = fruits.filter((item, index, data) => {
    // console.log('@@@@@@@',item, index, data )
    return item.length === 5
})
console.log('@@@@@@--filter', getResult2)

(filter) 需求:数组去掉空

const arr = ['', 'arr', ' ', 0, {name:'tom'}, [1,2,3], '', null, undefined, '']

let getResult3 = arr.filter((item,index) => {
    return item || typeof item === 'number' || item === null || item === undefined
})
console.log('@@@@@@--filter--arr', getResult3) // ["arr", " ", 0, {…}, Array(3), null, undefined]

日期计算

*需求:当月24号之前 月份为当月,月份24号之后 提报为下一个月。例子(2021-8-23 即为提报日期 2021-8 2021-12-26 即为提报日期 2022-01)

getDate() {
    const NOW = new Date() //当前时间
    const DAY = Number(NOW.getDate()) // 当天
    const setMonth = Number(NOW.getMonth()) + 1 // 代表当月
    const nextMonth = setMonth + 1 // 代表下一个月
    const getYear = NOW.getFullYear() // 当年
    const MONTH = DAY < 24 ? setMonth : nextMonth < 13 ? nextMonth : nextMonth - 12 < 10 ? '0' + (nextMonth - 12) : nextMonth - 12
    const YRAR = DAY < 24 ? getYear : nextMonth < 13 ? getYear : getYear + 1
    return YRAR + '-' + MONTH
},

async await

// 抽离成公共方法用来处理async
const awaitWrap = (promise) => { return promise.then(data => [null, data]).catch(err => [err, null]) }
// 请求
const [err, res] = await awaitWrap(areaAddAPI(params))
//try...catch...包裹 
try {
     const {data} = await areaAddAPI(params)
     console.log(data)
 }catch(err){
     console.log(err)
 }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容