700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > js的数据类型 以及如何判断它们是哪种类型

js的数据类型 以及如何判断它们是哪种类型

时间:2019-01-01 15:30:26

相关推荐

js的数据类型 以及如何判断它们是哪种类型

一、js的数据类型:null 、 nudefined 、number、Boolean、string、array、object

二、判断js的数据类型

(1)值类型

console.log(typeof(x)); // undefined

console.log(typeof(10)); // number

console.log(typeof('abc')); // string

console.log(typeof(true)); // boolean

console.log(typeof (null)); //object ==> 结果是object,但是属于值类型

(2)引用类型

console.log(typeof(function () { })); //function

console.log(typeof([1, 'a', true])); //object

console.log(typeof ({ a: 10, b: 20 })); //object

console.log(typeof (new Number(10))); //object

typeof对js数据的判断结果共有6种:

undefined, number, string, boolean, function, object

1、分类:

简单的值类型(不是对象):null、undefined、boolean、number、string。

复杂的引用类型(是对象):函数、数组、对象、new Number(10)、new String('10')、new Boolean(true)、正则、日期等等。

2、为什么说null不是对象呢?typeof null 的值不是object吗?

a. 它老祖宗都不认他。

console.log(null instanceof Object); // false

b.对象的定义是:若干属性的集合,而null不符合对象的定义,不是引用类型。

var nullType = null;

nullType.a = 123; // 报错 ==> Unexpected token .

综上:null不是一个对象,不是复杂的引用类型。null最初是用来表示空对象的,但是不属于对象。typeof对null的判断是js的一个bug。

三、如何判断一个变量的数据类型

1、值类型的类型判断用typeof

// 值类型

console.log(typeof(x)); // undefined

console.log(typeof(10)); // number

console.log(typeof('abc')); // string

console.log(typeof(true)); // boolean

//虽然function也是一个引用类型对象,但是可以通过typeof判断:

var fn = function() {};

console.log(typeof fn); // function

如何判断null类型?用 ===:

console.log(null === null); // true

不能用 == ,因为:

console.log(null == undefined); // true

console.log(null === undefined); // false

2、引用类型的类型判断用instanceof

//引用类型

console.log(new String('string') instanceof String); // true

console.log(new Number(10) instanceof Number); // true

console.log(new Boolean(true) instanceof Boolean); // true

console.log(new Array(3,4,5) instanceof Array); // true

console.log([] instanceof Array); // true

var fn = function() {}

console.log(fn instanceof Function); // true

3、Object.prototype.toString.call( ) 方法

Object。prototype.toString.call()的实现原理

ECMAScript3

toString方法被调用的时候,会执行下面的操作步骤

1、获取this对象的[[Class]]属性值。

2、计算出三个字符串“[object”,第一步的操作结果Result(1),以及"]"连接后的新字符串。

3、返回第二步的操作结果Result(2)

[[Class]]一个字符串值,表明了该对象的类型

然后给了一段解释:

所有内置对象[[Class]]属性的值是由本规范定义的,所有宿主对象的[[Class]]属性的值可以是任意值,甚至可以是内置对象使用过的[[Class]]属性的值.[[Class]]属性的值可以用来判断一个原生对象属于哪种内置类型。需要注意的是,除了通过Object.prototype.toString方法之外,本规范没有提供任何其他方式来让程序访问该属性的值。

ECMAScript5

在toString方法被调用时,会执行下面的操作步骤

1、如果this的值为undefiend,则返回'[object,Undefiend]'

2、如果this的值为null,则返回'[object,Null]'

3、让O成为调用ToObject(this)的结果

4、让class成为O的内置属性[[Class]]的值

5、返回三个字符串"[object",class,以及"]"连接后的新字符串

ES5中,[[Class]]属性的解释更加详细

所有内置对象的[[Class]]属性的值是有本规范定义的,所有宿主对象的[[Class]]属性的值可以是除了"Arguments"、"Array"、"Boolean"、"Date"、"Error"、"Function"、"JSON"、"Math"、"Number'、"Object"、"regExp"、"String"之外的任何字符串。[[Class]]内部属性是引擎内部用来判断一个对象属于哪种类型的值的,需要注意的是,除了通过Object.prototype.toString方法以外,本规范没有提供任何其他方式来让程序访问该属性的值。

总而言之,要获取一个对象的真实的内置类型,我们需要通过获取[[Class]]的属性值,在es5之前,该属性值只能通过Object.prototype.toString来访问,因此,通过Object.prototype.toString.call(arr),改变toString方法的this指向,从而获得对象的内置类型。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。