Repository navigation
学习ECMAScript规范(一) #21
Description
Activity
阅读ECMAScript规范(一)
JavaScript语言类型
类型(Type)
规范给的定义是
set of data values as defined in clause 6 of this specification翻译一下就是本规范第6章定义的数据的值的集合,那我们看一下第六章定义了哪些类型。
-
第一部分是JavaScript里面的所有数据类型,Null,Undefined,Boolean,Number,String,Symbol以及Obect。
-
第二部分是ES6提出的一些新概念
-
List Type
指代js中的类数组,例如arguments,只是一个简单的有序集合,可以通过类似数组的访问方式访问元素。eg. List[0]代表List的第一个元素。 -
Record Type
指代规范中的一种数据聚合,类似对象格式,也是键值对的一种。字段名总是用[[]]包裹,字段值可以是js中的值也可以是与某个Record Type关联的抽象值。eg.{[[name]]: 'slj', [[age]]: 23, [[value]]: empty} -
Completion Record Type
指代js中每个语句或者流程控制语句执行完的状态,是一个 Record。Completion Record 的 fileds 如下表:Field Value Meaning [[type]] One of normal, break,continue,return, throw The type of completion that occured [[value]] any js value or empty The value that was produced [[target]] any js string or empty The target label for directed control transfers. type 为 normal 的时候就是 normal completion,表示运行正常。除了 normal completion 其他的都成为 abrupt completion,throw completion 是运行出错的时候返回的。
-
The reference Type之类的大家自己可以去看一下规范中的解释。
-
更加学术的定义就是由具有特殊含义但都有某个相同的特点的一群事物组成的集合。集合中的事物可以是有限的,也可以是无限的。
成员(Member)
其实上面已经给出了成员的定义,每个类型集合里面的具有特殊意义的事物就是成员。举几个例子:
null is and is the only member of Null type undefined is and is the only member of Undefined type 0, 1, 2, ... both are a member of Number其实这些写出来都很简单,但是意义就是为了不要把成员和类型混为一谈,这是两个不同层面上的概念。
一些规范规定而不需要去认知的概念
- null, undefined, 1, 'test', true等是原始值(Null,Undefined,Number,String,Boolean,Symbol的成员都是原始值(primitive value)),原始值的特点就是值不可更改。
- 每个对象都有一个隐式属性(__proto__)指向自己的原型对象(原型可能为null)。
- js数字值采用的是64位双精度二进制IEEE754标准(导致一些计算,比较会出现精度的问题)。
- NaN就是IEEE754标准里面的(not a number),是Number类型的一个成员。
- 当一个函数作为一个对象的方法被调用时,该对象会被当作this传递给这个方法。
等等规范规定的东西,需要的不是理解,是记住,就像游戏规则一样。
“一切皆为对象”的探讨
JavaScript中经常听到一句话,一切皆为对象,这句话其实需要加一个限定条件,JavaScript一切引用类型皆为对象。其实JavaScript中只有值类型和引用类型,值类型就是值为原始值的集合,那么JavaScript七大类型里,Null,Undefined,Boolean,String,Number,Symbol都是值类型,那么剩下的只有Object这一类型了,所以就不难理解所有的引用类型都是对象。
争议: null 是不是 Object? why
typeof null is 'object'
关于 typeof null 这个问题其实是一个 bug,而且是从第一版遗留下来的问题(详细了解)。null 是一个原始值,前面说了原始值都是值类型。其实验证 null 是不是 Object 的更准确的是 instanceof 操作。
争议:why 'test' has length, indexOf etc property and method?
看资料是说会产生一个临时对象new String(string)。所以length,indexOf等是其实是挂载在String.prototype上面的共享属性和方法。IEEE 754标准
IEEE 754标准定义了浮点数的格式与异常值,一些特殊值(Infinity 和 NaN),以及这些数值的浮点数运算符,也指明了四中数值舍入规则和五种例外状况。
IEEE 754提供了四中浮点数值的表示方式: 单精度(32位)、双精度(64位)、延伸单精度(43bit以上)、延伸双精度(79bit以上),JavaScript采用的是双精度(64位)浮点数表示方式。
双精度(64位)浮点数
双精度浮点数使用64位来存储一个浮点数。他可以表示10进制的15或16为有效数字,表示的数字的绝对值范围大约是
通过二进制的科学计数法进行存储,为了最大精度的表示数字,格式为
s * m * 2^e- s是符号位,也是最高位,0表示正数,1表示负数。
- e表示指数位,占据最高位以后的11位,ECMAScript规范给定e的范围是[-1074, 971]
- m是尾数,占据52位,但是为了小数更加精确的表示,通常会将m转化为1~2之间的一个小数1.M * 2^l,所以其实也可以表示为s * (1.m * 2^l) * 2^e.
在js中,每个正数都有一个与之相对的绝对值相等的负数。
-
Number.MAX_VALUE & Number.MIN_VALUE
Number.MAX_VALUE = 1 * (2^53 - 1) * 2^971 = 1.7976931348623157e+308(53是因为前面的1.m的1)
Number.MIN_VALUE = 1 * 1 * 2^-1074 = 5e-324
注:Number.MIN_VALUE并不是最小的数,而是说最靠近0的数,最小的数是-Number.MAX_VALUE -
Number.MAX_SAFE_INTRGER & Number.MIN_SAFE_INTRGER
Number.MAX_SAFE_INTEGER = 2^53
Number.MIN_SAFE_INTEGER = -2^53
-

