JavaScript 性能优化之安全类型检测

本文探讨JavaScript内置类型检测机制的局限性,并提供一种更可靠的检测方法,通过调用Object.prototype.toString()来判断值是否为原生数组、函数或正则表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaScript内置的类型检测机制并非完全可靠。比如:

var isArray = value instanceof Array;

以上代码要返回true,value必须是一个数组,而且还必须与Array构造函数在同个全局作用域中。(别忘了,Array是window的属性。)如果value是在另个frame中定义的数组,那么以上代码就会返回false。

解决方法: 众所周知,在任何值上调用Object原生的toString()方法,都会返回一个[obj ect NativeConstructorName] 格式的字符串。每个类在内部都有一个[ [Class]]属性,这个属性中就指定了上述字符串中的构造函数名。

由于原生数组的构造函数名与全局作用域无关,因此使用toString()就能保证返回一致的值。

			//检测是否是原生数组
           function isArray(value) {
                return Object.prototype.toString.call(value) == "[object Array]";
            }
			//检测是否是原生函数	
            function isFunction(value) {
                return Object.prototype.toString.call(value) == "[object Function]";
            }
			//检测是否是原生正则
            function isRegExp(value) {
                return Object.prototype.toString.call(value) == "[object RegExp]";
            }
			//检测是否是原生JSON
            var isNativeJSON = window.JSON && Object.prototype.toString.call(JSON) == "[object JSON]";

有一点我们要注意object . prototpye. toString()本身也可能会被修改。所以我们讨论的技巧是假设0bject. prototpye. toString()是未被修改过的原生版本的情况下。



愿你的坚持终有收获。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值