首页 > 语言 > JavaScript > 正文

javascript中的数据类型检测方法详解

2024-05-06 15:36:08
字体:
来源:转载
供稿:网友

本文实例讲述了javascript中的数据类型检测方法。分享给大家供大家参考,具体如下:

在javascript中数据类型

值类型: 布尔(Boolean),数值(Number),字符(String),空(Null),未定义(Undefined)

引用类型: 对象(Object),函数(Function),数组(Array),日期(Date),正则(RegExp)等等。

检测方式之 typeof

console.log(typeof undefined)//'undefined'console.log(typeof null) // objectconsole.log(typeof true) //'boolean'console.log(typeof 123) //'number'console.log(typeof NaN) //'number'console.log(typeof "abc") //'string'console.log(typeof function() {}) //'function'var arr=[];console.log(typeof {}) //'object'console.log(typeof arr)//'object'

从上面可以看出来用 typeof 来检测,不严谨。

null 被检测成为了 object,  null 值表示一个空对象指针,用typeof操作符检测null值时会返回object的原因, 这是在设计ECMAscript时候存在的一些bug。

同样是js不严谨的一种表现形式。而数组也被检测成为了一个对象, 所以用这种方式不严谨。

检测方式之 toString.call()

console.log(toString.call(undefined) ) // '[object Window]''console.log(toString.call(null) ) // '[object Window]'console.log(toString.call(true) ) // '[object Boolean]'console.log(toString.call(123) ) // '[object Number]'console.log(toString.call(NaN) ) // '[object Number]'console.log(toString.call("abc") ) // '[object String]'console.log(toString.call(function() {})) // '[object Function]'var arr=[];console.log(toString.call({}) ) // '[object Object]'console.log(toString.call(arr) ) // '[object Array]'

可以看出来出了undefined和null 这两个,其他的检测都还是比较严谨的。

其中toString()函数是window的一个不可枚举函数,继承自Object

还可以写成这样:

window.toString.call('hello'); // "[object String]"Object.prototype.toString.call('hello'); // "[object String]"

检测方式之 constructor

console.log('haha'.constructor == String); // trueconsole.log([].constructor === Array); // trueconsole.log({}.constructor === Object); // trueconsole.log(true.constructor === Boolean); // truevar a = 111; // 此处必须要用变量来代表数字,不然会报错,从这也能看出来js是一门不严谨的语言console.log(a.constructor === Number); // true

我们通过把实例的构造函数指向其他地方,来改变它的constructor,就不安全了,不推荐使用 如下代码所示:

var AAA = function(){}; // 定义一个AAA对象AAA.prototype = { say:function() {  alert('hello'); }}var arr1 = new Array(); // 定义一个数组arr1.constructor = function AAA(){}; // 这里可以改变实例的constructor。arr1.__proto__ = AAA.prototype; // 此处改变了原型链console.log(arr1.constructor); // AAAconsole.log(arr1 instanceof AAA); // true 原型链已经改变,arr1 已经不属于Array了。console.log(arr1 instanceof Array); // false// 下面我们来让AAA的原型链连到 Array上AAA.prototype.__proto__ = Array.prototype;console.log(arr1 instanceof Array); // true            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选