javascript的数据类型

来源:互联网 发布:python flask上传图片 编辑:程序博客网 时间:2024/03/29 14:11

一.基本类型和复杂类型?值类型和引用类型

基本类型(值类型):Undefined,Null,Boolean,Number,String

复杂类型(引用类型):Object

  从基本类型和复杂类型的角度对js类型进行分类其实不太合适,这样的分类方式,正如'基本'和'复杂'两个名词的含义一样,就是对简单和复杂的区分.我觉的更有必要说一说的是值类型和引用类型,几乎所有的语言的数据类型都可以从值和引用两个角度去分类。值和引用类型如同C语言中的基本类型和指针的区别。值类型直接存储数据,引用类型的数据实体存储在堆里面,当前变量只存储对象的引用.js从技术角度来说他是面向对象的,他具备面向对象编程要求实现的大部分技术要求,但是从语言本身没有对这些技术进行真正的抽象,所有我们在使用的时候,很多时候感觉不到它有多么的面向对象,我们只能用一些奇怪的拙劣的语句和方式去模拟面向对象,这种实现方式看上去不是那么面向对象,但无论怎么说它也满足了面向对象编程的一些准则.而且我们从这种拙劣的方式中反而能加深我们对面向对象技术的理解,因为你在用一些方式去模拟面向对象,说明面向对象在你心中已经有了一定的概念, 在你抽象和实践的过程中,你会明白,普通的代码,是怎么抽象组织成面向对象的思维.而这正是那些号称真正的面向对象语言不具备的,那些语言已经把面向对象的思维整合进语言内部了,我们只是遵循语言的设计规则去使用面向对象.但你真正的对面向对象的理解有多深呢。

  本质上来熟,动态语言所有的数据类型都有统一的数据结构,这样在才能实现变量的动态性,所以无论是值类型还是复杂类型在js 引擎内部是有着统一的数据结构的,一般是一个结构体,标识类型的具体分类.我们在这个层面上讨论值类型和引用类型.关于js引擎内部具体怎么实现数据类型的结构化这个在不同的引擎内部可能都不一样,但我们要有一个概念,知道我们所学习分析的内容是处于哪个抽象层级之上.再往上的东西稍微了解下,这样分析问题的时候才不会被蒙蔽双眼,走进死胡同.

1.js中的类型转换

js中的类型转换无常不在,大部分的时候我们使用的是隐式转换, 比如var a = 1+"2";这里存在一个数据类型的转换,数值类型被转换为字符串类型,设计到不同数据类型之间的操作都会进行数据转换.而且这种转换之间存在某种优先级和规则.

我们经常写的一个语句

if(a){//一些执行逻辑}

这也是一种转换,if语句只能判断布尔表达式,但是变量a可能是其他类型,所以在判断之前就会先对当前类型进行转换,转换成boolean类型在进行判断.这里罗列些基本的判断准则:

1)对于数值类型,非0即为true

2)undefiend为false

3)null为false

4)非空字符串为true

5)对象为true

所有看似简单的,习以为常的语句可能背后蕴含很多细节需要我们去注意.

还有一个很重要的类型转换的使用场景,就是包装类,基本类型到引用类型的转换,这个在面向对象语言中叫做装箱和拆箱,概念上是相同的.

但在js中装箱操作更隐蔽和智能。还记得我们经常对基本类型执行一些操作么,比如

var a = "12331231";var b = a.subString(4);

在js中字符串是基本类型,这和很多其他语言的处理都不一样.大家都知道'点'操作只能用于引用类型上面,只有引用类型才有属性成员的概念,对于基本类型来说,其本身就

代表着所要表达的数据.这里其实有个装箱的过程在我们对基本类型进行'点'操作的时候,基本类型会被瞬间装箱成一个对应的包装类,boolean类型对应Boolean,数值类型对应Number,字符串类型队员String.程序对装箱完的包装类再进行操作,操作完成后立即销毁包装类.这个过程引擎帮我们完成了。所以日常使用中我们似乎感受不到,值类型和引用类型在具体操作上面的区别

2.关于 null,undefined,NAN

相信很多初学者都对这个三个关键词搞的很烦,当然也有一些文章介绍三者的区别,用法和适用场景, 如果仅仅满足于使用的话,那我们也没有必要单独拿出来讨论这三个关键字了。

null和undefined还有NAN在js中都有特殊的语意

undefinde表示变量声明了但是未被赋值

null 一般表示声明的变量为引用类型,但是引用为空

NAN (not a number)表示在我们做数值类型转换的时候,被转换实体无法转换成数值类型时返回的值.比如

var a = parseInt("asdasd");console.info(a);//此时会输出NAN

前面我们说过所有的数据类型都有着统一的数据结构,一般是一种结构体,这个结构体中存储这关于当前变量的各种元信息,比如具体类型,值,作用域等等.这些结构对语言使用者来说是透明的.现在我们站在语言开发者的角度理解下null,undefined还有 NAN的区别

三者都有相同的数据结构,在这个数据结构中如果数据项类型没有值的话那么这个变量就会是undefined类型,

如果明确了是object类型,但是指针域(指向堆中的数据实体)没有赋值,那么其就表现为null.所以一般建议,初始化对象变量的时候赋值为null

如果明确变量不是数值类型那么就会把在结构体中某个数据项置个标识,标识这个变量为NAN.可能是在数据类型这个数据项,也可能是其他

数据项,这完全取决于js引擎的实现.(在这里,我们站在语言实现者的角度考虑三者之间的关系,并不是说js引擎真的是这么实现的,就如同java虚拟机

能实现java虚拟机规范的,都可以称为java虚拟机,具体的实现细节和思想则各有不同,所以我们在这里只是建立了一个数据类型系统的解析模型.便于理解一些在使用角度不太能理解的概念。而且这些实现也是遵循ECMAScript的设计规范)。

 

3.令人激动的Object

js中最让人激动且强大的Object类型.object是类么?你可以把它理解为通常面向对象的语言中的类,但其表现和使用又和传统的类有很大的出入.

我们通常用new 操作符去声明一个对象.但有一个例外就是函数,对函数也是对象。我们也可以通过new操作符去声明一个对象,比如

var fun = new Function("a","b","alert(a+b);");

Function最后一个参数表示函数实体,前面表示形参.当然不推荐使用这种方式创建函数, 但是有助于我们理解函数的本质.

在js中对象这个概念非常强大,从使用者的角度对象就是无序的map集合.我们可以用字面形式声明一个对象比如:

var a = {};var b= {"a":1,"b":function(){}};

所以对于在js中的对象看上去很简单.这种简单仅仅是我们在平常使用的时候,当我们要利用js创建一个框架封装一些可复用组件的

时候,还必须结合很对关于js中object类型的知识,才能构建出一个稳定的可扩展的强大的组件或者框架.关于对js面向对象编程的探讨

放在以后的章节去讨论.

4.总结

脚本语言或者动态语言的一般都是弱类型语言,弱类型语言,弱类型语言的类型系统非常隐晦,通常我们在使用中不太关心的.但是往往出问题

时却不知道如何下手,所以对js的类型系统一定要由清晰的独到的认识和理解.遇到问题的时候才能,有章可循.

 

1 0
原创粉丝点击