严格区分大小写
标识符 :
第一个符合必须是字母或者 下划线 _
, 或者 美元符 $
;
其它字符可以是美元符号,下划线,数字,字母
;
{ }
在 JavaScript 中,一些标识符是保留关键字,不能用作变量名或函数名。
abstract | arguments | boolean | break | byte |
case | catch | char | class* | const |
continue | debugger | default | delete | do |
double | else | enum* | eval | export* |
extends* | false | final | finally | float |
for | function | goto | if | implements |
import* | in | instanceof | int | interface |
let | long | native | new | null |
package | private | protected | public | return |
short | static | super* | switch | synchronized |
this | throw | throws | transient | true |
try | typeof | var | void | volatile |
while | with | yield |
定义变量使用 var
, 后接变量名,其可以保存任何值,如果是未初始化的值就会保存特殊值 undefined
;
var message ;
定义变量并且赋值
var message = "zszxz";
var 定义的变量是局部变量,如果在函数体中定义,只在此函数体范围内有效;如果去除var关键字则表示全局变量;
定义多个变量使用逗号 ,
隔开
var message = 100, fund = 100 ;
有 五种简单数据类型(Undefined, Null, Doolean, Number, String)和一种复杂数据类型(Object)
var message = 3
// number
alert(typeof(message));
type of null 返回 是一个 Object, null也是对象的一种;
typeof检测函数返回时一个function;
undefined类型 的值也是 undefined 表示 变量未被初始化;
var msg;
// true
alert(msg == undefined)
如果是给定未定义的变量则会出现错误;但是 type of 却属于 undefined ;
var message = null;
// object
alert(typeof(message));
undefined 是 null 的派生 故它们相等
// true
alert(null == undefined);
使用null赋值变量可以进行非空判断
if (msg != null){
// 内容
}
Boolean类型 只有 true 和 false ;
var message = true;
var msg = false;
// false
alert(msg == message);
转为 Boolean值 可以调用Boolean()
var msg = "zzz";
// true
alert(Boolean(msg));
转换规则:一般遵循非空,数字非0转换未true;否则为false;具体规则需要自行查阅
number 类型表示整数或者浮点数;
整数
十进制
var msg = 100;
八进制以0开头
// 13
var msg = 015
十六进制以 0x 开头
// 10
var msg = 0xA
浮点数
// 浮点数
var msg = 1.1
// 自动转为整数
var msg2 = 1.0
如果是大数值是以e表示10的指数次幂,
var msg = 10e2;
// 1000
alert(msg);
浮点数的精确度远不如整数,有效位17小数位;
超出范围就是Infinity
(正无穷大)和 -Infinity
(负无穷大);
var message = Number.MAX_VALUE + Number.MAX_VALUE ;
// false
alert(isFinite(message));
NaN
isNaN()
(其能将参数试图转为数值,若转换成果返回false,否则true)判定是否是数值;// false
alert(isNaN("6"));
// true
alert(isNaN("z"))
Number() 函数的转换规则如下。
如果字符串中只包含数字,则将其转换为十进制数值,即 "1"会变成 1
如果字符串中包含有效的浮点格式,如 "1.1" ,则将其转换为对应的浮点数值
如果字符串中包含有效的十六进制格式,则将其转换为相同大小的十进制整数值
如果字符串是空的(不包含任何字符),则将其转换为 0
其它情况转为NaN
parseInt() 将字符串转为数值;
var num1 = parseInt("10", 2); //2 (按二进制解析)
var num2 = parseInt("10", 8); //8 (按八进制解析)
var num3 = parseInt("10", 10); //10 (按十进制解析)
var num4 = parseInt("10", 16); //16 (按十六进制解析)
parseFloat() 将字符串转为浮点数型;
String 类型用于表示由零或多个 16 位 Unicode 字符组成的字符序列,即字符串;字符串可以由双
引号(")或单引号(')表示;
转义
获取字符串长度可以使用length属性
字符串具有不可变性
将其它类型字符串:
var msg = 10;
alert(msg.toString());
// 转8进制
alert(msg.toString(8));
// 转二进制
alert(msg.toString(2));
String() 函数遵循下列转换规则:
如果值有 toString() 方法,则调用该方法(没有参数)并返回相应的结果;
如果值是 null ,则返回 "null" ;
如果值是 undefined ,则返回 "undefined" 。
对象其实就是一组数据和功能的集合,通过 new
方式创建对象;
Object 类型是所有它的实例的基础
Object 的每个实例都具有下列属性和方法
constructor :保存着用于创建当前对象的函数
hasOwnProperty(propertyName) :用于检查给定的属性在当前对象实例中,参数的属性名( propertyName )必须以字符串形式指定
isPrototypeOf(object) :用于检查传入的对象是否是传入对象的原型
propertyIsEnumerable(propertyName) :用于检查给定的属性是否能够使用 for-in 语句来枚举
toLocaleString() : 返回地区
toString() :返回对象的字符串表示
valueOf() :返回对象的字符串、数值或布尔值表示
var msg = 10;
alert(++msg);
var msg = 10;
alert(--msg);
执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的;
后置递增和递减操作是在包含它们的语句被求值之后才执行的
自增自减适用于各种数据类型
在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减 1 的操作。字
符串变量变成数值变量在应用于一个不包含有效数字字符的字符串时,将变量的值设置为 NaN 字符串变量变成数值变量
在应用于布尔值 false 时,先将其转换为 0 再执行加减 1 的操作。布尔值变量变成数值变量
在应用于布尔值 true 时,先将其转换为 1 再执行加减 1 的操作。布尔值变量变成数值变量
在应用于浮点数值时,执行加减 1 的操作
在应用于对象时,先调用对象的 valueOf() 方法以取得一个可供操作的值。然后对该值应用前述规则
在对非数值应用一元加操作符时,该操作符会像 Number() 转型函数一样对这个值执行转换
ECMAScript先将 64 位的值转换成 32 位的整数,然后执行操作,最后再将结果转换回 64 位
对于有符号的整数,32 位中的前 31 位用于表示整数的值。第 32 位用于表示数值的符号:0 表示正
数,1 表示负数。这个表示符号的位叫做符号位
负数同样以二进制码存储,但使用的格式是二进制补码
求这个数值绝对值的二进制码
求二进制反码,即将 0 替换为 1,将 1 替换为 0
得到的二进制反码加 1
var msg = 10;
// 1010
alert(msg.toString(2));
var msg = 10;
// -11
alert(~msg);
如果操作数是一个对象,返回 false ;
如果操作数是一个空字符串,返回 true ;
如果操作数是一个非空字符串,返回 false ;
如果操作数是数值 0,返回 true ;
如果操作数是任意非 0 数值(包括 Infinity ),返回 false ;
如果操作数是 null ,返回 true ;
如果操作数是 NaN ,返回 true ;
如果操作数是 undefined ,返回 true
逻辑非操作符也可以用于将一个值转换为与其对应的布尔值。而同时使用两个逻辑非操作符,实际
上就会模拟 Boolean() 转型函数的行为;第一个逻辑非操作会基于无论什么操作数返回一个布
尔值,而第二个逻辑非操作则对该布尔值求反;
alert(!!0); //false
有一个操作数不是布尔值的情况,它遵循下列规则
如果第一个操作数是对象,则返回第二个操作数;
如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该
对象;
如果两个操作数都是对象,则返回第二个操作数;
如果有一个操作数是 null ,则返回 null ;
如果有一个操作数是 NaN ,则返回 NaN ;
如果有一个操作数是 undefined ,则返回 undefined
如果第一个操作数是 false ,则无论第二个操作数是什么值都不会执行返回false;
如果有一个操作数不是布尔值,它遵循下列规则
如果第一个操作数是对象,则返回第一个操作数;
如果第一个操作数的求值结果为 false ,则返回第二个操作数;
如果两个操作数都是对象,则返回第一个操作数;
如果两个操作数都是 null ,则返回 null ;
如果两个操作数都是 NaN ,则返回 NaN ;
如果两个操作数都是 undefined ,则返回 undefined 。
如果第一个操作数的求值结果为true ,就不会对第二个操作数求值了,直接返回true;
乘法操作符由一个星号( * )表示
在处理特殊值的情况下,乘法操作符遵循下列特殊的规则
如果操作数都是数值,执行常规的乘法计算,即两个正数或两个负数相乘的结果还是正数,而
如果只有一个操作数有符号,那么结果就是负数。如果乘积超过了 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() 方法取得相应的字符串值,
然后再应用前面关于字符串的规则
减法操作符(-)
规则
如果两个操作符都是数值,则执行常规的算术减法操作并返回结果;
如果有一个操作数是 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()
方法并将得到的字符串转换为数值。
非数值规则
如果两个操作数都是数值,则执行数值比较。
如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
如果一个操作数是对象,则调用这个对象的 valueOf() 方法,用得到的结果按照前面的规则执
行比较。如果对象没有 valueOf() 方法,则调用 toString() 方法,并用得到的结果根据前面
的规则执行比较。
如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。
在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则
如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值—— false 转换为 0,而
true 转换为 1;
如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf() 方法,用得到的基本类
型值按照前面的规则进行比较;
这两个操作符在进行比较时则要遵循下列规则。
null 和 undefined 是相等的。
要比较相等性之前,不能将 null 和 undefined 转换成其他任何值。
如果有一个操作数是 NaN ,则相等操作符返回 false ,而不相等操作符返回 true 。重要提示:
即使两个操作数都是 NaN ,相等操作符也返回 false ;因为按照规则, NaN 不等于 NaN 。
如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,
则相等操作符返回 true ;否则,返回 false
variable = boolean_expression ? true_value : false_value;
如果求值结果为 true ,则给变量 variable 赋 true_value 值;如果求值结果为 false ,则给变量 variable 赋 false_value 值
赋值操作符由等于号( = )表示
复杂操作
乘/赋值( *= );
除/赋值( /= );
模/赋值( %= );
加/赋值( += );
减/赋值( = );
左移/赋值( <<= );
有符号右移/赋值( >>= ); 无符号右移/赋值( >>>= )
var num1 =1, num2 = 2;
格式一
if (condition) statement1 else statement2
格式二
if (condition1) statement1 else if (condition2) statement2 else statement3
格式
do {
statement
} while (expression);
while(expression) statement
格式
for (initialization; expression; post-loop-expression) statement
无限循环
for (;;) { // 无限循环
doSomething();
}
枚举迭代;建议在使用 for-in 循环之前,先检测确认该对象的值不是 null 或 undefined
格式
for (property in expression) statement
label: statement
加标签的语句一般都要与 for 语句等循环语句配合使用,使用 break, continue引用跳出循环;
with 语句的作用是将代码的作用域设置到一个特定的对象中
with (expression) statement;
switch 语句中使用任何数据类型
每个 case 的值不一定是常量,可以是变量,甚至是表达式
switch (expression) {
case value: statement
break;
case value: statement
break;default: statement
}
函数使用 function 关键字来声明,后跟一组参数以及函数体
格式
function functionName(arg0, arg1,...,argN) {
statements
}
示例
function hello(msg) {
alert("hello"+msg);
}
调用示例
hello(10);
带有返回值示例
function sum(num1, num2) {
return num1 + num2;
}
调用示例
var val = sum(10,20)
位于 return 语句之后的任何代码都永远不会执行
参数理解
原因是 ECMAScript 中的参数在内部是用一个数组来表示,不在乎是否真的传递参数的个数;
function sum() {
// 30
alert(arguments[0] + arguments[1])
// 2
alert(arguments.length)
}
sum(10,20)
如果只传参一个值,获取arguments[1] 值就是 undefined ;
如果在函数内部对 arguments[index] 进行重新赋值,也会修改对应参数列表位置的值;
没有重载
同名函数根据定义的顺序起作用,后面定义的函数会覆盖前面定义的函数;