js数组初始化时 fill 填充的小bug

数组初始化代码如下:

const arr = new Array(3).fill([])
const arr2 = [[],[],[]]

console.log(JSON.stringify(arr)) //输出:[[],[],[]]
console.log(JSON.stringify(arr2)) //输出:[[],[],[]]
console.log(arr==arr2) //输出 false !! 明明stringify打印出来的内容都一样,为何这里却不等?

var arrIndex = 0
arr[arrIndex].push(123)
arr2[arrIndex].push(123)
console.log(JSON.stringify(arr)) //输出[[123],[123],[123]],为什么每一个元素都添加了123?
console.log(JSON.stringify(arr2)) //输出[[123],[],[]],这才是预期

console.log(arr) //输出[[123], [circular object Array], [circular object Array]],这是什么?引起怀疑
console.log(arr2) //输出[[123], [], []],这是预期

原本以为如下两种数组的初始化结果是相同的:

const arr = new Array(3).fill([])
const arr2 = [[],[],[]]

原来不是。第一种方式其实是:

const emptyArray = new Array([]) //这里只生成了一个对象
const arr = new Array(3).fill(emptyArray) //这里反复用同一个对象填充新生成数组的三个元素

实际结果:[emptyArray, emptyArray, emptyArray]

第二种方式是:

const arr2 = [emptyArray, emptyArray_2, emptyArray_3] //这才是我们原本期望的

结论和提醒:
    []也是一个对象
    Stringify相同,并不能说明两个对象相同,有可能两个对象其实是一个

### MyBatis Plus 常见 Bug 及解决方案 #### 一、分页插件无法正常工作 当使用 Spring Boot 集成多数据源并结合 MyBatis-Plus ,可能会遇到分页功能失效的情况。这是因为默认情况下 `MybatisSqlSessionFactoryBean` 的配置可能未正确加载 MyBatis-Plus 的 Mapper 接口。通过显式声明 `MybatisSqlSessionFactoryBean` 并设置其属性可以有效解决问题[^1]。 ```java @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); sessionFactory.setTypeAliasesPackage("com.example.entity"); return sessionFactory.getObject(); } ``` --- #### 二、逻辑删除字段冲突 如果项目中启用了全局逻辑删除配置,但在某些实体类上也定义了 `@TableLogic` 注解,则会出现优先级问题。具体表现为:MyBatis-Plus 会优先读取实体类上的注解配置,而忽略全局配置中的逻辑删除字段设定[^3]。 **解决方法** 确保实体类的 `@TableLogic` 注解与全局配置保持一致;或者移除实体类上的注解以统一采用全局配置。 ```yaml mybatis-plus: global-config: db-config: logic-delete-value: 1 logic-not-delete-value: 0 logic-delete-field: deleted ``` --- #### 三、自动填充功能异常 在实现自动填充功能,开发者通常会在实体类中加入 `@TableField(fill = FieldFill.INSERT)` 或其他类似的注解来标记需要自动生成的间戳或其他字段。然而,在实际运行过程中可能出现字段未能成功赋值的现象[^4]。 **原因分析** 1. 缺少对应的 MetaObjectHandler 实现类。 2. 自动注入机制未生效。 **修复方案** 编写一个继承自 `MetaObjectHandler` 的处理器,并注册到 Spring 容器中: ```java @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); } } ``` 同确认已开启自动填充支持: ```yaml mybatis-plus: global-config: db-config: field-strategy: NOT_EMPTY ``` --- #### 四、关联查询性能低下 对于复杂的业务场景,尤其是涉及多表联查的情况下,单纯依赖 SQL 映射可能导致效率下降甚至内存溢出等问题。此可考虑引入第三方扩展工具如 **mybatis-plus-join** 来优化查询逻辑[^2]。 安装方式如下: ```xml <dependency> <groupId>cn.iocoder</groupId> <artifactId>mybatis-plus-extension</artifactId> <version>最新版本号</version> </dependency> ``` 随后按照官方文档完成初始化操作即可显著提升执行速度。 --- #### 五、权限校验失败 (RuoYi 框架特有) 部分基于 RuoYi 开发的应用程序由于安全策略限制,默认关闭外部网络访问接口的功能。一旦尝试非法调用 API 就会产生类似于 “401 Unauthorized” 这样的错误提示信息[^5]。 **应对措施** 调整应用服务器防火墙规则允许特定 IP 地址范围内的连接请求;另外还需验证 Token 是否合法以及是否携带必要的 Header 参数头文件。 --- ### 总结 以上列举了几种较为典型的 MyBatis-Plus 使用过程中的障碍及其对应处理办法。希望这些经验能够帮助广大开发者快速定位并排除故障!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值