总结对象安全访问处理方案
SegmentFault
共 3244字,需浏览 7分钟
· 2020-11-22
作者:jump jump
来源:SegmentFault 思否社区
前端数据不可信,后端数据不可知
短路运算符号嗅探
const result = (staff.address && staff.address[0] && staff.address[0].zip) || ''
原理解析
null undefined NaN 0 空字符串
运算符 | 说明 |
---|---|
逻辑与,AND(&& ) | 若第一项可转换为 true ,则返回第二项;否则,返回第一项目。 |
逻辑或,OR | 若第一项可转换为 true ,则返回第一项;否则,返回第二项目。 |
逻辑非,NOT(! ) | 若当前项可转换为 true ,则返回 false ;否则,返回 true |
|| 单元保底值
const EMPTY_OBJ = {}
const result = (((staff || EMPTY_OBJ).address || EMPTY_OBJ)[0] || EMPTY_OBJ).zip || ''
try catch
let result = ''
try {
result = staff.address[0].zip
} catch {
// 错误上报
}
链判断运算符
const reuslt = staff?.address?.[0]?.zip || ''
a?.b
// 等同于
a == null ? undefined : a.b
a?.[x]
// 等同于
a == null ? undefined : a[x]
a?.b()
// 等同于
a == null ? undefined : a.b()
a?.()
// 等同于
a == null ? undefined : a()
手写路径获取
/**
* 根据路径来获取 对象内部属性
* @param obj 对象
* @param path 路径 a.b[1].c
*/
function getObjPropByPath(obj: Record, path: string) {
let tempObj = obj
const keyArr = path.split('.').map(x => x.trim())
let i: number = 0
for (let len = keyArr.length; ilet key = keyArr[i]
// 简单判断是否是数组数据,如果 以 ] 结尾的话
const isFormArray = key.endsWith(']')
let index: number = 0
if (isFormArray) {
const data = key.split('[') ?? []
key = data[0] ?? ''
// 对于 parseInt('12]') => 12
index = parseInt(data[1], 10)
}
if (key in tempObj) {
tempObj = tempObj[key]
if (isFormArray && Array.isArray(tempObj)) {
tempObj = tempObj[index]
if (!tempObj) {
return {}
}
}
} else {
return {}
}
}
if (!tempObj) {
return {}
}
return {
o: tempObj,
k: keyArr[i],
v: tempObj[keyArr[i]]
}
}
// 根据 object对象的path路径获取值。如果解析 value 是 undefined 会以 defaultValue 取代。
// _.get(object, path, [defaultValue])
var object = { 'a': [{ 'b': { 'c': 3 } }] };
_.get(object, 'a[0].b.c');
// => 3
_.get(object, ['a', '0', 'b', 'c']);
// => 3
_.get(object, 'a.b.c', 'default');
// => 'default'
其他
Null 判断运算符
const result = staff.address && staff.address[0] && staff.address[0].zip ?? ''
评论
目标检测正负样本区分策略和平衡策略总结
点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达作者丨深度眸@知乎(已授权)来源丨https://www.zhihu.com/people/huanghaian编辑丨极市平台未经允许不得二次转载极市导读 本文抛弃网络具体结构,仅仅从正负样本区分和正负样本平衡策略进行分
小白学视觉
0
使用 YOLO 进行自定义对象检测
点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达我们知道我们可以专门检测一些对象。那么我们如何训练系统检测自定义对象呢?让我们一步一步来。1. 创建数据集机器是通过数据集学习的。数据集必须包含图像和标签。例如,让我的目标是创建一个检测坦克的系统。我准备了从网上下载的坦克图片。然
小白学视觉
0
FaceChain高保真人像风格生成挑战赛:一等奖方案
Datawhale分享 作者:马琦钧,Datawhale成员简 介大家好,我是马琦钧,Datawhale成员,毕业于浙江农林大学,统计学/会计学双学位,获得过由阿里云、谷歌、百度、CVPR、思否、极棒等举办的相关赛事奖项。本次主要分享 FaceChain 高保真人像风
Datawhale
1
15种时间序列预测方法总结(包含多种方法代码实现)
向AI转型的程序员都关注了这个号👇👇👇在这篇文章中,我们将深入探讨时间序列预测的基本概念和方法。我们将首先介绍单元预测和多元预测的概念,然后详细介绍各种深度学习和传统机器学习方法如何应用于时间序列预测,包括循环神经网络(RNN)、一维卷积神经网络(1D-CNN)、Transformer、自回归模型(
机器学习AI算法工程
0
APP 安全测试项总结
一、安装包测试 1.1、关于反编译 目的是为了保护公司的知识产权和安全方面的考虑等,一些程序开发人员会在源码中硬编码一些敏感信息,如密码。而且若程序内部一些设计欠佳的逻辑,也可能隐含漏洞,一旦源码泄漏,安全隐患巨大。 为了避免这些问题,除了代码审核外,通常开发的做法是对代码进行混淆,混淆后源代
测试开发技术
0
魔改Transformer!9种提速又提效的模型优化方案
向AI转型的程序员都关注了这个号👇👇👇Transformer目前已经成为人工智能领域的主流模型,应用非常广泛。然而Transformer中注意力机制计算代价较高,随着序列长度的增加,这个计算量还会持续上升。为了解决这个问题,业内出现了许多Transformer的魔改工作,以优化Transformer
机器学习AI算法工程
0