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编程起步(第二课)
Jan 10 Javascript
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
Jul 24 Javascript
jquery提升性能最佳实践小结
Dec 06 Javascript
window.event快达到全浏览器支持了,以后使用就方便了
Nov 30 Javascript
JavaScript使用yield模拟多线程的方法
Mar 19 Javascript
深入剖析JavaScript中的函数currying柯里化
Apr 29 Javascript
Vue实现virtual-dom的原理简析
Jul 10 Javascript
JavaScript生成指定范围的时间列表
Mar 19 Javascript
浅析Vue实例以及生命周期
Aug 14 Javascript
基于 jQuery 实现键盘事件监听控件
Apr 04 jQuery
bootstrap table.js动态填充单元格数据的多种方法
Jul 18 Javascript
vue watch监控对象的简单方法示例
Jan 07 Vue.js
了不起的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
简单易用的计数器(数据库)
2006/10/09 PHP
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
thinkphp3.2.0 setInc方法 源码全面解析
2018/01/29 PHP
详解Laravel5.6 Passport实现Api接口认证
2018/07/27 PHP
Laravel配合jwt使用的方法实例
2020/10/25 PHP
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
JQuery 图片滚动轮播示例代码
2014/03/24 Javascript
Node调试工具JSHint的安装及配置教程
2014/05/27 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
2014/06/22 Javascript
jQuery中:not选择器用法实例
2014/12/30 Javascript
jquery果冻抖动效果实现方法
2015/01/15 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
javascript中$(function() {});写与不写有哪些区别
2015/08/10 Javascript
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
JS简单测试循环运行时间的方法
2016/09/04 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
JavaScript强制类型转换和隐式类型转换操作示例
2019/05/01 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
Python threading多线程编程实例
2014/09/18 Python
用python写的一个wordpress的采集程序
2016/02/27 Python
Python lambda函数基本用法实例分析
2018/03/16 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
Python使用Socket实现简单聊天程序
2020/02/28 Python
canvas 如何绘制线段的实现方法
2018/07/12 HTML / CSS
Hotels.com南非:酒店预订
2017/11/02 全球购物
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
工程师求职简历的自我评价分享
2013/10/10 职场文书
2014年迎新年活动方案
2014/02/19 职场文书
医学生就业推荐表自我鉴定
2014/03/26 职场文书
大学军训自我鉴定大全
2014/09/18 职场文书
3.15消费者权益日活动总结
2015/02/09 职场文书
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python
台式电脑蓝牙适配器怎么安装?台式电脑蓝牙适配器安装教程
2022/04/08 数码科技