[JS]JavaScript的数据类型
2016-07-27 00:31
267 查看
Javascript是一门解释型的语言,浏览器充当解释器。js执行时,在同一个作用域内是先解释再执行。解释的时候会编译function和var这两个关键词定义的变量,编译完成后从上往下执行并向变量赋值。
这个图来自于《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
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
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
相关文章推荐
- JavaWeb基础知识:Html,Css和Javascript项目实战
- 关闭chrome访问麦克风标签页上小红点的方法
- BZOJ 1014: [JSOI2008]火星人prefix(未A待续)
- ES6新特性:JavaScript中的Map和WeakMap对象
- 什么是JSON?如何使用?它比BSON更好吗?
- JavaScript中使用bind()方法让代码更干净
- JavaScript强化教程 - 六步实现贪食蛇
- JavaScript 创建对象模式与最佳实践
- 关于json数组的解析
- Javascript 设计模式学习之二 Module(模块)模式
- Javascript 设计模式学习之三 Singleton(单例)模式
- 【笔记】JS事件模型再复习之笔记
- javaScript操作cookie
- FastJson的使用
- JS中使用EL表达式
- 常见JSP中文乱码例子及其解决方法
- Javascript事件委托
- javascript获取网页各种高宽及位置总结
- JavaScript的原型链学习研究
- javascript中的对象字面量为啥这么酷