需要注意的几点:
- 使用严格模式
"use strict"
- 在语句中不要省略分号
;
和中括号{ }
- 声明变量的时候不要忘记使用关键字
var
undefined
undefined是一个特殊的值,当一个变量声明但是未初始化时,就会被赋予undefined 值。
null
- 空对象指针
- 当一个变量是为了保存一个对象,但是没办法立即初始化的时候,应该为之分配一个 null 值。
NaN (not a number)
- 任何涉及NaN的操作都会返回NaN
- NaN与任何值都不相等,包括它本身
数据类型转化的几个相关方法
- Number()
- String()
- parseInt()
- parseFloat()
- toString
运算符
一元加运算符
var a = +"1";
console.log(typeof a); // number
布尔运算符
-
!!
即Boolean()
,强制类型转化 -
&&
短路操作,即 if - else -
||
默认值, 如:var a = b || 1;
var a =1;
if (true) {
a=2;
} //等价于 true && (a=2);
function score(s) {
return s || 5;
}
score(1); // 1
score(); // 5
三元运算符
function fib(n) {
if (n<2) {
return n;
}
else {
return fib(n-1) + fib(n-2);
}
}
//等价于
function fib(n) {
n<2 ? n : fib(n-1) + fib(n-2);
}
语句
函数调用语句
// 示例1
function foo() {}
foo();
// 示例2
fooRef = function() {}
fooRef();
// 示例3,没有引用的匿名函数的调用方法(1)
(function() {
//...
}());
// 示例4,没有引用的匿名函数的调用方法(2)
(function() {
//...
})();
// 示例5,没有引用的匿名函数的调用方法(3)
void function() {
//...
}();
with语句
尽量不要使用:
- strict模式下会报错
- 难以调试和维护
- 降低性能
异常
- try
- catch
- finally
throw error;
返回值
无返回值的语句
-
;
空语句 -
var a = b;
变量声明语句 -
function a() {}
函数声明 -
break/continue/label
控制语句
以下两个式子返回的是什么?WHY?
eval('1+2;var x=5;;;;;function f() {};'); // 3
eval('1+2;var x=5;;function f() {};void 0'); // undefined
eval方法返回最后一个具有返回值的式子的值
函数
参数 (arguments)
- 类数组(但不是数组)
- arguments.length (取决于传入参数的个数,即函数的实际函数的个数,而非形式参数的个数)
练习题
使用模拟函数重载来编写一个具有如下功能的函数:
- 如果输入参数大于三个,返回最后一个参数。
- 如果输入参数小于三个且全部为数字,则返回排序后的数组,如果最后一个数为奇数则降序排列,反之升序排列。
- 如果输入参数小于三个且全部为字符串,则将所有参数强制转化为字符串连接返回。
function myFunc() {
var arguLen = arguments.length;
if (arguLen > 3) { //第 1 种情况
return arguments[arguLen-1];
}
else if (arguLen < 3) {
var numFlag = true; //用于判断是否均为数字
var strFlag = false; //用于判断是否包含字符串
for (var i = 0; i < arguLen; ++i) {
if (typeof arguments[i] != "number") {
numFlag = false;
}
if (typeof arguments[i] === "string") {
strFlag = true;
break;
}
}
if (numFlag) { //第 2 种情况
var args = [].slice.call(arguments, 0); //转成数组
if (args[arguLen - 1] % 2] == 0) {
return args.sort(function(a,b){return a-b;}); //升序
}
else {
return args.sort(function(a,b){return b-a;}); //降序
}
}
else if (strFlag) { //第 3 种情况
var result = "";
for (var i = 0; i<arguLen; ++i) {
result += String(arguments[i]);
}
return result;
}
}
return;
}