本文为对《JavaScript权威指南》第三章:类型、值、变量精读的读书笔记,对重点进行了记录以及在一些地方添加了自己的理解。
JavaScript类型可以分为两类:原始类型和对象类型。Javascript的原始类型包括数值、文本字符串(也称字符串)和布尔类型(也称布尔值)。
在Javascript中,任何不是数值、字符串、布尔值、符号、null和undefined的值都是对象。
JavaScript与静态语言的差别在于,函数和类不仅仅是语言的语法,它们本身就是可以被JavaScript程序操作的值。与其他JavaScript非原始值一样,函数和类也是特殊的对象。
在内存管理方面,JavaScript解释器会执行自动垃圾收集。这意味着JavaScript程序员通常不用关心对象或其他值的析构与释放。当一个值无法触达时,或者说当程序无法以任何方式引用到这个值时,解释器就知道这个值以及用不到了,会自动释放它占用的内存(但是Javascript程序呀有时需要留意,不要让某些值在不经意间存续过长时间后仍可触达,从而导致它们无法被回收)。
JavaScript支持面向对象的编程风格。初略地说,这意味着不用定义全局函数去操作不同类型的值,而是由这些类型本身定义操作值的方法。比如说要对数组元素进行排序,不用把数组传给一个sort()函数,而是直接可以调用数组a的sort()方法:a.sort()
在JavaScript中,只有null和undefined是不能调用方法的值。
在实践中,相等操作符==已经被弃用,取而代之的是不会做类型转换的严格相等操作符===。
常量使用const声明,变量使用let声明。JavaScript常量和变量是无类型的(untyped),声明并不会限定要赋何种类型的值。
这一章的内容非常宽泛,设置到了JavaScript如何表示和操作数据的很多基础性细节。
当数值真正出现在JavaScript程序中的时候,就叫做数值字面量(numeric literal)。任何数值字面量前面都可以加上一个减号(-)来将数值变成负值。
比如-11,无需写成 -1*11.
浮点字面量中,可以包含小数点。
也可以使用指数计数法来表示。也就是实数值后面跟一个字母e(或E),跟一个可选的加号或者减号,再跟一个整数指数。
简洁的符号表示为:
【digits】【 . digits】【(E|e)【(+|-)】digits】
也可以用下划线将数值字面量分割,为了更加容易看清数字段。这样子是不会报错的。
例如:let billion = 1_000_000_000;
除了基础的加减乘除取模之外,ES6新增了取幂运算符 **.
注意,JavaScript中的算数在遇到上溢出、下溢出或者被零除时不会发生错误。
Javascript预定义了全局常量Infinity和NaN以应对正无穷和非数值。
1.在数值操作的结果超过最大可表示数值时(上溢出),结果是一个特殊的无穷值 Infinity。同理,负数对应的是负无穷值就是 -Infinity。任何数加减乘除无穷值的结果还是无穷值(只是符号可能相反)。
2.下溢出发送在数值操作的结果比最小可表示数更接近0的情况下。 此时,JavaScript返回0。如果下溢出来自负数,JavaScript返回一个被称为“负零”的特殊值。这个值与常规的零几乎完全无法区分
3.被零除在JavaScript中也不是错误的,只会简单的返回无穷或负无穷。但是!有一个例外:当0除以0时是没有意义的值,这个操作的结果是一个特殊的“非数值”(NaN,NotaNumber).此外,无穷除无穷,负数平方根或者用无法转换为数值的非数值作为算术操作符的操作数,结果也都是NaN
注意,非数值在JavaScript中有一个不同寻常的特性:它与任何值比较都不相等,也不等于自己。
所以我们不可以通过 x === NaN 来判断a是否是非数值,我们需要使用 x!=x或者Number.isNaN(x)来判断。
BigInt
ES2020为JavaScript定义了一种新的数值类型BigInt。
BigInt这个数值类型表示的值是整数。增加这个类型主要是为了表示64位整数。(它的实验不适合加密,因为它们没有考虑防止时序攻击)
BigInt字面量写作一串数字后跟小写字母n。例如1234n。(这里举的一个不太大的BigInt字面量)
日期和时间
let timestamp = Date.now(); //当前时间的时间戳(数值)
let now = new Date(); //当前时间的日期对象
let ms = now.getTime(); //转换为毫秒时间戳
let iso = now.toISOString(); //转换为标准格式的字符串
要在js程序中包含字符串,可以把字符串放到一对匹配的单引号(’)、双引号(“)或者反引号(`)中。其中一种也可以出现在其他两种引号内部(你懂我的意思吧..)
就比如:‘name = "myfrom" '
而使用反引号定界字符串是ES6的特性,允许在字符串字面量中包含或插入js表达式。即表达式插值语法。
我们可以在每行末尾加一个反斜杠(\)从而把字符串字面量写到多行上。租房反斜杠和他后面的行终结符都不属于字符串字面量。(如果要在单引号或者双引号字符串中包含换行符,需要使用字符序列\n)
’two\nlines‘//写在一行但表示两行
如果要将js和html代码混合在一起,最好js和html分别使用不同的引号。
拼接字符串是js的一个内置特性,可以使用标准的全等===和不全等!==操作符比较字符串。
js提供了丰富的操作字符串API。
注意:js中的字符串是不可修改的。
像replace()和同UpperCase()这样的方法都返回一个新字符串,它们并不会修改调用它们的字符串,这意味着我们需要去接收结果值而不是直接操作。
模板字面量
let s = `hello world`
这不仅仅是一种新的字符串字面量语法,因为模板字面量可以包含任意js表达式。
反引号中字符串字面量最终值的计算,涉及了其中包含的所有表达式求值、将这些表达式的值转换为字符串,然后再把这些字符串与反引号中的字面量组合:
let name = "STATICHIT";
let greeting = `Hello ${name}.`; //greeting == "Hello STATICHIT"
(注意好好理解这个例子,反引号中的不是直接字面量,而是需要通过计算和处理得到最终的真实字面量,注释中的即为真实字面量)
位于 ${和对应的} 之间的内容都被当作js表达式来解释。
模板字面量可以包含任意数量的表达式。