您的位置:首页 > Web前端 > JavaScript

[JS]JavaScript的数据类型

2016-07-27 00:31 267 查看
Javascript是一门解释型的语言,浏览器充当解释器。js执行时,在同一个作用域内是先解释再执行。解释的时候会编译function和var这两个关键词定义的变量,编译完成后从上往下执行并向变量赋值。

foo(); //函数在其声明之前被调用
function foo() {
console.log("hello world");
}
//输出 hello world


强类型和弱类型

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

为什么要有类型

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

JavaScript类型总览 



这个图来自于《JavaScript语言精髓与编程实践》第三章P184页。

内置(Build-in)对象原生(Naitve)对象的区别在于:前者总是在引擎初始化阶段就被创建好的对象,是后者的一个子集;而后者包括了一些在运行过程中动态创建的对象。
引擎扩展对象是一个并不太大的集合,一般来说比较确定,它们也属于引擎的原生对象(但不属于ECMA规范的原生对象)。
宿主对象不是引擎的原生对象,而是由宿主框架通过某种机制注册到JavaScript引擎中的对象。
Math,JSON是以对象形式存在的,无需new。它们的__proto__是Object.prototype。    
console.log(Math.__proto__ === Object.prototype); // true
console.log(JSON.__proto__ === Object.prototype); // true

JavaScript的数据类型问题

1、函数是不是类型?是什么类型?

2、为什么说JavaScript中的函数是“第一型”的?

3、undefined如何“包装成object”?即使你所说的是笔误,那么对于“一切都是对象”的JavaScript,undefined是什么?

4、true与Boolean(true)在类型上有什么不同?

最后强调一下你的用词问题:Undefined是类型,undefined是值类型,’undefined’是类型的名称。此外,应留意JavaScript中存在着值类型引用类型。它事实上有两套类型系统。

第一套类型系统是用typeof来识别,这是这个语言的基本类型系统,只有六种类型,即undefined、number、boolean、string、object与function。我一般也称之为基础类型系统。之所以称为“基础”,是因为第二套类型系统是以它为基础,从object这一种类型中发展起来的,即对象类型系统。

第二套类型系统是用instanceof来识别,它相当于其它高级语言中的is操作/运算。面向对象的多态主要通过as和is来表达,对于JavaScript来说,由于是弱类型的(没有强制类型检查),所以不需要as。
对象类型系统与基础类型系统存在映射关系,例如基础类型的string影射到对象系统中的String。但这只是影射,所以本质上来说string类型不是String类型。两者本质上不同。具体来说,undefined、string、number和boolean是“值类型”;object与function是“引用类型”。由于String、Number与Boolean在基础类型中都属于object类型,是Object()的子类,因此是引用类型。Function()也是引用类型。所有引用类型都可以看着Object()的子类,所以任意函数也是Object()的子类。例如"<匿名函数>
instanceof Object"返回true。

undefined是值类型,它没有对应的对象类型——我们通常可以称之为Undefined类型,但它没有对应的构造器。undefined只有一个值,即undefined。准确地说,undefined表明声明(或产生)了但没有值的变量。而Null也是一个类型,null是它的惟一值(按照语言规则,null也是一个关键字)。Null类型是对象类型,亦即是引用类型。所以Null与Undefined本质的不同,是它们分属在不同的类型系统中,解释着不同类型系统中的“无”的概念。一般来说,DOM中的某个属性或成员如果无值,应该使用null;而JavaScript运算过程中如果出现无值,应该使用undefined。

上面强调要从“两套类型系统”的角度来理解上述类型。而这两个类型系统在JavaScript中是可以混用的,实现这一特性的技术被称为“类包装”。这是JavaScript对Java的主要借鉴,也是后来的.NET对Java的主要借鉴之一——类包装也被称为“装箱”(以及“拆箱”)。JavaScript中的类包装过程出现然属性存取中,即“.运算符”或“[]运算符”。当这两个运算符发现左操作数x是一个“值类型”数据时,将隐式地调用Object(x)过程将它转为对象,因此'abc'.length这个运算实际上就等效于Object('abc').length
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: