GVKun编程网logo

javascript 判断数据类型的几种方法(javascript判断数据类型的方法有)

21

在本文中,您将会了解到关于javascript判断数据类型的几种方法的新资讯,同时我们还将为您解释javascript判断数据类型的方法有的相关在本文中,我们将带你探索javascript判断数据类型

在本文中,您将会了解到关于javascript 判断数据类型的几种方法的新资讯,同时我们还将为您解释javascript判断数据类型的方法有的相关在本文中,我们将带你探索javascript 判断数据类型的几种方法的奥秘,分析javascript判断数据类型的方法有的特点,并给出一些关于isArray()函数(JavaScript中对象类型判断的几种方法)_javascript技巧、JavaScript isArray()函数判断对象类型的种种方法_javascript技巧、JavaScript 判断对象是否为空的几种方法、javascript 判断数据类型 判空的实用技巧。

本文目录一览:

javascript 判断数据类型的几种方法(javascript判断数据类型的方法有)

javascript 判断数据类型的几种方法(javascript判断数据类型的方法有)

<p><strong>javascript 判断数据类型的几种方法</strong><br><strong><em>一、typeof 直接返回数据类型字段,但是无法判断数组、null、对象</em></strong></p>


typeof 1
"number"

typeof NaN
"number"

typeof "1"
"string"

typeof true
"boolean"

typeof undefined
"undefined"

typeof null
"object"

typeof []
"object"

typeof {}
"object"

<p><strong><em>其中 null, [], {}都返回 "object"</em></strong></p> <p><strong>二、instanceof 判断某个实例是不是属于原型</strong></p>


// 构造函数
function Fruit(name, color) {
    this.name = name;
    this.color = color;
}
var apple = new Fruit("apple", "red");

// (apple != null)
apple instanceof Object  // true
apple instanceof Array   // false

<p><strong>三、使用 Object.prototype.toString.call()判断</strong></p> <p>call()方法可以改变this的指向,那么把Object.prototype.toString()方法指向不同的数据类型上面,返回不同的结果</p>


Object.prototype.toString.call(1)
"[object Number]"

Object.prototype.toString.call(NaN);
"[object Number]"

Object.prototype.toString.call("1");
"[object String]"

Object.prototype.toString.call(true)
"[object Boolean]"

Object.prototype.toString.call(null)
"[object Null]"

Object.prototype.toString.call(undefined)
"[object Undefined]"

Object.prototype.toString.call(function a() {});
"[object Function]"

Object.prototype.toString.call([]);
"[object Array]"

Object.prototype.toString.call({});
"[object Object]"

<p><strong>最后我们可以定义一个完美的判断数据类型的方法 _typeof()</strong></p>


function _typeof(obj){
  var s = Object.prototype.toString.call(obj);
  return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};


_typeof([12,3,343]);
"array"

_typeof({name: ''zxc'', age: 18});
"object"

_typeof(1);
"number"

_typeof("1");
"string"

 _typeof(null);
"null"

_typeof(undefined);
"undefined"

_typeof(NaN);
"number"

_typeof(Date);
"function"

_typeof(new Date());
"date"

_typeof(new RegExp());
"regexp"

isArray()函数(JavaScript中对象类型判断的几种方法)_javascript技巧

isArray()函数(JavaScript中对象类型判断的几种方法)_javascript技巧

1) typeof 运算符
typeof 是一元运算符,返回结果是一个说明运算数类型的字符串。如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在)。
但 typeof 的能力有限,其对于Date、RegExp类型返回的都是"object"。如:

typeof {}; // "object"
typeof []; // "object"
typeof new Date(); // "object"

所以它只在区别对象和原始类型的时候才有用。要区一种对象类型和另一种对象类型,必须使用其他的方法。如:instanceof 运算符或对象的 constructor 属。

2)instanceof 运算符。
instanceof 运算符要求其左边的运算数是一个对象,右边的运算数是对象类的名字或构造函数。如果 object 是 class 或构造函数的实例,则 instanceof 运算符返回 true。如果 object 不是指定类或函数的实例,或者 object 为 null,则返回 false。如:

[] instanceof Array; // true
[] instanceof Object; // true
[] instanceof RegExp; // false
new Date instanceof Date; // true

