一、运算符
1.1 算术运算符
1.2 比较运算符
JavaScript 提供两种相等运算符:==
和 ===
。
简单说,它们的区别是相等运算符(==
) 比较两个值是否相等,严格相等运算符 ( ===
)比较它们是否为“同一个值”。如果两个值不是同一类型,严格相等运算符(===
)直接返回false,而相等运算符(==
)会将它们转换成同一个类型,再用严格相等运算符进行比较。
严格相等运算符有一个对应的“严格不相等运算符”(!==
),它的算法就是先求严格相等运算符的结果,然后返回相反值。
1.3 布尔运算符
1.4 二进制运算符
位运算只对整数有效,遇到小数时,会将小数部分舍去,只保留整数部分。
右移运算符(>>
)表示将一个数的二进制值向右移动指定的位数。如果是正数,头部全部补0;如果是负数,头部全部补1。右移运算符基本上相当于除以2的指定次方(最高位即符号位参与移动)。
头部补零的右移运算符(>>>
)与右移运算符(>>
)只有一个差别,就是一个数的二进制形式向右移动时,头部一律补零,而不考虑符号位。所以,该运算总是得到正值。对于正数,该运算的结果与右移运算符(>>
)完全一致,区别主要在于负数。
位运算符可以用作设置对象属性的开关。
1.5 其他运算符
void运算符:
void运算符的作用是执行一个表达式,然后不返回任何值,或者说返回undefined。这个运算符的主要用途是浏览器的书签工具(Bookmarklet),以及在超级链接中插入代码防止网页跳转。
void 0 // undefined
void(0) // undefined
逗号运算符:
逗号运算符用于对两个表达式求值,并返回后一个表达式的值。逗号运算符的一个用途是,在返回一个值之前,进行一些辅助操作。上面代码中,先执行逗号之前的操作,然后返回逗号后面的值。
var value = (console.log('Hi!'), true);
// Hi!
value // true
二、语法
2.1 数据类型转换
JavaScript 是一种动态类型语言,变量没有类型限制,可以随时赋予任意值。
强制转换:
强制转换主要指使用Number()、String()和Boolean()三个函数,手动将各种类型的值,分别转换成数字、字符串或者布尔值。
Number():
- 简单的规则是,Number方法的参数是对象时,将返回NaN,除非是包含单个数值的数组;
- 基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN。
String(): - 数值:转为相应的字符串;
- 字符串:转换后还是原来的值;
- 布尔值:true转为字符串"true",false转为字符串"false";
- undefined:转为字符串"undefined";
- null:转为字符串"null";
- String方法的参数如果是对象,返回一个类型字符串;如果是数组,返回该数组的字符串形式。
Boolean():
Boolean()函数可以将任意类型的值转为布尔值。
它的转换规则相对简单:除了以下五个值的转换结果为false,其他的值全部为true。
undefined
null
0(包含-0和+0)
NaN
''(空字符串)
自动类型转换:
预期什么类型的值,就调用该类型的转换函数。
2.2 错误处理机制
Error 实例对象:
JavaScript 原生提供Error构造函数,所有抛出的错误都是这个构造函数的实例。
Error()构造函数接受一个参数,表示错误提示,可以从实例的message属性读到这个参数。抛出Error实例对象以后,整个程序就中断在发生错误的地方,不再往下执行。
Error实例对象是最一般的错误类型,在它的基础上,JavaScript 还定义了其他6种错误对象。也就是说,存在Error的6个派生对象。
SyntaxError
对象是解析代码时发生的语法错误。ReferenceError
对象是引用一个不存在的变量时发生的错误。RangeError
对象是一个值超出有效范围时发生的错误。TypeError
对象是变量或参数不是预期类型时发生的错误。URIError
对象是 URI 相关函数的参数不正确时抛出的错误,主要涉及encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()这六个函数。- eval函数没有被正确执行时,会抛出
EvalError
错误。 - 除了 JavaScript 原生提供的七种错误对象,还可以定义自己的错误对象。
function UserError(message) {
this.message = message || '默认信息';
this.name = 'UserError';
}
UserError.prototype = new Error();
UserError.prototype.constructor = UserError;
throw语句:
throw语句的作用是手动中断程序执行,抛出一个错误。
自定义throw:
function UserError(message) {
this.message = message || '默认信息';
this.name = 'UserError';
}
throw new UserError('出错了!');
try catch结构:
一旦发生错误,程序就中止执行了。JavaScript 提供了try…catch结构,允许对错误进行处理,选择是否往下执行。
catch接收try抛出的值。
finally代码块:
try…catch结构允许在最后添加一个finally代码块,表示不管是否出现错误,都必需在最后运行的语句。
表示区块起首的大括号,不要另起一行。
2.3 console与控制台
console的常见用途有两个:
调试程序,显示网页代码运行时的错误信息。
提供了一个命令行接口,用来与网页代码互动。
console.log
方法用于在控制台输出信息。它可以接受一个或多个参数,将它们连接起来输出。console.info
是console.log方法的别名,用法完全一样。只不过console.info方法会在输出信息的前面,加上一个蓝色图标。console.debug
方法与console.log方法类似,会在控制台输出调试信息。但是,默认情况下,console.debug输出的信息不会显示,只有在打开显示级别在verbose的情况下,才会显示。warn
方法和error
方法也是在控制台输出信息,它们与log方法的不同之处在于,warn方法输出信息时,在最前面加一个黄色三角,表示警告;error方法输出信息时,在最前面加一个红色的叉,表示出错。同时,还会高亮显示输出文字和错误发生的堆栈。其他方面都一样。- 对于某些复合类型的数据,
console.table
方法可以将其转为表格显示。 count
方法用于计数,输出它被调用了多少次。console.assert
方法主要用于程序运行过程中,进行条件判断,如果不满足条件,就显示一个错误,但不会中断程序执行。这样就相当于提示用户,内部状态不正确。