ECMAScript中的一切(变量、函数名和操做符)都区分大小写。express
不能把关键字、保留字、true、false和null用作标识符。数组
严格模式是为JavaScript定义了一种不一样的解析与执行模型。在严格模式下,ECMAScript3中的一些不肯定的行为将获得处理,并且对某些不安全的操做也会抛出错误。("use strict";)。安全
ECMAScript中的语句以一个分号结尾;若是省略分号,则由解析器肯定语句的结尾。函数
关键字能够用于表示控制语句的开始或结束,或者用于执行特定的操做等。测试
保留字某种意义上是为了未来的关键字而保留的单词。编码
ECMAScript的变量是松散类型的,能够用来保存任何类型的数据,每一个变量仅仅是一个用于保存值得占位符而已。指针
ECMAScript中有5种简单数据类型(基本数据类型):Undefined、Null、Boolean、Number和String,还有一种复杂数据类型:Object。code
typeof是一个操做符而不是函数。对一个值使用typeof操做符可能返回下列某个字符串:对象
"undefined"--若是这个值未定义;ip
"boolean"--若是这个值是布尔值;
"string"--若是这个值是字符串;
"number"--若是这个值是数值;
"object"--若是这个值是对象或null;
"function"--若是这个值是函数;
调用
typeof null
会返回"object",由于特殊值null被认为是一个空的对象的引用能够经过
typeof
操做符来区分函数和其余对象
Undefined类型只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化时,这个变量就是undefined。
注:
typeof
操做符返回"undefined"值时,能够检测变量是否被声明,而不是是否初始化。由于对未声明的变量执行typeof
操做符也返回"undefined"
Null类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度来看,null值表示一个空对象指针。
若是定义的变量准备在未来用于保存对象,那么最好将该变量初始化为null而不是其余值
null == undefined
// 返回true
Boolean类型只有两个字面值:true和false(小写)。
JS中全部类型的值都有与这两个Boolean值等价的值,能够调用转换函数Boolean ( )。
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
String | 任何非空字符串 | ""(空字符串) |
Number | 任何非零数字值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | (不适用) | undefined |
Number类型使用IEEE754格式来表示整数和浮点数值。
所谓浮点数值,就是该数值中必须包含一个小数点,而且小数点后必须至少有一位数字
保存浮点数值须要的内存空间是保存整数值的两倍,所以ECMAScript会不时地将浮点数值转换为整数值。
对于极大极小的数值,能够用e表示法(科学计数法)表示的浮点数值表示。用e表示法表示的数值等于e前面的数值乘以10的指数次幂。
浮点数值的最高精度是17位小数。
若是某次计算的结果获得了一个超出JS数值范围的值,那么这个数值将被自动转换成特殊的Infinity值
想要肯定一个数值是不是无穷的,可使用isFinite()
函数
NaN,即非数值是一个特殊的数值,这个数值用于表示一个原本要返回数值的操做数未返回数值的状况(这样就不会抛出错误)。
任何涉及NaN的操做都会返回NaN
NaN与任何值都不相等,包括NaN自己
isNaN()
函数能够肯定参数是否“不是数值”
有三个函数能够把非数值转换为数值:Number()
、parseInt()
和parseFloat()
。转型函数Number()
能够用于任何数据类型,而另外两个函数则专门用于把字符串转换成数值。
Number()
转换规则以下若是是Boolean值,true和false将分别被转换为1和0。
若是是数字值,只是简单的传入和传出。
若是是null值,返回0。
若是是undefined,返回NaN。
若是是字符串,遵循如下规则:
若是字符串中只包含数字,则将其转换为十进制数值;
若是字符串中包含有效的浮点格式,则将其转换为对应的浮点数值;
若是字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
若是字符串是空的(不包含任何字符),则将其转换为0;
若是字符串中包含除上述格式以外的字符,则将其转换为NaN;
若是是对象,则调用对象的valueOf()
的方法,而后依照前面的规则转换返回的值。
parseInt()
函数Number()
函数在转换字符串的时候比较复杂且不够合理,所以处理整数的时候更经常使用parseInt()
。parseInt()
函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到第一个非空格字符。若是第一个字符不是数字或者符号,parseInt()
就会返回NaN。若是第一个字符是数字字符,parseInt()
会继续解析,知道解析完全部或者遇到了非数字字符。
parseInt()
转换空字符串会返回NaN,而Number()
对空字符串返回0。
这个函数的第二个参数是转换时使用的基数。(建议不管在任何状况下都指定基数)
parseFloat()
函数与parseInt()
函数相似。区别为:
字符串中第一个小数点是有效的,后面的小数点都是无效的
parseFloat()
只解析十进制值,所以它没有用第二个参数指定基数的方法。它始终会忽略前面的0。
String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。用双引号表示的字符串和用单引号表示的字符串彻底相同。
字符字面量能够出如今字符串中的任意位置,并且也将被做为一个字符来解析。
任何字符串的长度均可以经过访问其length属性取得。
ECMAScript中的字符串是不可变的,也就是说,字符串一旦建立,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串。
数值、布尔值、对象和字符串值(返回字符串的一个副本)都有toString()
方法。但null和undefined没有这个方法,能够传递一个参数:输出数值的基数。
转型函数String()
若是值有toString()
方法,则调用该方法(没有参数)并返回相应的结果;
若是值是null,则返回"null";
若是值是undefined,则返回"undefined"。
对象能够经过new操做符建立:var o = new Object();
。
Object的每一个实例都具备下列属性和方法:
constructor:保存着用于建立当前对象的函数。
hasOwnProperty(propertyName)
:用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,做为参数的属性名(propertyName)必须以字符串的形式指定。
isPrototypeOf(object)
:用于检查传入的对象是不是传入对象的原型。
propertyIsEnumerable(propertyName)
:用于检查给定的属性是否可以使用for-in语句来枚举
toLocaleString()
:返回对象的字符串表示,该字符串与执行环境的地区对应。
toString()
:返回对象的字符串表示。
valueOf()
:返回对象的字符串、数值或布尔值表示。一般与toString()
方法的返回值相同。
只能操做一个值的操做符叫作一元操做符
执行前置递增和递减操做时,变量的值都是在语句被求值之前改变的(副效应)。
在对非数值应用一元加操做符时,该操做符会像Number()
转型函数同样对这个值执行转换
布尔操做符共有三个:非(!)、与(&&)、或(||)。
同时使用两个逻辑非操做符,实际上就会模拟
Boolean()
转型函数的行为
若是参与乘性计算的某个操做数不是数值,后台会先使用Number()
转型函数将其转换为数值。
对于加法操做符(+)来讲:
若是两个操做数都是字符串,则将第二个操做数与第一个操做数拼接起来;
若是只有一个操做数是字符串,则将另外一个操做数转换为字符串,而后再将两个字符串拼接起来
若是有一个操做数是对象、数值、或布尔值,则调用他们的toString()
方法取得相应的字符串的值,再应用前面关于字符串的规则;
对于undefined和null,则分别调用String()
函数并取得字符串"undefined"和"null";
每一个加法操做都是独立执行的
对于减法操做符(-)来讲:
若是有一个操做数是字符串、布尔值、null或undefined,则如今后台调用Number()
函数将其转换为数值,而后再根据前面的规则执行减法计算。若是转换的结果是NaN,则减法的结果就是NaN;
若是有一个操做数是对象,则调用对象的valueOf()
方法以取得表示该对象的数值。若是获得的值是NaN,则减法的结果就是NaN。若是对象没有valueOf()
方法,则调用其toString()
方法并将获得的字符串转换为数值;
当关系操做符使用了非数值时:
若是两个操做数都是字符串,则比较两个字符串中对应位置的每一个字符的字符编码值;
若是一个操做数是数值,则将另外一个操做数转换为一个数值,而后执行数值比较;
若是一个操做数是对象,则调用这个对象的valueOf()
方法,用获得的结果按照前面的规则进行比较。若是对象没有valueOf()
方法,则调用toString()
方法,并用获得的结果根据前面的规则执行比较;
若是一个操做数是布尔值,则先将其转换为数值,而后再执行比较;
任何操做数与NaN进行关系比较,结果都是false
相等和不相等:先转换再比较;全等和不全等:仅比较而不转换
在转换不一样的数据类型时,遵循如下规则:
若是有一个操做数是布尔值,则在比较相等性以前先将其转换为数值:false转换为0,而true转换为1;
若是有一个操做数是字符串,另外一个操做数是数值,在比较相等性以前先将字符串转换为数值;
若是一个操做数是对象,另外一个操做数不是,则调用对象的valueOf()
方法,用获得的基本类型值按照前面的规则进行比较
这俩操做符在进行比较时要遵循:
null == undefined;
要比较相等性以前,不能将null和undefined转换成其余任何值;
若是有一个操做数是NaN,则相等操做符返回false,不相等操做符返回true。即便两个操做数都是NaN,相等操做符也返回false;由于按照规则,NaN不等于NaN;
若是两个操做数都是对象,则比较它们是否是同一个对象。若是两个操做数都指向同一个对象,则相等操做符返回true,不然返回false;
它只在两个操做数未经转换就相等的状况下返回true;
null === undefined
// false
解析器会自动调用Boolean()
转换函数将条件表达式的结果转化为一个布尔值;
条件操做符:variable = boolean_expression ? true_value : false_value;
do-while语句是一种后测试循环语句,即只有在循环体中的代码执行以后,才会测试出口条件。在对条件表达式求值以前,循环体内的代码至少会被执行一次。
while语句属于前测试循环语句,也就是说,在循环体内的代码被执行以前,就会对出口条件求值。所以循环体内代码有可能永远不会被执行。
使用while循环作不到的,使用for循环一样也作不到。能够说for循环只是把与循环有关的代码集中在了一个位置
for-in语句是一种精准的迭代语句,能够用来枚举对象的属性
break语句会当即退出循环,强制继续执行循环后面的语句;
continue语句虽然也是当即退出循环,但退出循环后会从循环的顶部继续执行;
with语句的做用是将代码的做用域设置到一个特定的对象中;
定义with语句的目的主要是为了简化屡次编写同一个对象的工做;
严格模式下不容许使用with语句;
省略break关键字,会致使执行完当前case后,继续执行下一个case;
default关键字用于在表达式不匹配前面任何一种情形的时候,执行代码(至关于else);
switch语句在比较值时使用的是全等操做符,所以不会发生类型转换;
任何函数在任什么时候候均可以经过return语句后跟要返回的值来实现返回值
位于return语句以后的任何代码都永远不会执行
return语句后也能够不带有任何返回值。在这种状况下,函数在中止执行后将返回undefined值。这种作法通常用在须要提早中止函数执行而又不须要返回值的状况。
arguments对象是一个类数组对象,能够经过方括号语法访问它的每个元素,也可使用length属性来肯定传递进来多少个参数。