JavaScript数据检测

前言:随着编程实践的增加,慢慢发现关于数据类型的检测至关重要。我认为程序就是为了处理数据和展示数据。所以,数据的检测对于编程来说也至关重要。因为只有符合我们预期的输入,才可能产生正确的输出。众所周知,JavaScript是弱类型语言,这带来很多便利的同时,也带来了不少问题。为了减少编程实践中在变量判断方面出现的问题,我们需要对不确定的变量进行检测,以保证处理符合预期的数据。本文是对数据检测的总结。

1.检测原始值

ECMAScript 有 5 种原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String。对于原始值,我们可以使用typeof来检测。

 1 // 检测字符串
 2 typeof "str"  // 返回"string"
 3
 4 // 检测数字
 5 typeof 123  // 返回"number"
 6
 7 // 检测布尔值
 8 typeof true  // 返回"boolean"
 9
10 // 检测undefined
11 typeof undefined  // 返回"undefined"
12
13 // 检测null
14 typeof null  // 返回"object"

typeof运算符有个很独特的地方就是,当我们检测一个未声明的变量时也不会报错。未定义的变量和undefined的变量通过typeof检测都将返回“undefined”。

还有就是当我们用typeof检测null变量时,返回的是“object”而不是“null”。null一般是不用于检测语句的,简单地和null比较通常不会包含足够的信息以判断值的类型是否合法。但,当所期望的值确定是null,则可以和null直接比较(===和!==)。

2.检测引用值

引用值也称为对象,在js中除了原始值之外的值都是引用,如Object、Function、Array、String、Boolean、Number、Date等。由于使用typeof检测引用类型时,返回的是“object”,我们并不能真正的获得引用类型的详细信息。而instanceof运算符可以解决这个问题,instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型。与 typeof 方法不同的是,instanceof 方法要求开发者明确地确认对象为某特定类型。基本用法为:

1 value instanceof constructor

其含义是判断一个value是否为constructor对象的实例,如果是则返回true,否则返回false。

instanceof并不仅仅止步于检测构造这个对象的构造器,它还会沿着原型链进行检测。示例如下:

1 var now = new Date();
2
3 console.log(now instanceof Date);  // 输出:true
4 console.log(now instanceof Object); // 输出:true

在默认情况下,每个对象都继承自Object,因此每个对象的 value instanceof Object都会返回true,使用这个方法来判断对象是否属于某个特定类型的做法并非最佳。

instanceof运算符也可以用来检测自定义类型,示例如下:

 1 function BasicType() {
 2      this.property=true;
 3
 4      this.getBasicValue = function(){
 5      return this.property;
 6       };
 7 }
 8
 9 function NewType() {
10      this.subproperty=false;
11 }
12
13 NewType.prototype = new BasicType();
14 var test = new NewType();
15
16 console.log(test instanceof NewType);   // 输出:true
17 console.log(test instanceof BasicType);   // 输出:true
18 console.log(test instanceof Object);   // 输出:true

在JavaScript中检测自定义类型时,最好的做法就是使用instanceof运算符,这也是唯一的方法。

3.检测属性

另外一种用到null(以及undefined)的场景是当检测一个属性是否在对象中存在时,比如:

 1 // 不好的写法:检测假值
 2 if (object[propertyName]) {
 3     // code
 4 }
 5
 6 // 不好的写法:和null比较
 7 if (object[propertyName] != null) {
 8     // code
 9 }
10
11 // 不好的写法:和undefined比较
12 if (object[propertyName] != undefined) {
13     // code
14 }

在上例中,实际上是通过给定的属性名来检测属性的值,而非判断属性是否存在,因为当属性值为假值时结果超出我们的预期,比如0、""、false、null和undefined时。如果我们要检测的属性值为null或者undefined时,以上是哪个判断都会出错。

判断属性是否存在的最好方法是使用in运算符。in运算符只会判断属性存在与否,而不管属性值,这样就避免了上面问题的产生。

 1 var object = {
 2     count: 0,
 3     name: null
 4 };
 5
 6 // 好的写法
 7 if ("count" in object) {
 8     // 执行代码
 9 };
10
11 // 不好的写法:检测假值
12 if (object["count"]) {
13     // 不执行代码
14 };
15
16 // 好的写法
17 if ("name" in object) {
18     // 执行代码
19 };
20
21 // 不好的写法:检测是否为null
22 if (object["name"] != null) {
23     // 不执行代码
24 };

但还有一点需要注意,in运算符也会检测原型链上的所有属性,无论是实例上还是继承对象的原型上具有目标属性,都会返回true。如果需要检测对象的某个属性是否存在,则需要使用hasOwnProperty()方法。所有继承自Object的JS对象都有这个方法,如果实例中包含这个属性则返回true(如果这个属性只存在在原型中则返回false)。

然而,在IE8以及更早版本的IE中,DOM对象并非继承自Object,也就不包含hasOwnProperty()方法。我们在使用hasOwnProperty()方法时,应该先检测是否存在这个方法。

 1 var object = {
 2     count = 0,
 3     name = null
 4 };
 5
 6 // 对于所有的非DOM对象来说,这是最好的实现
 7 if (Object.hasOwnProperty("name")) {
 8     // 执行代码
 9 }