所以,可以用instanceof运算符来判断对象是否为数组类型:

function isArray(arr)
{
return arr instanceof Array;
}

3)constructor 属性。
JavaScript中,每个对象都有一个constructor属性,它引用了初始化该对象的构造函数,常用于判断未知对象的类型。如给定一个求知的值通过typeof运算符来判断它是原始的值还是对象。如果是对象,就可以使用constructor属性来判断其类型。所以判断数组的函数也可以这样写:

function isArray(arr)
{
return typeof arr == "object" && arr.constructor == Array;
}

很多情况下,我们可以使用instanceof运算符或对象的constructor属性来检测对象是否为数组。例如很多JavaScript框架就是使用这两种方法来判断对象是否为数组类型。
但是检测在跨框架(cross-frame)页面中的数组时,会失败。原因就是在不同框架(iframe)中创建的数组不会相互共享其prototype属性。例如:
复制代码 代码如下:

<script> <BR>window.onload=function(){ <BR>var iframe_arr=new window.frames[0].Array; <BR>alert(iframe_arr instanceof Array); // false <BR>alert(iframe_arr.constructor == Array); // false <BR>} <BR></script>





在Ajaxian上看到了一种精确的检测方法,跨原型链调用toString()方法:Object.prototype.toString()。可以解决上面的跨框架问题。

当Object.prototype.toString(o)执行后,会执行以下步骤:
1)获取对象o的class属性。
2)连接字符串:"[object "+结果(1)+"]"
3)返回 结果(2)

例如:

Object.prototype.toString.call([]); // 返回 "[object Array]"
Object.prototype.toString.call(/reg/ig); // 返回 "[object RegExp]"

这样,我们就可以写一个健壮的判断对象是否为数组的函数:
复制代码 代码如下:

function isArray(arr)
{
return Object.prototype.toString.call(arr) === "[object Array]";
}

此种方法得到国外多个javaScript大师的认可,在即将发布的jQuery 1.3中将使用这种方法来检测数组。

prototype.js的一个维护者写了下面这个函数,用于获取对象的类型名

function __getClass(object)
{
return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
};

扩展一下,用于检测各种对象类型:
复制代码 代码如下:

var is =
{
types : ["Array", "Boolean", "Date", "Number", "Object", "RegExp", "String", "Window", "HTMLDocument"]
}

for(var i = 0, c; c = is.types[i ++ ]; )
{
is[c] = (function(type)
{
return function(obj)
{
return Object.prototype.toString.call(obj) == "[object " + type + "]";
}
}
)(c);
}
alert(is.Array([])); // true
alert(is.Date(new Date)); // true
alert(is.RegExp(/reg/ig)); // true

JavaScript isArray()函数判断对象类型的种种方法_javascript技巧

JavaScript isArray()函数判断对象类型的种种方法_javascript技巧

1) typeof 运算符
typeof 是一元运算符,返回结果是一个说明运算数类型的字符串。如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在)。
但 typeof 的能力有限,其对于Date、RegExp类型返回的都是"object"。如:
复制代码 代码如下:

typeof {}; // "object"
typeof []; // "object"
typeof new Date(); // "object"

所以它只在区别对象和原始类型的时候才有用。要区一种对象类型和另一种对象类型,必须使用其他的方法。如:instanceof 运算符或对象的 constructor 属。

2)instanceof 运算符。
instanceof 运算符要求其左边的运算数是一个对象,右边的运算数是对象类的名字或构造函数。如果 object 是 class 或构造函数的实例,则 instanceof 运算符返回 true。如果 object 不是指定类或函数的实例,或者 object 为 null,则返回 false。如:

[] instanceof Array; // true
[] instanceof Object; // true
[] instanceof RegExp; // false
new Date instanceof Date; // true

所以,可以用instanceof运算符来判断对象是否为数组类型:

function isArray(arr)
{
return arr instanceof Array;
}

3)constructor 属性。
JavaScript中,每个对象都有一个constructor属性,它引用了初始化该对象的构造函数,常用于判断未知对象的类型。如给定一个求知的值通过typeof运算符来判断它是原始的值还是对象。如果是对象,就可以使用constructor属性来判断其类型。所以判断数组的函数也可以这样写:

