手机版

JavaScript数据类型的详细说明

时间:2021-09-05 来源:互联网 编辑:宝哥软件园 浏览:

首先,数据类型

以下内容基于ES5(ES6引入了一个新的原始数据类型Symbol,它代表了一个唯一的值。它是JavaScript语言的第七种数据类型。)

JavaScript是一种弱类型的动态语言,在定义变量时不需要指定类型。看似简单,背后却有着复杂的转换逻辑。让我们看看js的常见数据类型及其背后的隐式转换逻辑。

ES5中有五种简单的数据类型(也叫基础数据类型):数字、字符串、布尔值、null和undefined (null和undefined是两种特殊的基础数据类型,下面会介绍);还有一个复杂的数据类型——Object(函数是一个特殊的对象,这将在后面讨论)

未定义的类型:

未定义类型只有一个值,即特殊未定义。当变量用var声明但未初始化时,该变量的值是未定义的,例如:

var消息;alert(消息==未定义);//true此示例仅声明变量message,但不初始化它。将此变量与未定义的文字进行比较,结果显示它们是相等的。这个例子相当于下面的例子:

var消息=未定义;alert(消息==未定义);//true在这个例子中,初始化的变量消息用未定义的值显示,但是我们不需要这样做,因为默认情况下,未初始化的值会得到未定义的值。

(一般来说,没有必要将变量显式设置为未定义的值。字面未定义的主要目的是为了比较,但是在第三版之前的ECMA-262中没有指定这个值。这个值是在版本3中引入的,以正式区分空对象指针和未初始化的变量。)

但是,未定义值的变量不同于尚未定义的变量。请参见以下示例:

var消息;//声明该变量后,默认获取未定义的值。//以下变量没有声明//var agealert(消息);//“未定义”警报(年龄);//error unsightreference error : age未定义(…)要运行上述代码,第一个警告框将显示变量的值消息,即“undefined”。第二个警告框将导致错误,因为未声明的变量age被传递给alert()函数。对于未声明的变量,只能执行一个操作,即可以使用typeof运算符来检测其数据类型。

然而,令人费解的是,对未初始化的变量执行typeof运算符将返回未定义的值,而对未声明的变量执行typeof运算符也将返回未定义的值。请看下面的例子:

var消息;//声明该变量后,默认获取未定义的值。//未声明以下变量//var agealert(消息类型);//“未定义”警报(年龄类型);//'undefined '结果显示,对未初始化和未声明的变量执行typeof运算符会返回undefined值,这在逻辑上是合理的,因为虽然从技术角度来看这两个变量有本质的区别,但实际上不可能对任何一个变量执行真正的操作。

(即使未初始化的变量被自动赋予未定义的值,我们仍然建议读者养成显式初始化变量的习惯——即在声明变量的同时给变量赋值。如果我们能做到这一点,当typeof运算符返回未定义的值时,我们就知道检测到的变量没有被声明,没有被初始化。)

空类型

空类型是第二种只有一个值的数据类型,这个特殊的值是空的。从逻辑角度来看,空值表示空的对象指针,这就是为什么typeof运算符在检测空值时会返回“Object”,如下例所示:

var car=null警报(汽车类型);//“对象”如果将来要使用定义的变量保存对象,最好将变量初始化为null,而不是其他值。这样,只要直接检查null值,就可以知道对应的变量是否保存了对对象的引用,如下例所示:

