【数值】
JavaScript
的主要数值类型 Number
用于表示整数和近似实数。
JavaScript
使用 IEEE 754 标准 定义的 64 位浮点格式表示数值,这意味着 JavaScript
可以表示:
- 最大整数是 ±1.797 693 134 862 315 7 × 10 3 0 8
- 最小整数是 ± 5 X 10 324
整数字字面量
-
JavaScript
程序中,基数为 10 的整数可以直接写成数字序列。 -
JavaScript
也支持十六进制(基数是 16 的)值。十六进制字面量以 开头,后跟一个十六进制数字字符串。十六进制数字是数字0-9和字母 a (或 A)到 f(或 F), 表示 10到15 。 - 在 ES6 及之后的版本中, 也 可以通过 二 进制(基数为 2 )或 八 进制(基数为 8 )表示整数,分别使用前缀 。b 00 (或 08 00 ):
0b10101 // => 21: (1*16 +日* + 吃+ l*l)
00377 I I => 255: (3*64 + 7*8 + 叫)
浮点数字面量
- 浮点字面量可以包含小数点,它们对实数使用传统语毯 实数值由数值的整数部分数点和数值的小数部分组成。
- 浮点字面量也可以使用指数记数怯表示,即实数值后面可以跟 (或 ),跟一个可边的加号或减号,再跟 个整数指数 这种记数居表示的是实数值乘以 的指数次幕。更简洁的语陆形式为:
[digits][. digits][ (EI e)[ (+I - ) ]digits ]
例如:
3.14
2345.6789
. 333333333333333333
6.02e23 II 6.@2 x 23
1.4738223E- 32 II 1.4 822] X 1@ -32
数值字面量中的分隔符
let bi.Hi.on = _00。一000_000// 下划线作为千分位分 隔符
let bytes = 0x89_AB_CD_EF; // 作为 字节分隔符
let bi.ts = 0b0001 1101 0111; // 作为 字节分隔符
let act i.o = 0.123_456_789; //也可以用在小数部分
JavaScript
中的算术
-
JavaScript
程序使用语 言提供 的算术操作符来操作数值,包括 表示加栓的 + 、表示 减法的 - 、表示乘陆的气表示除法的 / 和 表示 取模(除陆后的 余数) 的 % 。 ES2016 增加了取幕的** 。 -
JavaScript
还通过 Math 对象的属 性提供了一组函数和
常量,以 支持更复杂的数学计算:
Math . pow( 2, 53) // => 9001199254740992 : 2的53次方
Math ound(.6)//=>1.0 舍入到最接近的整数
Math .ceH( . 6) //=>1. 0上舍入 个整数
th .floor(. 6) // => 舍入到一个整数
Math. abs( - 5) //=> 绝对值
Mat h.l'lax( x,y,z ) //返回最大的参数
Mat h.l'li.n(x, y , z) //返回最小的参数
ath random() //伪随机数 x,其中0= <x< 1. 0
ath .PI//圆周率
Math .E //e:自然对数 的底数
ath .sqrt(3)//=> 3“ 0 . 5 : 的平方根
Math. pow( 3, 1/ 3) // => 3**( 1/3) 的立方根
Math. si.n( 0) //三角函数 Math.cos ath.ata等
Math.log(10) //10 的自然对数
ath .log( 100 )/ ath .LN10//10 为底 00 的对数
Math .log(S12)/ Math. LN2 //以2为底 的对数
Math .exp( 3) // Math.E 的立方
ES6 Math 象上又定义了 批函数
Math .cbrt( 27) //=>3 立方根
Math. hypot( 3, 4) //=>5 有参 方和 的平
Math. log10( 100) //=>2以10 为底的对数
Mat h. log2( 1024) // => 10 以2为底的对数
Math. loglp(x) // (l+ x)的自 然对数 确到 小的x
Math. expl'll(x) // Math,exp(x)-1 Math.loglp () 的逆运算
Math.si.gn( x) //对 < 或==或>0的参数返回
Ma th . i.1'1ul( 2, 3) // => 优化的 位整 乘法
Math . clz32( 0xf) // => 28: 32 整数 中前 位数
Math trunc( 3.9) //=> ο3 剪掉 数部 得到整数
Math. fround( x) //舍入到最接近的 32 浮点数
Math .si.nh(x) //双曲 弦,还有 ath.cosh () ath. nh()
Math . asi.nh( x) // 线反 还有 Math. acosh () Mat h. atanh()
JavaScript
中的算 术 在 遇到 上溢 出、下 溢 出 或被 零除 时不 会 发生错误。在 数 值操作的结果 超过 最大可表示 数值时(上溢出), 结果是一个特 殊 的 无穷值 Infinity
。类 似地, 当某个负数的绝对值超过了最大可表示负数的 绝 对值时,结果是负 无 穷值- Infinity
。这两个无穷值的行为眼我 们 的预期 一样 : 任 何数加、减、乘 、除无穷值结果还是无穷值(只是符号可能相反)
二进制浮点数与舍入错误
实数有无限多个,但
JavaScript
的浮点格式只能表示其中有限个(确切地说,是18 437 736 874 454 810 627 个)。这意味着在通过JavaScript
操作实数时,数值表示的经常是实际数值的近似值。JavaScript
(以及所有现代编程语 )使用的 IEEE-754 浮点表示法是 进制表示法,这种表示怯可以精确地表示如 1/1024 等分数。然而,我们最常用的分数(特别是在进行财务计算时)是十进制分数: 1/10 100 等等。 进制浮点表示法无法精
确表示哪怕 0. 这么简单的数。
如果浮点近似值对你的程 是个问题,可以考虑使用等量整数。例如:计算、钱数有关的数值时可以使用整数形式的美分,而不是零点几美元。
通过 BigInt
表示任意精度整数
ES2020 JavaScript
义了 种新的数值类型 Biglnt
2020 初, Chrome irefoxEdge Node都实现了这个类型, Safari也在实现中。顾名思义, Biglnt
这种数值类型的值是整数。之所以增加这个类型, 要是为了表示 64 位整数,这对于兼容很多其他语言和API 是必需的。但 Biglnt
值可能有数千甚 数百万个数字,可以满足对大数的需求(不过, Biglnt
的实现并不适合加密,因为它们没有考虑防止时序攻击)。
Math
对象的任何函数都不接收 Biglnt
操作数
常规数值操作数。
如果一种数值类型比另一种更通用,则比较容易定义民合操作数的计算井返回更通用的类型。
日期和时间
Date
:
- JavaScript 为表示和操作与日期及时间相关的数据而定义了简单的Date JavaScript的Date 是对象,但也有数值表示形式,即自 1970 日起至今 毫秒数,也叫时间戳:
let ti.l'lestal'lp = Date . now(); //当前时间的时间戳(数值)
let now = new Date(); //当前时间的日期对象
let 1'15 = now.getTi.l'le(); //转换为毫秒时间戳
let i.so = now.toISOSt i.ng(); II 转换为标准格式的字符串
【文本】
定义:表示文本的 JS 类型是字符串。
字符串是不可修改的,以 16 个二进制位为一个单位的 “16 位值” 序列,通常一个 16 位值表示一个
Unicode
字符。字符串长度是它所包含的 16 位值的个数。
JavaScript
的字符串和数组都是用从 0 开始的下标索引。第一个 16 位值在位置 0,第二个在位置 1,以此类推。空字符串的长度是 0。不像某些其他语言那样存在字符类型,对于单个字符,在 JS 中就表示为含有一个字符的字符串。JavaScript 使用
Unicode 字符集
的 UTF-16 编码,JavaScript
字符串其实是无符号的 16 位值的序列。最常见的 Unicode 字符用 16 位二进制都能表示得下。但也存在少量的 Unicode 字符需要用两个 16 位才能装得下。比如 :
所以,”字符串的 length 属性表示字符串中的字符个数“这句话对吗?大多数情况是对的,但并不准确,准确的说是表示字符串中 16 位值的个数。
对字符串使用数组下标取值时,按 16 位为单位读取,而未必是字符单位。用比较运算符比较两个字符串时,也是以 16 位值为单位依次比较编码值的大小。
在 ES6 中,字符串是可迭代物,如果对字符串使用 for/of 循环或者散列操作符,那将会按实际字符为单位遍历,而不是按 16 位值。
字符串字面量
-
String
类型
JavaScript
中表示文本的类型是String
,即字符串。
每个值都表示Unicode字符
。
JavaScript
的字符串(以及数组)使用基于零的索引
要JavaScript
可以把字符串放到一对匹配的单引号,双引号还在反引号,双引号字符和反引号。
反引号 定界字符串是ES6的特性 :允许在字符串字面量中包含(或者插入)
JavaScript
t表达式JavaScript
最早版本要求字符串字面量必须写在一行,使用+操作符把单行字符串拼接成长字符串的JavaScript
代码
"hello"+"word"
但是到了es5 ,我们可以在后面加一个\从而把字符串字面量写到多行上
"weo/fff"
"weo\
fff\
"
到了es6反引号语法支持跨行字符串
`
aaaaaaaaaaaa
aaaaaaaaaaaa
aaaaaaaaaaaa
`
注意!!!
最好
JavaScript
和HTML
分别使用不同的引号字符串字面量中的转义序列
反斜杠(/)在JavaScript字符串中有特殊作用,它与后面的字符组合在一起,可以在字符串中表示一个无法直接表示字符比如说\n是一个表示换行符的转义序列
要在 JavaScript
程序中包含字符串,可以 符串放到 对匹配的单引号、双引号或者反引号(\”或、)中。
双引号字符和反引号可以出现在由 引号定界的 符串中, 同理
由双引号和反引号定界的 符串里 可以包含另外两种引号。
字符串字面量
例子:
'' ''//空字符串 即有零个字符
’ testing'
” 3.14”
nafTle =” fTlyfo fTI "’
”Wouldn ’ t you efe 'Rei. lly ’s book?”
” I i.s the ati.o of a ci. cle's ci. CUfTlfe ence to i.ts adi.us
、” She sai.d 'hi.' ", he sai.d.
使用反引号定界 符串是 ES6 的特性,允许在丰符串 字面量中包含(或插入 JavaScript
表达式。
JavaScript 最早的版本要求字符串字面 必须 ,使用+ 操作符把单行字符串
接成长字符串的 JavaScript 代码随处可见。
到了 ES5 ,我们可以在每行末尾加一个反斜杠( \)从而 字符串字面量写到多行上。
这个反斜杠和它后面的行终结符都不 不属于字符。
ES6 的反引号支持跨行字符串,而行终结符 是字符串字面量的一部分
//写在一行但表两行的字符串
'two\nli.nes’
//写在三行但只有一行的字符串
one\
long\
li.ne"
//写在两行实际也是两行的字符串:
the newli.ne cha acte at the end of thi.s li.ne
i.s i.ncluded li.te ally i.n thi.s st i.ng
可 以使用 标准的全等 === 和不 全等 !== 操作符比较字符串。只有当这两个字符串具有完
全 相同的 16 位 值的序列 时才相 等 。字 符串 也可以使 用 〈 、 。、〉和〉=操 作符来比较
注意:
要确定 个字符串的长度(即 符串包含的 16 位值的个数), 以使用字符串的 length属性,除了 length
属性之外, JavaScrip
还提供了操作字符串的丰富 API
记住
JavaScript
中的字符串是不可修改的。像replace ()
和 toUppe rCase ()
这样的方法都返回新字符串,它们并不会修改调用它们的字符串。字符串也可以被成只读数组,使用方括号而非 cha At ()
方法访问字符串中个别的字
符( 16 值):
let s =”hello, wo ld";
s.4 模板字面量0] //=>'h'
s[s. length -1) //=>"d"
模板字面量
定义:面量可以用反引号来定界。
let a=hello world;
- 模板字面量可 以包含任意JavaScript 表达式。反引号中字符串 字面量最终值的计算, 步及对其中包 的所有表达式求值、将这些表达式的值转换为字符串,然后再把这些 符串与反引号中的字面
组合:
let nar1e =”Bi.ll”;
let greeting = ` Hello${ nar1e }//greeting=="Hello Bill."
模式匹配
定义:
JavaScript
定义了 种被称为正则表达式(或 RegExp
)的数据类型,用于描述和匹配文本中的字符串模式。
于Reg ExP
很强大,用于处理文本,简单介绍下:
- 对斜杠之间的文本构成正则表达式 面量。这对斜杠中的第 个后面也可以跟 个或多个字母,用于修改模式的含义。
- /^HTML/; //匹配字符串开头的字母html/[1-9][0-9]*/ ; //匹配非0数字,后面跟着任意数字;
RegExp
对象定义了 些有用的方法,而字符串也有接收RegExp
参数的方告。例如:
let text = ”testi.ng: 1, 2, 3'’ ; //示例文本
let patte = /\d+/g ; //匹配一个或多个数字
pattern . test(text)// => true :存在匹配项
text.seach(pattern)// => 第一个匹配项的位置