二、JS回味——类型、值、变量

JS的数据类型分为2类:原始类型(包括数字、字符串和布尔值)和对象类型

JS中有2个特殊原始值:nullundefined,在JS中只有它俩是无法拥有方法的值。

JS中出列数字、字符串、布尔值、nullundefined外就是对象。对象是属性的集合,每个属性都由*”名/值对“*(值可以是原始值,也可以是对象)构成。

JS的特殊对象:

  • 全局对象
  • 数组:表示带编号的值的有序集合,普通的对象是*“命名值”*的无序集合。
  • 函数:具有与它相关联的可执行代码的对象,通过调用函数来运行可执行代码,并返回运算结果。对于JS函数来说,最重要的是,它们都是真值,且JS可以将它们当做普通对象来对待。

构造函数:用来初始化一个新建对象的函数。每个构造函数定义了一类对象——由构造函数初始化的对象组成的集合。

:可以看做是对象类型的子类型。除数组类和函数类外,JS语言核心定义了其他3种有用的类:

  • 日期类:定义了代表日期的对象;
  • 正则类:定义了表示正则表达式的对象;
  • 错误类:定义了表示JS程序中运行时错误和语法错误的对象。

JS解析器有自己的内存管理机制,可以自动对内存进行垃圾回收。意味着程序可以按需创建对象,程序员无需担心这些对象的销毁和内存回收。

JS的变量是无类型的,变量可以被赋予任何类型的值,也可以重新赋予不同类型的值。


1.数字

JS不区分整数值和浮点数值。JS中所有数字均用浮点数值表示。JS采用IEEE754标准定义的64位浮点格式表示数字,意味着它能表示的最大值是±1.7976931342623157x10308,最小值是±5x10-324

按JS中的数字格式,能够表示的整数范围是从-253~253,包含边界值。若使用了超过此范围的整数,则无法保证低位数字的精度。

JS中实际的操作是基于32位整数。

数字直接量:一个数字直接出现在JS程序中。JS支持多种格式的数字直接量。

在任何数字直接量前添加符号可以得到其负值,但负号是一元求反运算符,并不是数字直接量语法的组成部分)。

1.1 整型直接量

在JS程序中,用一个数字序列表示一个十进制整数。

JS的十六进制直接量以0x0X为前缀,其后跟随十六进制数串的直接量。

JS的八进制直接量以数字0开始,其后跟随0~7之间的数字组成的序列。ES标准不支持八进制直接量,但JS的某些四线可以允许采用八进制形式表示整数,有些不支持,因此最好不要使用以0为前缀的整形直接量。在ES6的严格模式下,八进制直接量是明令禁止的。

1.2 浮点整型直接量

浮点整型直接量可以含有小数点,它们采用的是传统实数写法。一个实数由整数部分、小数点和小数部分组成。 还可以使用指数计数法表示浮点型直接量,即在实数后跟“e”或“E”,后再跟正负号,再加一个整型的指数。

3.1415926E-12  ==>  3.1415926x10^-12

1.3 JavaScript中的算数运算

除基本运算符外,JS支持的更复杂的算数运算通过作为Math对象的属性定义的函数和常量来实现。

JS的算术运算在溢出、下溢、被零整除时会不会报错。

溢出:当数字运算结果超出JS所能表示的数字上限,结果为一个特殊的无穷大值Infinity。同样,负无穷大在JS中以-Infinity表示。无穷大值的行为特性和平时数学中是一样的:给予它们的加减乘除运算结果还是无穷大值(还保留其正负号)。

下溢:当前运算结果无限接近于0并比JS能表示的最小值还小时发生的一种情形。这种情况下JS会返回0。当一个负数发生下溢时,JS返回一个特殊的值“负零”-0,这个值几乎和正常的零完全一样,很少用到。

负零值有些特殊:它和正零值是相等的(使用JS的严格相等测试来判断也一样)。这两个值几乎一模一样,除了作为除数之外。

被0整除在JS中不报错:它只是简单地返回Infinity-Infinity。有个例外,0除以0是没有意义的,这种整除运算结果是一个非数字值NaN

无穷除以无穷、给任意负数作开方运算或算术运算符与不是数字或无法转换为数字的操作数一起使用时都将返回NaN。

在JS中,NaN有一点特殊:它和任何值都不相等,包括自身。也就是说没有办法通过“x==NaN“来判断x是否是NaN,而用”x!=x“可以判断出来,isNaN()作用与此类似。 isFinite()在参数不是NaNInfinity-Infinity时返回true。

1.4 二进制浮点数和四舍五入错误

在JS中使用实数,常常只是真实值的一个近似表示。

JS采用IEEE-754浮点数表示法,这是一种二进制表示法,可以精确地表示分数(如1/2、1/8、1/1024)。但常用的分数都是十进制分数(1/10等)。二进制浮点数表示法不能精确表示类似0.1这样简单的数字。JS中的数字不能精确表述会带来一些问题。

var x = .3 - .2; // 0.3-0.2
var y = .2 - .1; // 0.2-0.1
x == y;           // => false:两值不等
x == .1;         // => false:.3-.2 != .1
y == .1;         // => true:.2-.1 == .1
// 在JS真实运行环境中,0.3-0.2=0.09999999999999998,由于摄入误差,0.3和0.2之间的近似差值实际上不等于0.2和0.1的近似差值

未完待续…

猜你喜欢

转载自blog.csdn.net/Mirror_r/article/details/84983745
今日推荐