如果(车!=null){ //对car执行一些操作}事实上,未定义的值是从null值中派生出来的,所以ECMA-262规定它们的相等性测试应该返回true;

alert(null==未定义);//“真”

这里,null和undefined之间的相等运算符(==)总是返回true,但是应该注意的是,该运算符将转换其操作数以进行比较(细节将在后面描述)。

虽然null和udefined有这样的关系,但它们的目的完全不同。如前所述,在任何情况下都没有必要显式地将变量值设置为undefined,但是同样的规则不适用于null。换句话说,只要打算保存对象的变量没有真正保存对象,就应该明确允许它保存空值。这样做不仅体现了null作为指向空对象的指针的约定,而且有助于进一步区分null和undefined。

二、隐性转化

在js中,虽然我们不需要明确定义变量的类型,但是在实际的处理中,会根据不同的类型有不同的处理。先看几个例子:

var x='答案是' 42;//“答案是42”这里的“”将理解为字符串拼接var y=42“就是答案”;//‘42’是答案‘这里’‘将理解为字符串拼接‘37’7;//'377 '这里的''将被理解为字符串拼接' 37 '-7;//30'-'在这里会被理解为减法。我们也可以巧妙地利用类型转换来做一些事情。例如,如果您想将变量num转换为数字类型,非常简单的方法是减去数字“0”。如果要将变量num更改为字符串类型,可以添加空字符串“”。

var numnum=num-0;警报(编号类型);//“number”num=num“”;警报(编号类型);//“字符串”===

严格等于a===b,我们先来判断等号两边的类型。如果双方类型不同,我们会直接返回false,不再继续。如果类型相同,我们将判断值是否要等待。需要注意的是,NaN不想等待与任何东西的比较,包括与自己的比较。此外,JavaScript中的对象是通过引用来比较的,而不是通过值来比较的,所以比较两个对象是不相等的,因为它们不是两个相同的对象。您可以定义一个变量x(无论类型如何),将x与x进行比较,然后返回true。

'1.23'==='1.23';//true null===null;//true undefined==undefined;//truenull===未定义;//FalsNan===NaN;//false NaN属于数字值,你不想等待任何东西,包括比较自己和等待NaN==NaN//false NaN属于数值,不想等待和任何东西比较,包括和自己比较[1,2]===[1,2];//false因为js中对象的比较是通过引用进行的,虽然两边都是数组,但是长度相同,值相同,顺序相同,不是同一个对象。new Object()==new Object();//false通过引用比较,两个空对象不同且不相等。var x;x===x//true定义变量x,并对x和x进行比较,返回true==

如果类型相同,则比较方法与'==='相同;如果类型不同,将尝试类型转换和比较:

null==undefined//Equal number==string//尝试将字符串转换为数字,然后比较1.0==' 1.0 ';//trueboolean==?//不管右边是什么,我们先把布尔转换成数字,真转换成1,假转换成0,然后和右边的比较。//true.object==number | string //将尝试将对象转换为基本类型,然后将其他情况与false进行比较. new String(' hi ')==' hi ';//truenew布尔值(false)=0;//真三。包装对象

数字、字符串、布尔布尔型都有相应的封装类型。我们先举个例子:

从上面的例子可以看出,当一个基本类型(比如string类型)在js中尝试作为对象使用时,比如访问它的length属性或者添加一些属性,js会智能地将操作后的基本类型转换为对应的wrapper类型对象(相当于new String())。这个临时包装对象的内容与基本类型的值相同。当访问或属性设置完成时,这个临时包装对象将是。将数字和布尔值的基本类型转换为包装类型对象的原理是相同的。

var a=' string//定义变量a并分配基本类型“string”alert(a . length);//‘6’创建对应的临时封装对象,访问临时封装对象的长度属性,得到结果6a . t=3;//3、设置成功后,临时对象被销毁,所以下面的警戒值为undefinedalert(a . t);//“未定义”var b=123b . ToString();//'123 '在相应的临时包装对象Number()上调用toString()方法,将其转换为字符串四,并检查类型

1、最常见的是使用typeof运算符,它会返回一个字符串,适用于判断函数Objects和基本类型。如果null失败,它将返回对象。

type of 100/“number”数值typeof NaN//“数字”数值类型为无穷大;//“number”数值类型为true//“Boolean”布尔值类型为(未定义);//“未定义”表示该值没有定义新对象的类型();//'object '对象类型为[1,2];//“object”数组是一个对象,对null类型没有特殊处理;//“对象”空值表示空对象指针,因此返回函数/“函数”的对象类型。从技术上讲,函数是ECMAScript中的对象,而不是数据类型。但是函数确实有一些特殊的属性,所以需要通过Type of运算符来区分函数和其他对象。如果要判断对象类型,常用instanceof,适合用户自定义对象,也可以用来检测原生对象。在不同iframe和window之间进行检测时,基于原型链进行判断。instanceof principle:判断obj对象的原型链上是否存在右构造函数的原型属性。有关原型链的详细信息,请参见下一章。

Obj instanceof Object(obj:必须是对象,如果是基本类型,会直接返回false对象:它必须是函数对象或函数构造函数。如果不是,将引发类型错误异常。)

看一个简单的例子

array的New object()实例==false//true [1,2]array的instance===true//true[]array的instance==true//true我们知道,任何构造函数都有一个prototype object属性,该属性将用作使用新构造函数构造的对象的原型。例如,函数Person有一个原型属性。当我们使用新的Person()创建Person的实例时,对象实例将有一个指向对象Person.prototype的原型。使用var bosn=new Student(),我们创建一个Student实例bosn,而原型bosn,bosn将指向其构造函数Student的原型对象属性。在检测人的玻色子实例时,玻色子。_ _ proto _ _=学生。原型,那么原型链就会继续向上看,还有bosn。_ _原型_ _。_ _ proto _=人。原型。会回归真实。请注意,不同窗口或iframe之间的对象类型检测不能使用instanceof!

3.Object.prototype.toString()确定类型,适合内置对象和基本类型。如果遇到无效和未定义的无效,IE6/IE7/IE8返回“[对象对象]”

object . prototype . tostring . apply([]);==='[对象数组]';object . prototype . tostring . apply(函数(){ });==='[对象函数]';object . prototype . ToString . apply(null);==='[对象Null]';//IE6/IE7/IE8返回“[object object]”object . prototype . tostring . apply(未定义);==='[对象未定义]';//IE6/IE7/IE8返回“[object object]”object . prototype . tostring . apply(' 123 ');==='[对象字符串]';object . prototype . tostring . apply(123);==='[对象编号]';object . prototype . ToString . apply(true);==='[对象布尔值]';object . prototype . ToString . apply(String);==='[对象函数]';object . prototype . tostring . apply(布尔值);==='[object Function]'4,构造函数检测类型

任何对象都有一个从原型继承的构造函数属性,并将被定向到构造该对象的构造函数。构造函数可以重写,所以使用时要小心。

5.鸭型检测型

比如我们不知道一个对象是否是数组,但是可以通过判断对象的长度是否为数字,是否有join、push等数组函数方法,通过特征判断对象是否属于某种类型,这是有时候会用到的。

以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助,也希望多多支持我们!

版权声明:JavaScript数据类型的详细说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。