function isArray(arr)
{
return typeof arr == "object" && arr.constructor == Array;
}

很多情况下,我们可以使用instanceof运算符或对象的constructor属性来检测对象是否为数组。例如很多JavaScript框架就是使用这两种方法来判断对象是否为数组类型。
但是检测在跨框架(cross-frame)页面中的数组时,会失败。原因就是在不同框架(iframe)中创建的数组不会相互共享其prototype属性。例如:
复制代码 代码如下:

<script> <BR>window.onload=function(){ <BR>var iframe_arr=new window.frames[0].Array; <BR>alert(iframe_arr instanceof Array); // false <BR>alert(iframe_arr.constructor == Array); // false <BR>} <BR></script>




在Ajaxian上看到了一种精确的检测方法,跨原型链调用toString()方法:Object.prototype.toString()。可以解决上面的跨框架问题。

当Object.prototype.toString(o)执行后,会执行以下步骤:
1)获取对象o的class属性。
2)连接字符串:"[object "+结果(1)+"]"
3)返回 结果(2)

例如:

Object.prototype.toString.call([]); // 返回 "[object Array]"
Object.prototype.toString.call(/reg/ig); // 返回 "[object RegExp]"

这样,我们就可以写一个健壮的判断对象是否为数组的函数:
复制代码 代码如下:

function isArray(arr)
{
return Object.prototype.toString.call(arr) === "[object Array]";
}

此种方法得到国外多个javaScript大师的认可,在即将发布的jQuery 1.3中将使用这种方法来检测数组。

prototype.js的一个维护者写了下面这个函数,用于获取对象的类型名
复制代码 代码如下:

/**
* Returns internal [[Class]] property of an object
*
* Ecma-262, 15.2.4.2
* Object.prototype.toString( )
*
* When the toString method is called, the following steps are taken:
* 1. Get the [[Class]] property of this object.
* 2. Compute a string value by concatenating the three strings "[object ", Result (1), and "]".
* 3. Return Result (2).
*
* __getClass(5); // => "Number"
* __getClass({}); // => "Object"
* __getClass(/foo/); // => "RegExp"
* __getClass(''''); // => "String"
* __getClass(true); // => "Boolean"
* __getClass([]); // => "Array"
* __getClass(undefined); // => "Window"
* __getClass(Element); // => "Constructor"
*
*/
function __getClass(object)
{
return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
};

扩展一下,用于检测各种对象类型:
复制代码 代码如下:

var is =
{
types : ["Array", "Boolean", "Date", "Number", "Object", "RegExp", "String", "Window", "HTMLDocument"]
}

for(var i = 0, c; c = is.types[i ++ ]; )
{
is[c] = (function(type)
{
return function(obj)
{
return Object.prototype.toString.call(obj) == "[object " + type + "]";
}
}
)(c);
}
alert(is.Array([])); // true
alert(is.Date(new Date)); // true
alert(is.RegExp(/reg/ig)); // true

JavaScript 判断对象是否为空的几种方法

JavaScript 判断对象是否为空的几种方法

一. 使用JSON.stringify()将对象转换为json字符串

这个方法比较讨巧,也是最容易想到的。我们都知道JSON.stringify()的作用是将Javascript对象转换为JSON字符串。所以,可以通过该方法判断对象是否为空:

const obj = {}
const obj2 = new Object()

console.log(JSON.stringify(obj) === ''{}'')  // true
console.log(JSON.stringify(obj2) === ''{}'')  // true

注意:

  • 该方法有个缺点,JSON.stringify()只能序列化对象的可枚举的自有属性,即如果有属性是不可枚举或继承属性的话,结果也是true

    const obj = {}
    ​
    // 在原型上添加一个可枚举属性
    Object.prototype.name = ''Jack''
    ​
    console.log(JSON.stringify(obj) === ''{}'')  // true
    ​
    // 在obj对象上添加一个不可枚举属性
    Object.defineProperty(obj, ''age'', {
     value: 18,
     enumerable: false
    })
    console.log(JSON.stringify(obj) === ''{}'')  // true

扩展:

