一. 数据类型:
1. undefined: 未声明和未初始化的变量,typeof 操作符返回的结果都是 undefined;(建议未初始化的变量进行显式赋值,这样当 typeof 返回 undefined 时就知道是未声明了,帮助定位问题)
2. null:建议,将即将保存但还未真正保存对象的变量,赋值为 null;
3. number: 保存浮点数需要的内存空间是保存整数值的两倍,因此 ECMAScript 会不失时机的将浮点数值转换为整数值;
4. NaN: isNaN() 用于确定其参数是否“不是数值”;eg: isNaN("blue") —— true (因为不是数值);
附: typeof 可以判断的类型:undefined/boolean/string/number/function;
5. parseInt(): 第二个参数可以指定进制,使参数按照指定进制转换,如不指定进制,则按照十进制转换;
parseFloat() 只解析十进制值,他没有第二个参数指定基数的用法;
6. 转换为字符串: toString() 和 String();(null 和 undefined 没有 toString() 方法)
String() 可将任何类型的值转换为字符串; 转换规则如下:
如果值有 toString() 方法,则调用该方法(没有参数)并返回相应的结果 —— 如果值是 null,则返回 “null” —— 如果值是“undefined”, 则返回“undefined”;
7. 前 ++ 和后 ++:
前++和前--:eg:var age = 28; --age;//28(--age相当于 age = age - 1;age与(--age)整体的值也会变)
后++和后--:eg:
var num1 = 2; var num2 = 20; var num3 = num1-- + num2; //22 (age的值减1,(age--)整体的值不会变) var num4 = num1 + num2; //21
8. 位运算符: 可以提高性能(详见收藏);
9. == 和 !=: 比较 null 与 undefined 时,不能将它俩转换为任何值;
10. switch语句:switch语句在比较值时使用的是全等操作符,因此不会发生类型转换(如,“10” 不等于 10);
二. 变量、作用域和内存问题:
1. 函数传参:参数只能按值传递:当参数为基本数据类型时,直接进行复制操作;当参数为引用数据类型时,将引用地址进行复制给形参,如果在函数内部重新对引用类型的参数进行赋值,此时修改的引用变量参数为局部变量,这个局部的引用对象会在函数执行完毕后立即被销毁;(传参是复制,不能理解为是实参替换形参);函数参数也被当作变量来对待,因此其访问规则与执行环境中的其他变量相同(局部变量,作用域链)。
2. 执行环境及作用域:
(1)延长作用域链:虽然执行环境的类型总共只有两种——全局和局部(函数),但还是有其他办法来延长作用域链。这么说是因为有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。在两种情况下会发生这种现象。具体来说,就是当执行流进入下列任何一个语句时,作用域链就会得到加长:try-catch 语句的 catch 块;with 语句。
这两个语句都会在作用域链的前端添加一个变量对象。对 with 语句来说,会将指定的对象添加到作用域链中。对 catch 语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。
(2)垃圾回收机制:
- 标记清除”是目前主流的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,然后再回收其内存。
- 解除变量的引用不仅有助于消除循环引用现象,而且对垃圾收集也有好处。为了确保有效地回收内存,应该及时解除不再使用的全局对象、全局对象属性以及循环引用变量的引用。