JS数组索引检测中的数据类型问题详解


Posted in Javascript onJanuary 11, 2021

之前在写微信小程序项目时,里面有一个“城市选择”的功能,笔者用的是 <picker-view> 组件,这个组件比较特别,因为它的 value 属性规定是 数组 格式的。比如: value="[1]"

因为当时对JS变量类型转换的不了解,笔者在代码中写下了这样的几行判断:(这是严谨的)

let val_one=typeof this.data.pIndex=="number"?[this.daya.pIndex]:this.data.pIndex

(:项目中存取元素是动态的!

上面这是因为要使下标动态跟随用户选择,并反馈到wxml里的 value 属性上展示。

但是在这之前还需要做一层判断 —— 因为有的地区是省级市或者直辖市,而且要防止用户“骚操作”,比如一直上拉或者猛的拉出去,这时候再微信小程序中是会报错找不到对应数据的:

let length=placeArray[val_one].sub.length
if(val[0]>=length){
 val=[length-1]
}else if(val[0]<0){
 val=[0]
}

之后我再回过头优化这个项目代码时发现这里(强制使用时将数组转为数字,反馈时将数字转为数组)其实大可不必:

JS数组索引检测中的数据类型问题详解

JavaScript似乎对数据有自己“独特”的处理方式,但是目前笔者还没找到相关资料~~

如何判断一个值能不能作为数组下标(索引)

但是可以肯定的是:为整数属性键赋值是数组才有的特例,因为它们与非整数键的处理方式不同。要判断一个属性是否能作为数组的索引,笔者找到了ES6规范文档中的一段话:

当前仅当 ToString(ToUint32(P)) 等于P,并且 ToUint32(P) 不等于 2^32-1 时,字符串属性名称P才是一个数组索引。

这个操作用JS可以这样实现:

function toUint32(value){
	return Math.floor(Math.abs(Number(value))) % Math.pow(2,32);
}
function isArrayIndex(key){
	let numericKey=toUint32(key);
	return String(numericKey) == key && numericKey < (Math.pow(2,32)-1);
}

toUint32() 函数通过规范中描述的算法将给定的值转换为无符号32位整数;isArrayIndex() 函数中先将键转换为uint32结构,然后进行两次比较(toString()后等不等于原数并且是否小于 2^32-1

有了这个基础,我们就可以基于此去简单模仿一下 new Array() 的行为 —— 其中最重要的还是关于length的描述:

JS数组索引检测中的数据类型问题详解

function createArray(length=0){
	return new Proxy({ length },{
		set(trapTarget,key,value){
			let currentLength=Reflect.get(trapTarget,"length");
			if(isArrayIndex(key)){
				let numericKey=Number(key);
				if(numericKey >= currentLength){
					Reflect.set(trapTarget,"length",numericKey+1);
				}
			}else if(key === "length"){
				if(value < currentLength){
					for(let index=currentLength-1;index >= value;index--){
						Reflect.deleteProperty(trapTarget,index);
					}
				}
			}
			// 无论key是什么类型都要执行这段代码
			return Reflect.set(trapTarget,key,value);
		}
	});
}

实验一下:

JS数组索引检测中的数据类型问题详解

总结

到此这篇关于JS数组索引检测中的数据类型问题详解的文章就介绍到这了,更多相关JS数组索引检测的数据类型内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript实现tabs选项卡切换效果(扩展版)
Mar 19 Javascript
JavaScript类属性的访问方式详解
Feb 11 Javascript
JavaScript中双叹号(!!)作用示例介绍
Apr 10 Javascript
基于jquery实现轮播焦点图插件
Mar 31 Javascript
vue实现app页面切换动画效果实例
May 23 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
Jun 04 Javascript
JavaScript正则表达式和级联效果
Sep 14 Javascript
讲解vue-router之什么是动态路由
May 28 Javascript
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
Jul 31 jQuery
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
Oct 12 Javascript
ajax跨域访问遇到的问题及解决方案
May 23 Javascript
微信小程序移动拖拽视图-movable-view实例详解
Aug 17 Javascript
了不起的11个JavaScript代码重构最佳实践小结
Jan 11 #Javascript
js删除对象中的某一个字段的方法实现
Jan 11 #Javascript
jQuery实现购物车全功能
Jan 11 #jQuery
jQuery实现手风琴特效
Jan 11 #jQuery
iview实现动态表单和自定义验证时间段重叠
Jan 10 #Javascript
JavaScript canvas实现文字时钟
Jan 10 #Javascript
JS代码实现页面切换效果
Jan 10 #Javascript
You might like
使用php显示搜索引擎来的关键词
2014/02/13 PHP
php PDO异常处理详解
2016/11/20 PHP
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
jquery写个checkbox——类似邮箱全选功能
2013/03/19 Javascript
document.compatMode的CSS1compat使用介绍
2014/04/03 Javascript
window.open()实现post传递参数
2015/03/12 Javascript
Angularjs全局变量被作用域监听的正确姿势
2016/02/06 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
vue router2.0二级路由的简单使用
2017/07/05 Javascript
jQuery实现倒计时功能 jQuery实现计时器功能
2017/09/19 jQuery
jQuery中实现text()的方法
2019/04/04 jQuery
ES6知识点整理之Proxy的应用实例详解
2019/04/16 Javascript
elementUI 动态生成几行几列的方法示例
2019/07/11 Javascript
node.js express框架简介与实现
2019/07/23 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
js实现全选和全不选
2020/07/28 Javascript
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
Django中的CBV和FBV示例介绍
2018/02/25 Python
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
实例分析python3实现并发访问水平切分表
2018/09/29 Python
python用post访问restful服务接口的方法
2018/12/07 Python
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
利用python将图片版PDF转文字版PDF
2019/05/03 Python
python  logging日志打印过程解析
2019/10/22 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
Python如何进行时间处理
2020/08/06 Python
美国高品质个性化珠宝销售网站:Jewlr
2018/05/03 全球购物
教师业务学习制度
2014/01/25 职场文书
大学生就业推荐表自我评价
2015/03/02 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
CSS3 天气图标动画效果
2021/04/06 HTML / CSS
浅谈Vue的computed计算属性
2022/03/21 Vue.js