1. JavaScript语言的每一个值,都属于某一种数据类型。JavaScript的数据类型,共有六个类别和两个特殊值。
六个类别的数据类型又可以分成两组:原始类型(primitive type)和合成类型(complex type)。RegExp和Date都不是数据类型,只是构造函数而已(Node, Element 以及 HTMLElement 都不是数据类型,就像Array, Date 和 RegExp一样,他们都属于对象(Object)类型)。
原始类型包括三种数据类型。
- 数值(number)
- 字符串(string)
- 布尔值(boolean)
“数值”就是整数和小数(比如1和3.14),“字符串”就是由多个字符组成的文本(比如"Hello World"),“布尔值”则是true(真)和false(假)两个特定值。
合成类型也包括三种数据类型。
- 对象(object):狭义的对象,否则广义的对象也包括数组和函数
- 数组(array)
- 函数(function)
对象和数组是两种不同的数据组合方式,而函数其实是处理数据的方法。JavaScript把函数当成一种数据类型,可以像其他类型的数据一样,进行赋值和传递,这为编程带来了很大的灵活性,体现了JavaScript作为“函数式语言”的本质。
这里需要明确的是,JavaScript的所有数据,都可以视为对象。不仅合成类型的数组和函数属于对象的特例,就连原始类型的数据(数值、字符串、布尔值)也可以用对象方式调用。
除了上面这六个类别,JavaScript还定义了两个特殊值null和undefined。
2. switch语句后面的表达式与case语句后面的表示式(注意是表达式),在比较运行结果时,采用的是严格相等运算符(===),而不是相等运算符(==),这意味着比较时不会发生类型转换。
3. JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码(当前作用域)的头部,这就叫做变量提升(hoisting)。Hosting 只提升了声明,没有提升定义。变量提升的原理还是蛮重要的,详情移步:http://blog.csdn.net/shilu89757/article/details/42462023
4. JavaScript的标识名区分大小写,所以undefined和null不同于Undefined和Null(或者其他仅仅大小写不同的词形),后者只是普通的变量名。
5. 如果JavaScript预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。
- undefined
- null
- false
- 0
- NaN
- ""(空字符串)
需要特别注意的是,空数组([])和空对象({})对应的布尔值,都是true。
6.使用分号的场景:(小僧刚入行的时候比较纠结的一点)分号表示一条语句的结尾。但是,有一些语法结构不需要在语句的结尾添加分号,主要是以下三种情况。
(1)for和while循环
for(;;){} // 没有分号
while(true){} // 没有分号
需要注意的是do...while循环是有分号的。
do {a--;} while(a > 0); // 分号不能省略
(2)分支语句:if, switch, try
if (true) {} // 没有分号
switch () {} // 没有分号
try {} catch {} // 没有分号
(3)函数的声明语句
function f() {} // 没有分号
但是函数表达式仍然要使用分号。
var f = function f() {};
以上三种情况,如果使用了分号,并不会出错。因为,解释引擎会把这个分号解释为空语句。
当然有些情况如果不加分号,就会出现错误: 如果continue、break、return和throw这四个语句后面,直接跟换行符,则会自动添加分号。这意味着,如果return语句返回的是一个对象的字面量,起首的大括号一定要写在同一行,否则得不到预期结果。
7. 0除以0也会得到NaN;NaN与任何数(包括它自己)的运算,得到的都是NaN;NaN不是一种独立的数据类型,而是一种特殊数值,它的数据类型依然属于Number,使用typeof运算符可以看得很清楚;NaN不等于任何值,包括它本身。判断NaN更可靠的方法是,利用NaN是JavaScript之中唯一不等于自身的值这个特点,进行判断。
8. parseInt如果第一个参数是数值,则会将这个数值先转为10进制,然后再应用第二个参数。如果第一个参数是字符串,则不会将其先转为十进制。
parseInt(010, 10) // 8
parseInt(010, 8) // NaN
parseInt(020, 10) // 16
parseInt(020, 8) // 14
10.在JavaScript 1.2之后的版本中,布尔操作 a || b 当且仅当a的值是true,或能够转换为true的时候返回a,否则返回b的值.也就是说表达式 a || b的值不是布尔值 if(a || b)是先求表达式的值,再将它的值转换为boolean。
11. 使用数组的forEach方法或者for...in结构进行遍历,空位(例如 [,,,])就会被跳过,但是undefine不会被跳过.
12. 如果两个值不是同一类型,严格相等运算符(===)直接返回false,而相等运算符(==)会将它们转化成同一个类型,再用严格相等运算符进行比较。