一、类型:
计算机程序通过操作值或文本来工作,编程语言中这些可以表示和操作的值被称为类型。
类型可以分为两类:原始类型(不可修改)和对象类型(可修改)。
原始类型:数值、文本字符串、布尔值、null、undefined、symbol(ES6新增)
只有null和undefined是不能调用方法的值。
其余不是原始类型的值都是对象。
普通的JavaScript对象是一个命名值得无序集合。特殊的一个对象,叫做数组。
数组表示一个数字值的有序集合。
函数和类也是特殊的对象。
二、值:
可修改类型的值可以改变,例如修改对象属性和数组元素的值。原始类型是不可修改的。
JavaScript可以自由转换不同类型的值。
三、变量:
常量和变量可以让我们在程序中使用名字来引用值。
常量(无类型):const声明
变量(无类型):let声明
四、数值:
JavaScript的主要数值类型:Number(用于表示整数和近似实数)。
当数值真正出现在JavaScript程序中时,就叫做数值字面量。
任何数值字面量前面都可以加上一个减号将数值变成负值。
1.整数字面量
①10进制:基数为10的整数,可以直接写成数字序列。
②16进制:基数是16,十六进制字面量以0x或0X开头,后跟一个十六进制数字字符串。十六进制数字是数字0到9和字母a(或A)到f(或 F),a到f表示10到15。
③2进制和8进制:在ES6及之后的版本中,也可以通过二进制(基数为2)或八进 制(基数为8)表示整数,分别使用前缀0b和0o(或0B和0O)
2.浮点字面量
浮点字面量可以包含小数点,实数值由数值的整数部分、小数点和数值的小数部分组成。
浮点字面量也可以使用指数记数法表示,即实数值后面可以跟 字母e(或E),跟一个可选的加号或减号,再跟一个整数指数。这种记数法表示的是实数值乘以10的指数次幂。
3.数值字面量中的分隔符
可以用下划线将数值字面量分隔:
4.算术
①JavaScript程序使用语言提供的算术操作符来操作数值,包括表示加法的+、表示减法的-、表示乘法的*、表示除法的/和表示取模(除法后的余数)的%。ES2016增加了取幂的**。
②JavaScript还通过Math对象的属性提供了一组函数和常量
③ ES6在Math对象上又定义了一批函数
④ JavaScript中的算术在遇到:
上溢出(数值操作的结果超过最大可表示数值,结果是一个特殊的无穷值Infinity)
下溢出(数值操作的结果比最小可表示数值更接近0的情况下,JavaScript返回0)
被零除(返回无穷或负无穷,例外:0除以0是没有意义的值,这个操作的结果是一个特殊的“非数值”(NaN,Not a Number))
不会发生错误。
⑤ 无穷除无穷、负数平方根或者用无法转换为数值的非数值作为算术操作符的操作数,结果也都是NaN。
⑥JavaScript预定义了全局常量Infinity和NaN以对应正无穷和非数值。这些值也可以通过Number对象的属性获取:
⑦非数值必须写成x != x或 Number.isNaN(x)。这两个表达式当且仅当x与全局常量NaN具有相同 值时才返回true。
全局函数isNaN()在参数是NaN 时,或者在参数是无法转换为数值的非数值时返回true
Number.isFinite()在参数不是NaN、Infinity或-Infinity时返回 true。
全局isFinite()函数在参数是有限数或者可以转换为有限数时返回true。
⑧负零值与正零值相等(即便使用 JavaScript的严格相等比较),除了作为除数使用
5.二进制浮点数与舍入错误
实数有无限多个,但JavaScript的浮点格式只能表示其中有限个。
JavaScript使用的IEEE-754浮点表示法是一种二进制表示法,这种表示法可以精确地表示如1/2、1/8 和1/1024等分数。常用的分数是十进制分数,二进制浮点无法精确表示。
JavaScript数值有足够大的精度,能够非常近似地表示 0.1,但无法精确地表示。
由于舍入错误,.3和.2近似值的差与.2和.1近似值的差并不相等。
6.通过BigInt表示任意精度整数
①BigInt这种数值类型的值是整数,为了表示64位整数,这对于兼容很多其他语言和API是必需的。但BigInt值可能有数千甚至数百万个数字,可以满足对大数的需求(不过,BigInt的实现并不适合加密,因为它们没有考虑防止时序攻击)。
②BigInt字面量写作一串数字后跟小写字母n。默认情况下,基数是10,但可以通过前缀0b、0o和0x来表示二进制、八进制和十六进制BigInt:
③可以用BigInt()函数把常规JavaScript数值或字符串转换为 BigInt值:
④BigInt值的算术运算与常规JavaScript数值的算术运算类似, 只不过除法会丢弃余数并且会向下(向零)舍入:
⑤虽然标准的+、-、*、/、%和**操作符可以用于BigInt,但不能混用BigInt操作数和常规数值操作数。因为两种类型都不比另一种更通用:BigInt可以表示超大值,因此它比常规数值更通用。但BigInt只能表示整数,这样看常规JavaScript数值类型反而更通用。因此JavaScript只是简单地不允许在使用算术操作符时混用这两种类型的操作数。相比较来说,比较操作符允许混合操作数类型。
⑥位操作符通常可以用于BigInt操作数。但Math对象的任何函数都不接收BigInt操作数。
7.日期和时间
JavaScript为表示和操作与日期及时间相关的数据而定义了简 单的Date类。JavaScript的Date是对象,但也有数值表示形式,即 自1970年1月1日起至今的毫秒数,也叫时间戳。