读源码学会一些编程小技巧
记录一下学习源码中了解到一些开发编程技巧
判断嵌套对象内部的值是否存在
var i
// 业务中出现的多层嵌套的对象
var a = {
s: {
f: {
sf: 333,
},
},
}
// 一般的写法
if (a && a.s && a.s.f && a.s.f.sf) {
console.log(222)
}
// vue源码里使用的方法,上方的嵌套会随着层级越来越长,而下方的方法用了一个中间变量保证只有一层
if ((i = a) && (i = i.s) && (i = i.f) && (i = i.sf)) {
console.log(222)
}
Object.create(null)创建无原型属性的对象
使用for in遍历对象会把原型可枚举属性一起遍历出来,一般forin里面会包一层object.hasOwnProperty(key)
来确定是否是对象本身的方法,而Object.create(null)创建无原型属性的对象就不需要使用forin里面包一层了
判断构造函数是否使用new来创建
function ss(num) {
// 方式1 instanceof 如果函数不是通过new就报错
// 如果使用new关键字 this的__proto__指向函数的prototype
if (!(this instanceof ss)) {
console.error(222)
}
// 方式2 new.target 如果函数不是通过new就报错
// new.target 参考阮一峰 es6
if (new.target != ss) {
console.error(222)
}
// 方式3 new.target 如果函数不是通过new就手动帮你new
if (new.target != ss) {
return new ss(num)
}
this.a = num
}
var ff = ss(33)
console.log(ff)
保证对象的属性不可变
var a = {}
// // 使用这种方式创建的对象属性,利用默认设置是不可枚举,不可重写,不可配置的
Object.defineProperty(a, "f", {
value: 33,
})
// 跟上一种方式有些相似,利用读取只从get方法读取的原理,在谷歌打印出来是{},要点开才能看的数据
Object.defineProperty(a, "f", {
get: () => 55,
configurable: true,
})
// 复习一下相关知识
// Object.getOwnPropertyDescriptor 读取你的defineProperty设置
Object.getOwnPropertyDescriptor(a, "f")
// Object.preventExtensions 不允许在使用Object.defineProperty扩展a对象,加其他属性
Object.preventExtensions(a)
// Object.seal,在Object.preventExtensions功能上,加上之前的属性不可配置
Object.seal(a)
// Object.freeze, 在Object.seal功能上,加上不允许值改变
Object.freeze(a)
简化如果没有创建,有就直接操作的步骤
var a
// 之前经常会遇到如果第一次要创建再操作,之后直接操作,
// 原来是用if else来写,现在可以用下面的方式来写,但是记得要加;号不然代码可能会被浏览器理解成其他意思
;(a = a || []).push(3)
console.log(a)
// 或者是给对象赋值,这种情况更加常见
var b = {}
;(b.arr = b.arr || []).push(3)
console.log(b)
bind直接从arguments传参
// arguments 是从函数直接取得数组参数
// fun 是你自己得方法需要用bind切换指向, obj 是你bind指向得对象
Function.prototype.bind.apply(fun, [obj].concat(Array.prototype.slice.call(arguments)))
复杂数组去重
function unique (arr) {
let obj = {}
return arr.filter((item, index) => {
// 防止key重复d
let newItem = item + JSON.stringify(item)
return obj.hasOwnProperty(newItem) ? false : (obj[newItem] = true)
})
}
返回的同时给变量赋值
var ff = ''
function aw(params) {
return ff = 44
}
console.log(aw());
console.log(ff);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现