• 售前

  • 售后

热门帖子
入门百科

JS数组索引检测中的数据范例问题详解

[复制链接]
123457682 显示全部楼层 发表于 2021-10-25 19:13:12 |阅读模式 打印 上一主题 下一主题
之前在写微信小步伐项目时,内里有一个“都会选择”的功能,笔者用的是
  1. <picker-view>
复制代码
组件,这个组件比力特殊,由于它的
  1. value
复制代码
属性规定是 数组 格式的。比如:
  1. value="[1]"
复制代码

由于当时对JS变量类型转换的不相识,笔者在代码中写下了如许的几行判断:(这是严谨的)
  1. let val_one=typeof this.data.pIndex=="number"?[this.daya.pIndex]:this.data.pIndex
复制代码
(:项目中存取元素是动态的!
上面这是由于要使下标动态跟随用户选择,并反馈到wxml里的
  1. value
复制代码
属性上展示。
但是在这之前还需要做一层判断 —— 由于有的地区是省级市或者直辖市,而且要防止用户“骚操纵”,比如不停上拉或者猛的拉出去,这时间再微信小步伐中是会报错找不到对应数据的:
  1. let length=placeArray[val_one].sub.length
  2. if(val[0]>=length){
  3. val=[length-1]
  4. }else if(val[0]<0){
  5. val=[0]
  6. }
复制代码
之后我再回过头优化这个项目代码时发现这里(强制使用时将数组转为数字,反馈时将数字转为数组)实在大可不必:

JavaScript似乎对数据有本身“独特”的处理方式,但是现在笔者还没找到相干资料~~
如何判断一个值能不能作为数组下标(索引)
但是可以肯定的是:为整数属性键赋值是数组才有的特例,由于它们与非整数键的处理方式差异。要判断一个属性是否能作为数组的索引,笔者找到了ES6规范文档中的一段话:
  1. 当前仅当 [code]ToString(ToUint32(P))
复制代码
等于P,而且
  1. ToUint32(P)
复制代码
不等于
  1. 2^32-1
复制代码
时,字符串属性名称P才是一个数组索引。[/code]这个操纵用JS可以如许实现:
  1. function toUint32(value){
  2.         return Math.floor(Math.abs(Number(value))) % Math.pow(2,32);
  3. }
  4. function isArrayIndex(key){
  5.         let numericKey=toUint32(key);
  6.         return String(numericKey) == key && numericKey < (Math.pow(2,32)-1);
  7. }
复制代码
  1. toUint32()
复制代码
函数通过规范中形貌的算法将给定的值转换为无符号32位整数;
  1. isArrayIndex()
复制代码
函数中先将键转换为uint32布局,然后进行两次比力(
  1. toString()
复制代码
后等不等于原数而且是否小于
  1. 2^32-1
复制代码

有了这个根本,我们就可以基于此去简朴模仿一下
  1. new Array()
复制代码
的行为 —— 此中最紧张的还是关于length的形貌:
  1. function createArray(length=0){
  2.         return new Proxy({ length },{
  3.                 set(trapTarget,key,value){
  4.                         let currentLength=Reflect.get(trapTarget,"length");
  5.                         if(isArrayIndex(key)){
  6.                                 let numericKey=Number(key);
  7.                                 if(numericKey >= currentLength){
  8.                                         Reflect.set(trapTarget,"length",numericKey+1);
  9.                                 }
  10.                         }else if(key === "length"){
  11.                                 if(value < currentLength){
  12.                                         for(let index=currentLength-1;index >= value;index--){
  13.                                                 Reflect.deleteProperty(trapTarget,index);
  14.                                         }
  15.                                 }
  16.                         }
  17.                         // 无论key是什么类型都要执行这段代码
  18.                         return Reflect.set(trapTarget,key,value);
  19.                 }
  20.         });
  21. }
复制代码
实行一下:


总结
到此这篇关于JS数组索引检测中的数据类型问题详解的文章就先容到这了,更多相干JS数组索引检测的数据类型内容请搜索脚本之家从前的文章或继承欣赏下面的相干文章希望各人以后多多支持脚本之家!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作