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 |
let
|
yield
|
eval |
arguments
|
|
*在严格模式下,eval 和arguments 也不能作为标识符或属性名,否则会抛出错误。
即便未初始化的变量会自动被赋予undefined的值,如果能显示初始化变量(var a=undefined;),那么当typeof操作符返回undefined,就知道被检测的变量还没有被声明,而不是尚未初始化。var a ; //用var声明但 未初始化变量默认值:undefined//var b; // 未声明变量
alert (a) ; //undefinedalert (b) ; // 报错: Uncaught ReferenceError: b is not defined
alert ( typeof a) ; //undefinedalert ( typeof b) ; //undefined//因为这两种变量从技术角度看有本质区别,实际上无论对哪种变量都不可能执行真正的操作。
要将一个值转换为其对应的Boolean值,可以调用转型函数Boolean()。
var a="hi";
var result=Boolean(a);
可以对任何数据类型的值调用Boolean()函数,而且总会返回一个Boolean值。
数据类型 | 转换为true的值 | 转换为false的值 |
Boolen | true | false |
String | 任何非空字符串 | ""(空字符串) |
Number | 任何非零数字值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | n/a(不适用) | undefined |
Number类型
最基本的数值字面量格式是十进制整数。
八进制:第一位必须是零(0),然后八进制数字序列(0~7),超出范围,前导零被忽略,按十进制数值解析
十六进制:前两位必须是 0x,后面跟任何十六进制数字(0~9和A~F)
- 浮点数值
数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。
保存浮点数值需要的内存空间是保存整数值的两倍。
e表示法:var floatNum = 3.125e7; ------31250000(3.123乘以10的7次方)
- 数值范围
超出JavaScript数值范围的值,会自动转换成 Infinity(正无穷),-Infinity(负无穷)
- NaN(Not a Number)
- 数值转换
- Number( );
- Boolean——true和false将被转换为1和0
- Number——只是简单传入返回
- Null——0
- Undefined——NaN
- String——遵循以下规则:
- 字符串中只包含数字,转换为十进制数值,十六进制格式也转换为相同大小的十进制整数值
- 字符串有浮点格式,转换相对应的浮点数值
- 字符串为空(不包含任何字符),转换为0 Number("")——0
- 除了上述格式外,转换为NaN
- 对象——调用对象的valueOf( )方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用toString( )。
- parseInt( );
- 在转换字符串是,更多的是看其是否符合数值模式;
- 用parseInt( )转换空字符串会返回NaN; parseInt("")——NaN
- parseInt( )解析八进制字符串,ECMAScript 3和ECMAScript 5存在分歧
- parseInt("10",10); ——第二个参数是要解析一个十进制格式的字符串
- parseFloat( );
- 第一个小数点有效,第二个小数点无效
- 与parseInt( )区别:它始终都会忽略前导的零
- parseFloat( )只解析十进制,十六进制的字符串会返回为0
- parseFloat(3.125e7)——31250000
- Number( );
用于表示由零或多个16位Unicode字符组成的字符序列——字符串
八进制:第一位必须是零(0),然后八进制数字序列(0~7),超出范围,前导零被忽略,按十进制数值解析
十六进制:前两位必须是 0x,后面跟任何十六进制数字(0~9和A~F)
转义序列:\n 换行,\r 回车,\\ 斜杠,\' 单引号,\" 双引号,\unnnn Unicode字符
转换为字符串
- toString( )
- String( )
一组数据和功能的集合;Object类型是所有它的实例的基础(Object类型所具有的任何属性和方法同样存在于更具体的对象中);
- constructor(构造函数):保存着用于创建当前对象的函数
- hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(不是实例的原型中)
- isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型
- prototypeIsEnumerable(prototypeName):用于检查给定的属性是否能够使用for-in语句来枚举
- toLocaleString( ):返回一个 String 对象,这个对象中包含了用当前区域设置的默认格式表示的日期
- toString( )
- valueOf( )
- 前置型 ++a(先运算后赋值)
var num1=2;var num2=20;var num3=--num1+num2; //21var num4=num1+num2; //21
- 后置型 a++(先赋值后运算)
var num1=2;var num2=20;var num3=num1--+num2; //22var num4=num1+num2; //21
在不同值,递增递减操作符应用var s1="2";var s2= "z" ;var b= false ;var f= 1.1 ;var o={valueOf:function(){return -1;}};s1++;s2++;b++;--f;--o;console . log (s1) ; //3console . log (s2) ; //NaNconsole . log (b) ; //1console . log (f) ; //0.10000000000000009console . log (o) ; //-2
- 对数值应用一元操作符:var num=5; num=+num;
- 对非数值应用一元操作符:会像Number( )转型函数一样对这个值进行转换。
- 按位非(~):操作数的负值减1;
var num1=25;var num2=~num1; // num2=-num1-1; 因为按位非是在数值表示的最底层执行操作,速度更快alert(num2) // -26
- 按位与(&):只在两个数值的对应位都是1时才返回1,任何一位是0,结果都是0;
var result=25 & 3;alert (result) // 1
- 按位或(|):在有一个位是1的情况下返回1,而只有在两个位都是0的情况下才返回0;
var result=25 | 3;alert (result) // 27
- 按位异或(^):与按位或不同之处是在两个数值对应位上只有一个1时才返回1,如果对应的两位都是1或者0,则返回0;
var result=25 ^ 3;alert (result) // 26
- 左移(<<):将数值的所有位向左移动指定的位数,左移不会影响操作数的符号位;var a=4; var b=a<<5;
- 有符号的右移(>>):会将数值向右移动,但保留符号位
- 无符号的右移(>>>):将数值的所有32位都向右移动。对正数来说,无符号右移和有符号右移一样的。对负数来说,无符号右移是以0来填充,不像有符号右移以符号位的值来填充。所以会把负数的二进制码当成正数的二进制码。而且,由于负数以绝对值的二进制补码形式表示,会导致无符号右移后的结果非常大。
- 逻辑非(!):首先会将他的操作数转换为一个布尔值,然后再对其求反;使用两个逻辑非(!!)模拟Boolean( )转型函数的行为
- 对象——false
- 空字符串——true
- 非空字符串——false
- 0——true
- 非0(包括Infinity)——false
- null——true;
- undefined——true
- NaN——true
- 逻辑与(&&):&&属于短路操作,就是第一个操作数结果是false,不在对下一个操作数求值。
- 第一个操作数是对象——返回第二个操作数
- 第二个操作数是对象——只有在第一个操作数的求值是true才返回第二个参数对象
- 两个操作数都是对象——返回第二个操作数
- 有一个是null——null;
- 有一个是NaN——NaN;
- 有一个是undefined——undefined
- 逻辑或(||):||也属于短路操作,就是第一个操作数结果是true,不在对下一个操作数求值。
- 第一个操作数是对象——返回第一个操作数
- 第一个操作数结果false——返回第二个操作数
- 两个操作数都是对象——返回第一个操作数
- 两个是null——null;
- 两个是NaN——NaN;
- 两个是undefined——undefined
- 两个都是数值,按照乘法来运算。超出范围返回Infinity或-Infinity;
- 一个是NaN——NaN;
- Infinity * 0 ——NaN;
- Infinity * 非0 ——Infinity/-Infinity(取决于有符号操作数的符号);
- Infinity * Infinity ——Infinity;
- 有一个不是数值,在后台调用Number( )转换为数值,然后应用上面的规则
- 两个都是数值,按照除法来运算。超出范围返回Infinity或-Infinity;
- 一个是NaN——NaN;
- Infinity / Infinity ——NaN;
- 0 / 0 ——NaN;
- 非0的有限数 / 0 ——Infinity/-Infinity(取决于有符号操作数的符号);
- Infinity / 非0 ——Infinity/-Infinity(取决于有符号操作数的符号);
- 有一个不是数值,在后台调用Number( )转换为数值,然后应用上面的规则
- 两个都是数值,按照除法来运算,返回除得的余数;
- 无穷大值 % 有限大的数值 ——NaN;
- 有限大的数值 % 0 ——NaN;
- Infinity % Infinity ——NaN;
- 被除数是有限大的数值 % 无穷大值 ——被除数;
- 被除数是0——0;
- 有一个不是数值,在后台调用Number( )转换为数值,然后应用上面的规则
- 两个都是数值,按照加法来运算;
- 一个是NaN——NaN;
- Infinity + Infinity ——Infinity;
- -Infinity + -Infinity —— -Infinity;
- Infinity + -Infinity ——NaN;
- +0 + +0 —— +0;
- -0 + -0 —— -0;
- +0 + -0 —— +0;
- 有一个是字符串:
- 两个都是字符串,两个数拼接起来;
- 如果只有一个是字符串,那就将另一个转换为字符串,然后将两个拼接起来;
- 有一个是对象,布尔值或数值,则调用它们的toString( )方法取得相应的字符串值,然后应用前面关于字符串的规则;
- undefined 和 null 分别调用toString( )并取得字符串"undefined"和"null"
减法(-):var num1=5;var num2=10;var a="the num is "+num1+num2; //the num is 510;var b="the num is "+(num1+num2); //the num is 15;alert(a);alert(b);
- 两个都是数值,按照减法来运算;
- 一个是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 result="Name".toLowerCase( ) < "age".toLowerCase( );
- 当两个数字的字符串,不是比较数字大小,是字符编码大小。var result="23"<"3"; //true; -->var result="23" <3; //false (将一个操作数改为数值,比较结果就正常了)
- 一个是数值,另一个就转换为一个数值,然后比较数值大小;
- 一个是对象,则调用这个对象的valueOf( ),用得到的结果按照前面的规则比较。如果没有valueOf( ),就用toString( );
- 一个是布尔值,先转换数值,然后数值比较大小;
- 任何与NaN比较,都是false
- 相等和不想等(==和!=)——先转换在比较
- 一个是布尔值,先转换数值;
- 一个是字符串,另一个是数值,先把字符串转换为数值;
- 如果一个是对象,另一个不是,调用valueOf( ),得到的基本类型值按照前面规则比较
- null==undefined;
- 在比较相等性之前,null和undefined不能转换成其他任何值;
- 一个是NaN,相等操作符返回false;不相等操作符返回true;
- NaN == NaN; //false
- 两个都是对象,比较是不是同一个对象,如果都指向同一个对象,就相等;
- 全等和不全等(===和!==)——以不转换数值的方式进行比较
- 在=前面添加乘性操作符,加性操作符或位操作符,可以完成复合复制操作。
- 多用于声明多个变量
- 还可以用于赋值,逗号操作符总会返回表达式中的最后一项。var a=(5,1,2,9,3); //a的值是3
其中 condition 可以是任何表达式,结果不一定是布尔值。ECMAScript 会自动调用Boolean( )转换函数把它转换成布尔值。
如果条件结果为 true,则执行 statement1;如果条件结果为 false,则执行 statement2。
每个语句都可以是单行代码,也可以是代码块。
do {
statement
} while(expression)
像do-while这种后测试循环语句最常用于循环体中的代码至少要被执行一次的情形。
while 语句——前测试循环语句(在循环体内的代码被执行之前,就会对出口条件求值)
while (expression) statement
前测试循环语句的循环体内的代码有可能永远不会被执行。
for 语句——前测试循环语句,但具有在执行循环之前初始化变量和定义循环后要执行的代码能力。
初始化表达式 控制表达式 循环后表达式
这三个表达式都是可选的,如果都全部省略,就会创建一个无限循环。
for(; ;) doSomething();
var count=10;var i=0;for(; i<count; ){ //while(i<count)alert(i);i++;}
for-in 语句——精准的迭代语句,可以用来枚举对象的属性。
ECMAScript对象的属性没有顺序,因此,通过for-in循环输出的属性名的顺序会因浏览器而异。
如果要迭代的对象的变量值为null或者undefined,for-in会抛出错误。ECMAScript5已更正:不再抛出错误,而只是不执行循环体。为了保证最大限度兼容性,建议在使用for-in前,先检测对象的值不是null或undefined。
这例子中定义的start标签可以在将来由break或continue语句引用。加标签的语句一般都要与for语句等循环语句配合使用。start: for ( var i= 0 ; i<count ; i++){alert (i) ;}
break 和 continue 语句——用在循环中精确地控制代码的执行。
break 和 continue 语句都可以与label语句联合使用,从而返回代码中特定的位置。一般多发生在循环嵌套的情况下。(使用过度,会给调试带来麻烦,所以使用label一定要使用描述性的标签,同时不要嵌套过多的循环。)
循环正常执行10次的话,num值是100;var num=0;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
with 语句——将代码的作用域设置到一个特定的对象中
严格模式下不允许使用with语句。var qs= location . search . substring ( 1 ) ;var hostName= location . hostname ;var url= location . href ;
with ( location ){var qs= search . substring ( 1 ) ;var hostName= hostname ;var url= href ;}
switch 语句——将代码的作用域设置到一个特定的对象中
switch("hello world"){注:switch语句在比较值时使用的是全等操作符,因此不会发生类型转换。
case "hello"+" world":
alert("a");
break;
case "goodbye":
alert("b");
break;
default:
alert("c");
}
var num=25;
switch(true){ //之所以给switch语句传递表达式true,是因为每个case值返回一个布尔值
case num<0:
alert("num<0");
break;
case num>=0 && num<=10:
alert("num>=0 && num<=10");
break;
case num>=10 && num<=20:
alert("num>=10 && num<=20");
break;
default:
alert("num>=20");
}
ECMAScript中de函数在定义时不必指定是否返回值。实际上,任何函数在任何时候都可以通过return语句后跟要返回的值来实现返回值。
位于return语句之后的任何代码都永远不会执行。
- 一个函数中可以包含多个retrun语句。
function diff (a , b){if (a<b){return b-a ;} else {return a-b ;}}
- return语句可以不带有任何返回值,在这种情况下,函数在停止执行后将返回undefined。这种用法一般用在需要提前停止函数执行而又不需要返回值的情况下。推荐做法是要么让函数始终都返回一个值,要么永远都不要返回值。
- 命名的参数只提供便利,但不是必需的。
- arguments对象可以与命名参数一起使用。
- 还有一点比较有意思:arguments的值永远与对应命名参数的值保持同步。(它们的内存空间是独立的,但是值会同步)。如果只传入一个参数,arguments[1]设置的值不会反应到命名参数中。因为arguments对象的长度是由传入的参数个数决定的,不是由定义函数时命名参数的个数决定的。
- 没有传递值得命名参数将自动被赋予undefined值。