@aymax
2018-04-05T06:21:12.000000Z
字数 13307
阅读 1168
高设笔记
变量、函数名和操作符都区分大小写
标识符
- 即变量、函数、属性的名字,或者函数的参数。
- 第一个字符必须是字母、下划线(_)、或者美元符号($)
- 其他字符可以是上面三种加上数字
- 一般采用驼峰命名法
- 不能把把关键字、保留字、true、false 和 null 用作标识符
单行注释
// 我是单行注释
多行注释
/*
*
* 我是多行(块级)注释
*
*/
严格模式(??) 高设 P20
语句和代码块
- 语句 ;
- 代码块 { }
关键字
- | - | - | - |
---|---|---|---|
break | do | instanceof | typeof |
case | else | new | var |
catch | finally | return | void |
continue | for | switch | while |
debugger* | function | this | with |
default | if | throw | |
delete | in | try |
保留字
- | - | - | - |
---|---|---|---|
abstract | enum | int | short |
boolean | export | interface | static |
byte | extends | long | super |
char | final | native | synchronized |
class | float | package | throws |
const | goto | private | transient |
debugger | implements | protected | volatile |
double | import | public |
var message;
定义了一个名为 message 的变量,值为 -- undefined
function test() {
var message = "hi"; // 局部变量
}
test();
alert(message); // 错误
再函数内用 var 操作符定义的变量为局部变量
function test() {
message = "hi"; // 全局变量
}
test();
alert(message); // 弹出 "hi"
在函数内定义一个变量 message 省略 var,message 会作为全局变量被定义,不过不建议这种做法
简单数据类型
- Undefined
- Null
- Boolean
- Number
- String
复杂数据
- Object
可以用 typeof 操作符检测
返回值 | 含义 |
---|---|
"undefined" | 未定义 |
"boolean" | 布尔值 |
"string" | 字符串 |
"number" | 数值 |
"object" | 对象或 null |
"function" | 函数 |
var message; // 这个变量声明之后默认取得了 undefined 值
// 下面这个变量并没有声明
// var age
alert(message); // "undefined"
alert(age); // 产生错误
alert(typeof message); // "undefined"
alert(typeof age); // "undefined"
对未声明的变量执行 typeof 操作符也会返回 undefined
alert(null == undefined); //true
true false
,区分大小写,True、False、1、0 都不是 Boolean()
函数来把其他数据类型转换为 Boolean 值。数据类型 | true | false |
---|---|---|
Boolean | true | false |
String | 任何非空字符串(空格也算) | ""(空字符串) |
Number | 任何非零数值(正、负无穷也算) | 0 和 NaN |
Object | 任何对象 | null |
Undefined | N/A | undefined |
应用
var message = "Hello world!";
if (message) {
alert("Value is true");
}
最基本的是十进制数整数
var intNum = 55; // 整数
八进制数 前缀为 0 (严格模式下无效)
var octalNum1 = 070; // 八进制的 56
var octalNum2 = 079; // 无效的八进制数值——解析为 79
var octalNum3 = 08; // 无效的八进制数值——解析为 8
十六进制数 前缀为 0x
var hexNum1 = 0xA; // 十六进制的 10
var hexNum2 = 0x1f; // 十六进制的 31
在进行算术计算时,所有以八进制和十六进制表示的数值终都将被转换成十进制数值
数值中必须包含一个小数点,并且小数点后面必须至少有一位数字,例
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1; // 有效,但不推荐
如果小数点后面没有跟数字,保存的时候会转化为整数
var floatNum1 = 1.; // 小数点后面没有数字——解析为 1
var floatNum2 = 10.0; // 整数——解析为 10
很大或者很小的数,用科学表示法表示,可以是小写 e 也可以是大写 E
var floatNum = 3.125e7; // 等于 31250000
在默认情况下,ECMASctipt 会将那些小数点后面带有 6 个零以上的浮点数值转换为以 e 表示法 表示的数值(例如,0.0000003 会被转换成 3e-7)。
计算机存储数据是用二进制的,浮点数的最高精度是 17 位小数,即浮点数可以精确表示 0.25,但是不可以精确表示 0.1 和 0.2,例 0.1 + 0.2 = 0.30000 00000 00000 04 不等于0.3
console.log( 0.2 + 0.1 == 0.3); // false
最小/大值
console.log(Number.MIN_VALUE); // 5e-324
console.log(Number.MAX_VALUE); // 1.7976931348623157e+308
可以使用 isFinite()
函数检查是否在最大/小值之间
正/负无穷
console.log(Number.NEGATIVE_INFINITY); // -Infinity
console.log(Number.POSITIVE_INFINITY); // +Infinity
console.log(NaN / 10); // NaN 任何涉及NaN的运算都会返回NaN
console.log(NaN == NaN); // false NaN不与任何值相等,包括其本身
- 任何数值除以非数值会返回 NaN
- 0 除以 0 返回 NaN
- 正数除以 0 返回 Infinity
- 负数除以 0 返回 -Infinity
可以用 isNaN()
函数检测是否 NaN
isNaN()
在接收到一个值之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,例如字符串"10"或 Boolean 值。而任何 不能被转换为数值的值都会导致这个函数返回 true。
alert(isNaN(NaN)); //true
alert(isNaN(10)); //false(10是一个数值)
alert(isNaN("10")); //false(可以被转换成数值 10)
alert(isNaN("blue")); //true(不能转换成数值)
alert(isNaN(true)); //false(可以被转换成数值 1)
当 isNaN()
用于对象时,先调用 valueOf()
方法,再调用 toString()
方法;
Number()
函数
- 如果是 Boolean 值,true 和 false 将分别被转换为 1和 0
- 如果是数字值,只是简单的传入和返回
- 如果是 null 值,返回 0
- 如果是 undefined,返回 NaN
- 如果是字符串
- 只包含数字直接转换为数字,
"-023.5" -> -23.5- 十六进制格式,转换成十进制数字,
"0xf" -> 15- 字符串是空的,转换成 0,
"" -> 0- 否则转换成NaN
Number()
函数在处理空字符串的时候和Boolean()
函数不一样,看下面这个例子
console.log(Number("")); // 0
console.log(Number(" ")); // 0
console.log(Boolean("")); // false
console.log(Boolean(" ")); // true
parseInt()
函数 parseInt()
函数
var num1 = parseInt("1234blue"); // 1234
var num1 = parseInt("blue4321"); // NaN
var num1 = parseInt("12blue34"); // 12
var num2 = parseInt("haha"); // NaN
var num2 = parseInt(""); // NaN
var num2 = parseInt(" "); // NaN
var num4 = parseInt(22.5); // 22
var num4 = parseInt(-22.5); // -22
var num5 = parseInt("070"); // 56(八进制数) (*注)
var num6 = parseInt("70"); // 70(十进制数)
var num7 = parseInt("0xf"); // 15(十六进制数)
注:ES3 中 070 被识别为八进制数,转换后市十进制值 56,但是在 ES5 中,parseInt()
已经不具有解析八进制值的能力,从而将这个值当成十进制值 70
解决方法 - 指定基数
console.log(parseInt("070",8)); // 56
console.log(parseInt("0xAF")); // 175
console.log(parseInt("0xAF",16)); // 175
console.log(parseInt("AF")); // NaN
console.log(parseInt("AF",16)); // 175
parseFloat()
函数 parseInt()
函数类似,不同点如下
- 能识别小数点,如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是零),
parseFloat()
会返回整数- 只能识别十进制,因此没有第二个参数指定基数的用法
var num1 = parseFloat("1234blue"); // 1234 (整数)
var num2 = parseFloat("0xA"); // 0
var num3 = parseFloat("22.5"); // 22.5
var num4 = parseFloat("-22.34.5"); // -22.34
var num5 = parseFloat("0908.5"); // 908.5
var num6 = parseFloat("3.125e7"); // 31250000
字面量 | 含义 |
---|---|
\n | 换行 |
\t | 制表 |
\b | 空格 |
\r | 回车 |
\f | 进纸 |
\ | 斜杠 |
\' | 单引号('),在用单引号表示的字符串中使用。例如:'He said, \'hey.\'' |
\" | 双引号("),在用双引号表示的字符串中使用。例如:"He said, \"hey.\"" |
\xnn | 以十六进制代码nn表示的一个字符(其中n为0~F)。例如,\x41表示"A" |
\unnnn | 以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如,\u03a3表示希腊字符Σ |
注 | 转义之后只占一个字符长度 |
console.log("\u03a4".length); // 1
猜想:可能是因为 js 的 String 都是对象,所以只能把变量指向一个新的 String 对象
toString()
方法 toString()
方法,在调用数值的 toString()
方法的时候还可以加一个基数,例:
var num = 10;
alert(num.toString()); // "10"
alert(num.toString(2)); // "1010"
alert(num.toString(8)); // "12"
alert(num.toString(10)); // "10"
alert(num.toString(16)); // "a"
String()
方法
var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
alert(String(value1)); // "10"
alert(String(value2)); // "true"
alert(String(value3)); // "null"
alert(String(value4)); // "undefined"
通过执行 new 操作符后跟要创建 的对象类型的名称来创建
var o = new Object();
Object 类型是所有它的实例的基础,所以, Object 类型所具有的任何属性和方法也同样存在于更具体的对象中。
- constructor:
保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor) 就是 Object()。- hasOwnProperty(propertyName):
用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例如:o.hasOwnProperty("name"))。- isPrototypeOf(object):
用于检查传入的对象是否是传入对象的原型(第 5 章将讨论原型)- propertyIsEnumerable(propertyName):
用于检查给定的属性是否能够使用 for-in 语句 (本章后面将会讨论)来枚举。与 hasOwnProperty() 方法一样,作为参数的属性名必须以字符串形式指定- (???)toLocaleString():
返回对象的字符串表示,该字符串与执行环境的地区对应- toString():
返回对象的字符串表示- valueOf():
返回对象的字符串、数值或布尔值表示。通常与 toString() 方法的返回值相同
从技术角度讲,ECMA-262中对象的行为不一定适用于 JavaScript中的其他对象。 浏览器环境中的对象,比如 BOM 和 DOM 中的对象,都属于宿主对象,因为它们是由宿主实现提供和定义的。ECMA-262不负责定义宿主对象,因此宿主对象可能会也 可能不会继承 Object。
只能操作一个值的操作符叫做一元操作符
- 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减 1 的操作。字 符串变量变成数值变量
- 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为 NaN(第 4章将详细讨论)。 字符串变量变成数值变量
- 在应用于布尔值 false 时,先将其转换为 0再执行加减 1的操作。布尔值变量变成数值变量
- 在应用于布尔值 true 时,先将其转换为 1再执行加减 1的操作。布尔值变量变成数值变量
- 在应用于浮点数值时,执行加减 1的操作
- 在应用于对象时,先调用对象的 valueOf() 方法(第5章将详细讨论)以取得一个可供操作的值。然后对该值应用前述规则。如果结果是 NaN,则在调用 toString() 方法后再应用前述规则,对象变量变成数值变量
var s1 = "2";
var s2 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function() {
return -1;
}
};
s1++; // 值变成数值 3
s2++; // 值变成 NaN
b++; // 值变成数值 1
f--; // 值变成 0.10000000000000009(由于浮点舍入错误所致)
o--; // 值变成数值-2
一元加减操作符 + -
Number()
转型函数一样对这个值执行转换。
- 布尔值 false 和 true 将被转换为 0和 1
- 字符串值会被按照一组特殊的规则进行解析(参考上面对
Number()
的归纳)- 对象是先调用它们的 valueOf()和(或)toString()方法,再转换得到的值
位操作符
ES 中用 64 位格式存储数值,但操作的时候会把 64 位转换为 32 位,操作后的结果再转回 64 位
- 正数用 32 位原码
- 负数用 32 位 补码(原码 --> 反码 --> 补码)
当我们以二进制字符串形式输出一个负数时,我们看到的只是这个负数绝对值的二进制码前面加上了一个负号
var num = -18;
alert(num.toString(2)); // "-10010"
注
- 在对特殊的 NaN 和 Infinity 值应用位操作时,这两个值都会被当成 0来处理
- 如果对非数值应用位操作符,会先使用 Number()函数将该值转换为一个数值(自动完成),然后 再应用位操作。得到的结果将是一个数值
var num1 = 25; // 二进制 00000000000000000000000000011001
var num2 = ~num1; // 二进制 11111111111111111111111111100110
alert(num2); // -26
按位与(AND)
按位与操作符由一个和号字符(&)表示,全一才一
按位或(OR)
按位或操作符由一个竖线符号(|)表示,有一就一
按位异或(XOR)
按位异或操作符由一个插入符号(^)表示
左移、右移省略
布尔操作符
逻辑非
- 逻辑非操作符由一个叹号(!)表示,可以应用于 ECMAScript中的任何值
- 返回值为 Boolean 类型参考
Boolean()
方法返回的布尔值,取反即可- 两个逻辑非操作符可以模拟
Boolean()
方法
逻辑与
逻辑与操作符由两个和号(&&)表示,规则如下:
- 如果第一个操作数是对象,则返回第二个操作数;
- 如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该 对象;
- 如果两个操作数都是对象,则返回第二个操作数;
- 如果有一个操作数是 null,则返回 null;
- 如果有一个操作数是 NaN,则返回 NaN;
- 如果有一个操作数是 undefined,则返回 undefined。
逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。
逻辑或
逻辑或操作符由两个竖线符号(||)表示,规则如下:
- 如果第一个操作数是对象,则返回第一个操作数;
- 如果第一个操作数的求值结果为 false,则返回第二个操作数;
- 如果两个操作数都是对象,则返回第一个操作数;
- 如果两个操作数都是 null,则返回 null;
- 如果两个操作数都是 NaN,则返回 NaN;
- 如果两个操作数都是 undefined,则返回 undefined
与逻辑与操作符相似,逻辑或操作符也是短路操作符。也就是说,如果第一个操作数的求值结果为 true,就不会对第二个操作数求值了。
我们可以利用逻辑或的这一行为来避免为变量赋 null 或 undefined 值。例如:
var myObject = preferredObject || backupObject;
乘性操作符
乘法 (*)
特殊情况:
- 如果操作数都是数值,执行常规的乘法计算,即两个正数或两个负数相乘的结果还是正数,而如果只有一个操作数有符号,那么结果就是负数。如果乘积超过了 ECMAScript数值的表示范围,则返回 Infinity 或 -Infinity
- 如果有一个操作数是 NaN,则结果是 NaN
- 如果是 Infinity 与 0相乘,则结果是 NaN
- 如果是 Infinity 与非 0数值相乘,则结果是 Infinity 或-Infinity,取决于有符号操作数的符号
- 如果是 Infinity 与 Infinity 相乘,则结果是 Infinity
- 如果有一个操作数不是数值,则在后台调用
Number()
将其转换为数值,然后再应用上面的规则
除法(/)
特殊情况:
- 如果操作数都是数值,执行常规的除法计算,即两个正数或两个负数相除的结果还是正数,而如果只有一个操作数有符号,那么结果就是负数。如果商超过了 ECMAScript数值的表示范围, 则返回 Infinity 或-Infinity
- 如果有一个操作数是 NaN,则结果是 NaN
- 如果是 Infinity 被 Infinity 除,则结果是 NaN
- 如果是零被零除,则结果是 NaN
- 如果是非零的有限数被零除,则结果是 Infinity 或-Infinity,取决于有符号操作数的符号
- 如果是 Infinity 被任何非零数值除,则结果是 Infinity 或-Infinity,取决于有符号操作数的符号
- 如果有一个操作数不是数值,则在后台调用
Number()
将其转换为数值,然后再应用上面的规则
求模/余数(%)
特殊情况:
- 如果操作数都是数值,执行常规的除法计算,返回除得的余数
- 如果被除数是无穷大值而除数是有限大的数值,则结果是 NaN
- 如果被除数是有限大的数值而除数是零,则结果是 NaN
- 如果是 Infinity 被 Infinity 除,则结果是 NaN
- 如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数
- 如果被除数是零,则结果是零
- 如果有一个操作数不是数值,则在后台调用
Number()
将其转换为数值,然后再应用上面的规则
加性运算符
加法 (+)
数值 + 数值
- 如果有一个操作数是 NaN,则结果是 NaN
- 如果是 Infinity 加 Infinity,则结果是 Infinity
- 如果是-Infinity 加-Infinity,则结果是-Infinity
- 如果是 Infinity 加-Infinity,则结果是 NaN
- 如果是 +0 加 +0,则结果是 +0
- 如果是 -0 加 -0,则结果是 -0
- 如果是 +0 加 -0,则结果是 +0
字符串 + 字符串/对象/数值/布尔值(先调用 toString()
方法)
- 拼接
var a = 5,
b = 10;
console.log(a + b); //15
console.log( "" + a + b); //510
console.log( "" + (a + b)); //15
减法(-)
- 如果两个操作符都是数值,则执行常规的算术减法操作并返回结果
- 如果有一个操作数是 NaN,则结果是 NaN
- 如果是 Infinity 减 Infinity,则结果是 NaN
- 如果是-Infinity 减-Infinity,则结果是 NaN
- 如果是 Infinity 减-Infinity,则结果是 Infinity
- 如果是-Infinity 减 Infinity,则结果是-Infinity
- 如果是 +0减 +0,则结果是 +0
- 如果是 +0减 -0,则结果是 -0
- 如果是 -0减 -0,则结果是 +0
- 如果有一个操作数是字符串、布尔值、null 或 undefined,则先在后台调用
Number()
函数将 其转换为数值,然后再根据前面的规则执行减法计算。如果转换的结果是 NaN,则减法的结果 就是 NaN- 如果有一个操作数是对象,则调用对象的
valueOf()
方法以取得表示该对象的数值。如果得到 的值是 NaN,则减法的结果就是 NaN。如果对象没有valueOf()
方法,则调用其toString()
方法并将得到的字符串转换为数值
var result1 = 5 - true; // 4,因为 true 被转换成了 1
var result2 = NaN - 1; // NaN
var result3 = 5 - 3; // 2
var result4 = 5 - ""; // 5,因为"" 被转换成了 0
var result5 = 5 - "2"; // 3,因为"2"被转换成了 2
var result6 = 5 - null; // 5,因为 null 被转换成了 0
关系操作符 - 小于(<)、大于(>)、小于等于(<=)、大于等于(>=)
返回一个布尔值
- 如果两个操作数都是数值,则执行数值比较
- 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值
- 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较
- 如果一个操作数是对象,则调用这个对象的
valueOf()
方法,用得到的结果按照前面的规则执 行比较。如果对象没有valueOf()
方法,则调用toString()
方法,并用得到的结果根据前面 的规则执行比较- 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较
var result = "Brick" < "alphabet"; // true
var result = "Brick".toLowerCase() < "alphabet".toLowerCase(); // false
var result = "23" < "3"; // true 比较的是字符编码
var result = "23" < 3; // false 先将 "23" 转换为数值 23,再比较
var result = "a" < 3; // false "a" 被转换成了 NaN
var result1 = NaN < 3; // false
var result2 = NaN >= 3; // false
相等操作符
相等(==)和不相等(!=) —— 先转换再比较
- 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值(false 转换为 0,而 true 转换为 1)
- 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值
- 如果一个操作数是对象,另一个操作数不是,则调用对象的
valueOf()
方法,用得到的基本类 型值按照前面的规则进行比较; 这两个操作符在进行比较时则要遵循下列规则- null 和 undefined 是相等的
- 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值
- 如果有一个操作数是 NaN,则相等操作符返回 false,而不相等操作符返回 true
- 即使两个操作数都是 NaN,相等操作符也返回 false;因为按照规则,NaN 不等于 NaN
- 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象 则相等操作符返回 true;否则,返回 false
全等(===)和不全等(!==) —— 仅比较而不转换
先比较类型,然后和上面一样
var result1 = ("55" == 55); // true,因为转换后相等
var result2 = ("55" === 55); // false,因为不同的数据类型不相等
var result1 = ("55" != 55); // false,因为转换后相等
var result2 = ("55" !== 55); // true,因为不同的数据类型不相等
var result2 = (null == undefined) // true
var result2 = (null === undefined); // false,因为不同的数据类型不相等
条件操作符
规则与 java 相同
variable = boolean_expression ? true_value : false_value;
var max = (num1 > num2) ? num1 : num2;
赋值操作符
简单的赋值操作符由等于号(=)
在等于号(=)前面再添加乘性操作符、加性操作符或位操作符,就可以完成复合赋值操作
- 乘/赋值(*=)
- 除/赋值(/=)
- 模/赋值(%=)
- 加/赋值(+=)
- 减/赋值(=)
- 左移/赋值(<<=)
- 有符号右移/赋值(>>=)
- 无符号右移/赋值(>>>=)
逗号操作符
使用逗号操作符可以在一条语句中执行多个操作
var num1 = 1, num2 = 2, num3 = 3;
用于赋值时,逗号操作符总会返回表达式中的最后一项
var num = (5, 1, 4, 8, 0); // num 的值为 0
if 语句
if (condition) statement1 else statement2
do-while 语句
do {
statement
} while (expression);
while 语句
while(expression) statement
for 语句
for (;;) { // 无限循环
doSomething();
}
for-in 语句
for-in 语句是一种精准的迭代语句,可以用来枚举对象的属性
for (property in expression) statement
示例
for (var propName in window) {
document.write(propName);
}
注
- ECMAScript 对象的属性没有顺序。因此,通过 for-in 循环输出的属性名的顺序是不可预测的
- 如果表示要迭代的对象的变量值为 null 或 undefined,for-in 语句会抛出错误。 ECMAScript 5更正了这一行为;对这种情况不再抛出错误,而只是不执行循环体。为了保证大限度的兼容性,建议在使用 for-in 循环之前,先检测确认该对象的值不是 null 或 undefined
label 语句
使用 label 语句可以在代码中添加标签,以便将来使用
label: statement
示例
start: for (var i=0; i < count; i++) {
alert(i);
}
这个例子中定义的 start 标签可以在将来由 break 或 continue 语句引用
break 和 continue 语句
outermost:
for (var i=0; i < 10; i++) {
for (var j=0; j < 10; j++) {
if (i == 5 && j == 5) {
break outermost;
}
num++;
}
}
alert(num); //55
outermost 标记了外部 for 循环,因此 break 不仅会退出内循环,还会退出外循环
var num = 0;
outermost:
for (var i = 0; i < 10; i ++) {
for (var j = 0; j < 10; j ++) {
if (i == 5 && j == 5) {
continue outermost;
}
num ++;
}
}
alert(num); //95
当 i == 5 && j == 5 时,continue outermost 执行,退出内部循环,继续执行外部循环
with (expression) statement;
示例
var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;
/*
*可以用 with 语句简化为
*/
with(location) {
var qs = search.substring(1);
var hostName = hostname;
var url = href;
}
注:严格模式下不允许用 with 语句,否则将视为语法错误
switch 语句
- ECMAScript 中的 switch 语句可以使用任何数据类型
- 每个 case 的值不一定是常量,可以是变量,甚至是表达式
- switch 语句在比较值时使用的是全等操作符,因此不会发生类型转换
示例
var a = 25;
switch (a) {
case 25:
/* 合并 25 和 30 两种情况 */
case 30:
console.log('25 or 30');
break;
case 'haha':
console.log('haha');
break;
case true:
console.log(true);
break;
default:
console.log('Other');
}
假如需要混合几种情形,不要忘了在代码中添加注释,说明你是有意省略了 break 关键字
使用表达式作为 case 值
var num = 25;
switch (true) {
case num < 0:
alert("Less than 0.");
break;
case num >= 0 && num <= 10:
alert("Between 0 and 10.");
break;
case num > 10 && num <= 20:
alert("Between 10 and 20.");
break;
default:
alert("More than 20.");
}
- 不用声明参数类型
- 不同指定返回值类型
- 严格模式对函数有一些限制
- 不能把函数命名为 eval 或 arguments;
- 不能把参数命名为 eval 或 arguments;
- 不能出现两个命名参数同名的情况。
参数
ES 的函数中参数只是提供便利,不是必需的,所有参数都会传到 arguments
对象里面
var a = 'hey ',
b = 'i am ',
c = 'Aymax ';
sayHi(a, b, c);
function sayHi() {
console.log(arguments.length); // 3
console.log(arguments[0] + arguments[1] + arguments[2]); //hey i am Aymax
}
- arguements 的值永远与对应命名参数保持同步,且 arguments 的 length 由传入参数个数决定
- 没有传递值的命名参数将自动被赋予 undefined 值
- 严格模式下重写 arguments 的值会导致语法错误(代码将不会执行)
- ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数
没有重载
- 如果在 ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数
- 通过检查传入函数中参数的类型和数量并作出不同的反应,可以模仿方法的重载。