类型、值、变量
数据类型
原始类型 (Primitive Type):
number
, string
, boolean
, undefined
, null
, symbol
(ES6)
number: 减少浮点数运算,因为它会放大误差
- Numbers in JavaScript are “double-precision 64-bit format IEEE 754 values”
- 整数是浮点数的子集,使用
parseInt(floatnumber, 10)
转换为整数 Number.MIN_VALUE
以及NUMBER.MAX_VALUE
保存了 JS 所能够表示的最小值和最大值,如果超出这个范围,会得到Infinity
这个值(也区分正负)。可用isFinite(res)
判断。
0.1 + 0.2 == 0.30000000000000004
string: 创建即不可改变,且不可以数组的形式访问
Strings in JavaScript are sequences of characters. More accurately, they are sequences of Unicode characters, with each character represented by a 16-bit number.
null
: 表示空值,是一种特殊对象值,表示「非对象」。null是表示程序级的、正常的或在意料之中的空缺。
undefined
: 表示更为深层次的“空值”: 表明变量没有初始化;这和 null
不一样,它不是关键字,它的值就是“未定义”;
null == undefined
可以成立,而区分需要用严格相等运算符 ===
。
boolean false, 0, "", NaN, null, and undefined []
all become false.
ES6 中 Symbol()
构造的 symbol 类型也是一种原始值。
对象类型 (Object Type)
- 原生对象:
Array
,Function
,RegExp
,NaN
,Infinity
… - 宿主对象:全局对象:
window
,document
… - 自定义对象:
var obj = {};
typeof null; // object
typeof NaN; // number
- 对象的复制,Primitive Types 是直接复制其值,但是针对对象的复制的是其 引用值,本质上说是 指针。
类型转换
- 构造器强制转换
var a = Number("2");
var b = String(234);
var c = Boolean(false);
var d = Object(3), new Number(3);
- 主要的转换函数
n.toString();
n.toFixed(num);
n.toExponential(num);
n.toPrecision(num);
parseInt(num, 10);
parseFloat(num, 10);
- 隐式类型转换:解释器自动执行。
变量删除
delete
具有删除变量的能力/能够删除对象的属性,不可删除var申请的属性。- 将变量置为
null
,并且在无引用的情况下能够被垃圾回收自动清理释放内存。
执行环境与作用域
每一个执行环境(Execution Context)都有一个与之关联的 变量对象(Variable Object),环境中定义的所有变量和函数都会保存在这个对象中。虽然对我们编写的代码是无法访问的,但是解析器在处理数据的时候会用到它。
每个函数都有自己的执行环境,当执行流进入一个函数的时候,函数的环境就会被推入一个环境栈中。函数执行后,再弹出,把控制权返还给之前的执行环境。当代码在一个环境中执行的时候,会创建变量对象的一个作用域链(Scope Chain)。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端始终是当前代码所在的环境的变量对象。如果这个环境是函数,则将其活动对象(Activation Object)作为变量对象。活动对象在最开始的时候只包含一个 arguments
独享,作用域链中的下一个变量对象来自外部坏境,再下一个变量对象则来自下一个外部环境,这样一直延展到全局作用域。
内存
垃圾回收机制是自动进行的。标记清除 和 引用计数 是常用的回收方式。但引用计数的回收方法容易导致循环引用而出现内存泄露。
其它
- 理解:变量声明的提升
Object.toString()
,Object.valueOf()
方法的不同,前者返回字符串,后者返回数值。