10
11 // 对于所有不确定是否为DOM的对象来说,应该这样实现
12 if ("hasOwnProperty" in Object && Object.hasOwnProperty("name")) {
13     // 执行代码
14 }

不管在任何情况下检测属性的存在性,最好使用in运算符或者hasOwnProperty(),这样可以避免很多bug。

时间: 2024-09-30 00:05:04

JavaScript数据检测的相关文章

每天一个JavaScript实例-检测表单数据

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>每天一个JavaScript实例-检测表单数据</title> <style> [role="alert"]{ background-color: #f

数据去重2---高性能重复数据检测与删除技术研究一些零碎的知识

高性能重复数据检测与删除技术研究 这里介绍一些零碎的有关数据重删的东西,以前总结的,放上可以和大家交流交流. 1 数据量的爆炸增长对现有存储系统的容量.吞吐性能.可扩展性.可靠性.安全性. 可维护性和能耗管理等各个方面都带来新的挑战, 消除冗余信息优化存储空间效率成为 缓解存储容量瓶颈的重要手段,现有消除信息冗余的主要技术包括数据压缩[8]和数据去 重. 2 数据压缩是通过编码方法用更少的位( bit)表达原始数据的过程,根据编码 过程是否损失原始信息量,又可将数据压缩细分为无损压缩和有损压缩.

相似数据检测算法

相似数据检测算法对给定的一对数据序列计算两者之间的相似度([0,1], 1表示完全相同)或距离([0, ), 0表示完全相同),从而度量数据之间的相似程度.相似数据检测在信息科学领域具有非常重要的应用价值,比如搜索引擎检索结果的聚类与排序.数据聚类与分类.Spam检测.论文剽窃检测.重复数据删除.Delta数据编码等应用.正是由于它的重要性,近年来成为了研究的重点,不断有新检测方法涌现并得到评估.其中,Broder提出的shingling算法和Charikar的simhash算法被认为是目前为止

JavaScript 数据实用程序库:Datalib

Datalib 是一个 JavaScript 数据实用程序库. 快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中. <HTML开发Mac OS App 视频教程> 土豆网同步更新:http://www.tudou.com/plcover/VHNh6ZopQ4E/ 百度网盘同步:http://pan.baidu.com/s/1jG1Q58M 分享  [中文纪录片]互联网时代   http://pan.baidu.com/s/1qWkJfc

什么才是正确的javascript数组检测方式

前面的话 对于确定某个对象是不是数组,一直是数组的一个经典问题.本文专门将该问题择出来,介绍什么才是正确的javascript数组检测方式 typeof 首先,使用最常用的类型检测工具--typeof运算符 var arr = [1,2,3]; console.log(typeof arr);//'object' 前面已经介绍过,数组的本质是一种特殊的对象,所以返回'object'.typeof运算符只能用来区分原始类型和对象类型,对于更具体的对象类型是无法鉴别出来的 instanceof 这时

javascript 类型检测

javascript类型检测主要包括下面几个方法: typeofinstanceofObject.prototype.toStringconstructorduck type 一.typeof方法 typeof可以检测给定变量的数据类型,对一个值使用typeof操作符可能返回下列某个字符串: “undefined”  如果这个值未定义 “boolean”     如果这个值是布尔值 "string"        如果这个值是字符串 “number”     如果这个值是数值 “obj

JavaScript 数据访问(通译自High Performance Javascript 第二章) [转]

JavaScript 数据访问(通译自High Performance Javascript 第二章) 提问者:lilei335260(ID:160310) | 悬赏 0.0 希赛币 | 回答数:12 | 关注度:32 | 提问时间:2014-05-03 JavaScript 数据访问(翻译自High Performance Javascript 第二章) 计算机科学中一个经典的问题是决定如何存储数据,以便进行快速的读取和写入操作. 在代码执行期间,数据如何存储将会关系到它们的检索速度.在Jav

Solr5.5视频教程|基于微博数据检测的Solr5.5实战开发

Solr5.5视频教程之基于微博数据检测的Solr5.5实战开发 课程不错,直接分享下载网盘地址----https://pan.baidu.com/s/1jKkWSV8 密码: y5x6 备用地址(腾讯微云):http://url.cn/5HAAdG6 密码:dg64Im 在海量数据的情况下,传统的关系型数据库已经力不从心,快速检索已经成为了应用系统所必备的功能之一.本课程从实战角度出发,让学员能从实战中学习到: 搜索引擎的原理及架构. 掌握在大数据环境下经典检索算法. 掌握如何使用solr实现

相似数据检测算法汇总

相似数据检测算法对给定的一对数据序列计算两者之间的相似度([0,1], 1表示完全相同)或距离([0, ), 0表示完全相同),从而度量数据之间的相似程度.相似数据检测在信息科学领域具有非常重要的应用价值,比如搜索引擎检索结果的聚类与排序.数据聚类与分类.Spam检测.论文剽窃检测.重复数据删除.Delta数据编码等应用.正是由于它的重要性,近年来成为了研究的重点,不断有新检测方法涌现并得到评估.其中,Broder提出的shingling算法和Charikar的simhash算法被认为是目前为止