《JavaScript权威指南》第3章 类型、值和变量
- 计算机程序通过操作值或文本来工作。编程语言中这些可以表示和操作的值被称为类型,一门语言支持的类型集也是这门语言最基本的特征。
- JS类型分为两类:原始类型和对象类型。原始类型是不可修改的,JS的对象类型是可修改的。对象可被称为引用类型,当两个对象值引用同一个底层对象时才是相等的。
- 原始类型包括数值、文本字符串(也称为字符串)和布尔真值(也称为布尔值)。
- JS中的特殊值
null和undefined是原始值,这两个值被认为是各自特殊类型的唯一成员。
- ES6新增的
Symbol(符号),用于对语言进行扩展而不破坏向后兼容性。
- 对象(也就是对象类型的成员)是属性的集合。
- 数组表示一个数字值的有序集合。
Set表示一组值的集合。
Map表示键与值的映射。
- 定型数组类型包括了
RegExp、Date、Error及其子类型表示JS代码运行期间可能发生的错误。
- JS和静态语言的差别之一在于:函数和类不仅仅是语言的语法,它们本身就是可以被JS程序操作的值。
- 在内存管理方面,JS解释器会执行自动垃圾收集。
- 需要留意,不能让某些值在不经意间存续过长时间后仍可触达,从而导致他们无法被回收。
- 面向对象的操作风格是指不用定义全局函数去操作不同类型的值,而是由这些类型本身定义操作值的方法。比如使用
a.sort()而不是sort(a)
- JS中只有
null和undefined是不能调用方法的值。
- JS使用 IEEE 754标准定义的64位浮点格式表示数值,可以准确表示(-2^53-2^53)之间的所有整数。IEEE-754是二进制表示法,无法精确的表示0.1等十进制分数。解决浮点近似值可以考虑等量整数。
- JS支持十六进制,十六进制字面量以
0x或0X开头。ES6支持二进制和八进制,二进制以0b或0B开头,八进制以0o或0O开头。
- 上溢出会给出无穷值Infinity或负无穷值-Infinity,下溢出发生在数值操作的结果比最小可表示数值更接近0的情况,此时会返回0或-0,除了作为除数使用外,无法区分0或-0。
- 0除以0会返回NaN(Not a Number,非数值),非数值与任何数比较都不相等,也不等于自己,只能通过
x!=x 或 Number.isNaN(x) 返回true判断。
- JS不允许在使用算数操作符时,混用
BigInt操作数和常规数值操作数。Math对象的任何函数不接收BigInt操作数。
- Date类的时间戳为1970年1月1日起至今的毫秒数。
- ES6中,字符串字面量可以使用反引号来定界,中间可以运行JS表达式。
null和undefined的区别:null是一个语言关键字,一种特殊的对象,表示“没有对象”,undefined表示一种更深层次的不存在,是一个预定义的全局变量。
- 符号(Symbol)可以作为对象的属性名,获取Symbol值需要调用
Symbol()函数,这个函数永远不会返回相同的值,即使每次传入的参数都一样,可以安全地用于为对象添加新属性,不用担心重写已有的同名属性。
- 以相同的字符串调用
Symbol.for()始终返回相同的值。
- ES2020定义了
globalThis作为在任何上下文中引用全局对象的标准方式。
- ES6可以使用
Array.from()复制数组。
- 布尔值在比较前会转换为数值,if语句将
undefined转换为false,==操作符不会将操作数转换为布尔值。
- 格式化与解析数值是计算机程序最常见的错误来源。
- 声明变量的同时为其赋予一个初始值是个好的编程习惯。
- 通过
var声明的全局变量被实现为全局对象的属性,通过let和const声明的全局变量和常量不是全局对象的属性。
- 属性名一定是在冒号左侧,不论是在对象字面量中,还是在对象解构赋值的左侧。