JavaScript中的类型(一)

一、关于类型

什么叫做类型?简单地说,类型就是把内存中的一个二进制序列赋予某种意义。比如,二进制序列0100 0000 0111 0000 0001 0101 0100 1011 1100 0110 1010 0111 1110 1111 1001 1110如果看作是64位无符号整数类型就是4643234631018606494 而按照IEEE 754规定的浮点数二进制表示规则(见附1)双精度浮点类型则是257.331。

变量类型

大部分计算机语言使用变量来存储和表示数据,一些语言会给变量规定一个类型,在整个程序中(不论是编译时还是运行时),这个类型都不能被改变。与此相对,JavaScript和一些其它语言的变量可以存储任何类型,它们使用无类型的变量。变量类型是否存在,是跟语法无关的,例如C#中也提供了var类型的变量,但是,下面的语句在C#中会出错:

var a=1;

a=”string”;

原因是C#的var关键字只是省略了变量类型声明,而根据初始化表达式自动推断变量类型,所以C#的var变量仍然是有类型的。而JavaScript中,任何时刻你都可以把任何值赋值给特定变量,所以JavaScript变量是无类型的。

强类型和弱类型

按照计算机语言的类型系统的设计方式,可以分为强类型和弱类型两种。二者之间的区别,就在于计算时是否可以不同类型之间对使用者透明地隐式转换。从使用者的角度来看,如果一个语言可以隐式转换它的所有类型,那么它的变量、表达式等在参与运算时,即使类型不正确,也能通过隐式转换来得到正确地类型,这对使用者而言,就好像所有类型都能进行所有运算一样,所以这样的语言被称作弱类型。与此相对,强类型语言的类型之间不一定有隐式转换(比如C++是一门强类型语言,但C++中double和int可以互相转换,但double和任何类型的指针之间都需要强制转换)

为什么要有类型

类型可以帮助程序员编写正确的程序,它在实际编写程序的过程中体现为一种约束。一般规律是,约束越强越不容易出错,但编写程序时也越麻烦。变量有类型的强类型语言约束最强,典型代表是C++,变量无类型的弱类型语言约束最弱,典型代表是JavaScript。在JavaScript中,因为约束比较弱,所以容易出现这种错误:

var a =200;

var b ="1";

var c= a + b;

你可能期望c是201,但实际上它是"2001",这个错误在强类型语言中决不会出现。然而正是因为JavaScript没有这些约束,所以可以很方便地拼接数字和字符串类型。所以,约束和灵活性对语言的设计者而言,永远是需要平衡的一组特性。

静态类型和动态类型

类型是一种约束,这种约束是通过类型检查来发生作用的。在不同语言中,类型检查在不同的阶段发生作用,这样又可以分为编译时检查和运行时检查。对于JavaScript这样的解释型语言,也有跟编译过程比较相似的阶段,即词法分析和语法分析,解释型语言的类型检查若在语法分析或者之前的阶段完成,也可以认为类似于编译时检查。所以更合理的说法是静态类型检查和动态类型检查。

有趣的是,很多语言虽然编译时检查类型,但是它的类型信息仍可以在运行时获得,如C#中使用元数据来保存类型信息,在运行阶段,使用者可以通过反射来获取和使用类型的信息。

JavaScript在设计的各个方面都以灵活性优先,所以它使用动态类型检查,并且除了在进行极少数特定操作时,JavaScript不会主动检查类型。你可以在运行时获得任何一个变量或者表达式的类型信息并且通过程序逻辑检查它的正确性。

二、JavaScript标准规定的类型

JavaScript标准中规定了9种类型:Undefined Null Boolean String Number Object Reference List Completion

其中,Reference List Completion三种类型仅供语言解析运行时使用,无法从程序中直接访问,这里就暂不做介绍。下面我们可以了解下这六种类型:

Undefined类型

Undefined类型只有一个值undefined,它是变量未被赋值时的值,在JS中全局对象有一个undefined属性表示undefined,事实上undefined并非JavaScript的关键字,可以给全局的undefined属性赋值来改变它的值。

Null类型

Null类型也只有一个值null,但是JavaScript为它提供了一个关键字null来表示这个唯一的值。Null类型的语义是“一个空的对象引用”。

Boolean类型

Boolean有两种取值true和false

String类型

String类型的的正式解释是一个16位无符号整数类型的序列,它实际上用来表示以UTF-16编码的文本信息。

Number类型

JavaScript的Number共有18437736874454810627 (就是 264-253 +3)个值。JavaScript的Number以双精度浮点类型存储,除了9007199254740990表示NaN,它遵守IEEE 754(见附1)规定,占用64位8字节。

Object类型

JavaScript中最为复杂的类型就是Object,它是一系列属性的无序集合,Function是实现了私有属性[[call]]的Object,JavaScript的宿主也可以提供一些特别的对象。

三、JavaScript使用者眼中的类型:

前面讲了JS标准中规定的类型,然而一个不能忽略的问题是JS标准是写给JS实现者看的,对JS使用者而言,类型并不一定要按照标准来定义,比如,因为JS在进行.运算的时候,会自动把非Object类型转换为与其对应的对象,所以"str".length其实和(new String("str")).length是等效的,从这个角度而言,认为二者属于同一类型也未尝不可。我们利用JS中的一些语言特性,可以进行运行时的类型判别,但是这些方法判断的结果各不相同,孰好孰坏还需要您自己决定。

typeof——看上去很官方

typeof是JS语言中的一个运算符,从它的字面来看,显然它是用来获取类型的,按JavaScript标准的规定,typeof获取变量类型名称的字符串表示,他可能得到的结果有6种:string、bool、number、undefined、object、function,而且JavaScript标准允许其实现者自定义一些对象的typeof值。

在JS标准中有这样一个描述列表:

Type

Result

Undefined

"undefined"

Null

"object"

Boolean

"boolean"

Number

"number"

String

"string"

Object (native and doesn't implement [[call]])

"object"

Object (native and implements [[call]])

"function"

Object (host)

Implementation-dependent

原文地址:https://www.cnblogs.com/xinzhuangzi/p/4100512.html