在实际开发项目中,我觉得JSON.stringify()的使用场景还是挺多的,比如:

  • 使用 JSON.stringify() / JSON.parse() 结合 localStorage / sessionStorage 实现对象的缓存存取;
  • 实现对象的深拷贝(注意:若对象中包含时间对象、函数、undefined等该方法存在的问题)。
  • 更多内容请移步 MDN

二. for…in循环

使用for...in循环遍历对象除Symbol以外的所有可枚举属性,当对象有属性存在返回false, 否则返回true。

const obj = {}

function isObjectEmpty(obj){
    for(var key in obj){
        return false
    }
    return true
}
console.log(isObjectEmpty(obj)) // true

有时我们需要只考虑对象自身的属性,而不是继承来的,这时可以配合Object.getOwnPropertyNames() 或 Object.hasOwnProperty() 来进行过滤。

function isObjectEmpty (obj) {
    for (let key in obj) {
        if(obj.hasOwnProperty(key)) return false
    }
    return true
}

三. Object.getOwnPropertyNames()

Object.getOwnPropertyNames() 方法会返回该对象所有可枚举和不可枚举属性的属性名(不含Symbol属性)组成的数组。然后再通过判断返回的数组长度是否为零,如果为零的话就是空对象。

const obj = {}
console.log(Object.getOwnPropertyNames(obj).length === 0)  // true

注意:该方法对于不可枚举的属性也能检测出来。

Object.defineProperty(obj, ''age'', {
    value: 18,
    enumerable: false
})
console.log(Object.getOwnPropertyNames(obj).length === 0)  // false

四. Object.keys()

Object.keys() 是 ES5 新增的一个对象方法,该方法返回一个数组,包含指定对象自有的可枚举属性(不含继承的和Symbol属性)。用此方法只需要判断返回的数组长度是否为零,如果为零的话就是空对象。

const obj = {}
console.log(Object.keys(obj).length === 0)  //true

Object.prototype.name = ''Jack''
Object.defineProperty(obj, ''age'', {
    value: 18,
    enumerable: false
})

console.log(Object.keys(obj).length === 0)  //true

五. 使用外部库

有很多外部的库也可以用来检查空对象。并且,它们大多数对旧的浏览器有很好的支持。

  • jQuery 中的 isEmptyObject 方法

    jQuery.isEmptyObject({})  // true
  • Lodash的 isEmpty 方法

    _.isEmpty({})  // true

使用该方法的缺点就是需要安装额外的库。所以,根据开发情况选择适合的就好。

javascript 判断数据类型 判空

javascript 判断数据类型 判空

javascript 判断数据类型 判空

function isNull_Undefined(obj) {
  return obj===null|| obj === undefined;
}

function isArray(obj){
  return !isNull_Undefined(obj)&&(typeof obj==''object'')&&obj.constructor==Array;
}

function isString(str){
  return !isNull_Undefined(str)&&(typeof str==''string'')&&str.constructor==String;
}

function isNumber(obj){
  return !isNull_Undefined(obj)&&(typeof obj==''number'')&&obj.constructor==Number;
}

function isDate(obj){
  return !isNull_Undefined(obj)&&(typeof obj==''object'')&&obj.constructor==Date;
}

function isFunction(obj){
  return !isNull_Undefined(obj)&&(typeof obj==''function'')&&obj.constructor==Function;
}

function isObject(obj){
  return !isNull_Undefined(obj)&&(typeof obj==''object'')&&obj.constructor==Object;
}

function isNotEmptyString(str){
  return isString(str) && str.length>0;
}

function isNotEmptyArray(obj){
  return isArray(obj) && obj.length>0;
}

export {
  isArray,
  isString,
  isNumber,
  isDate,
  isFunction,
  isObject,
  isNull_Undefined,
  isNotEmptyString,
  isNotEmptyArray,
}

今天的关于javascript 判断数据类型的几种方法javascript判断数据类型的方法有的分享已经结束,谢谢您的关注,如果想了解更多关于isArray()函数(JavaScript中对象类型判断的几种方法)_javascript技巧、JavaScript isArray()函数判断对象类型的种种方法_javascript技巧、JavaScript 判断对象是否为空的几种方法、javascript 判断数据类型 判空的相关知识,请在本站进行查询。

本文标签: