标识符
标识符:指变量、函数、属性名或函数的参数。
标识符命名规则:
- 第一个字符必须是字母、下划线或一个美元符号
- 其他字符是字母、下划线、美元符号或数字
- 采用驼峰大小写格式命名
- 不能使用关键字、保留字、true、false和null用作标识符
关键字:
break | do | instanceof | typeof |
case | else | new | var |
catch | finally | return | void |
continue | for | switch | while |
debugger(第5版新增) | function | this | with |
default | if | throw | delete |
in | try |
保留字(第3版):
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 |
第5版在非严格模式下运行时的保留字缩减为下列:
class | enum | extends | super |
const | export | import |
严格模式下第5版对下列保留字加以限制:
implements | package | public | interface |
private | static | let(第5版新增) | protected |
yield(第5版新增) |
在严格模式下,第5版对eval和arguments也施加了限制,不能作为标识符或属性名,否则会抛出错误
数据类型
NaN
即非数值(Not aumber) 是一个特殊的数值,用于表示一个本来要返回数值的操作数未返回数值的情况。
特点:
- 任何涉及NaN的操作都会返回NaN
- NaN与任何值都不相等,包括本身
JavaScript定义了isNaN()函数,任何不能转换为数值的都返回为true
分子分母都为0相除返回NaN,如0/0返回NaN
Null
只有一个值的数据类型,为null,逻辑角度null表示一个空对象指针,使用typeof操作符检测null值返回object
Undefined
只有一个值,及特殊的undefined
- 变量未初始化
- 变量未定义时
- 函数无明确返回值
测试某个值是否未定义使用“===”操作符,“==”操作符认为undefined值等于null
数值加undefined为NaN,如10+undefined为NaN
Infinity
Infinity 属性用于存放表示正无穷大的数值。
Infinity 是全局对象的一个属性,即它是一个全局变量。
Infinity 的初始值是Number.POSITIVE_INFINITY。Infinity (正无穷大)大于任何值。该值和数学意义上的无穷大很像,例如任何正值乘以 Infinity 为 Infinity , 任何数值(除了Infinity 和 -Infinity)除以 Infinity 为 0。
规则:
- Infinity 与0相乘为NaN
- Infinity与Infinity相乘为Infinity
- Infinity与Infinity相除为NaN
- 非零有限数被零除,结果是Infinity(正负取决于有符号操作数的符号)
- Infinity被任何非零数值除,结果是Infinity(正负取决于有符号操作数的符号)
- 无穷大值对有限大值求模,结果为NaN,如Infinity%23结果为NaN
- 有限大值对无限大值求模,结果为有限大值,如23%Infinity结果为23
- Infinity加-Infinity,结果为NaN
- +0加-0,结果为+0
- Infinity减Infinity,结果为NaN
- -Infinity减-Infinity,结果为NaN
- Infinity减-Infinity,结果为Infinity
- -Infinity减Infinity,结果为-Infinity
- -0减-0,结果为+0
浮点数值
由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机的将浮点数值转换为整数值
浮点数值的最高精度是17位小数
数值范围
ECMAScript能够表示的最小数值存在Number.MIN_VALUE中,在大多数浏览器中,这值为5e-324;能够表示的最大数值保存在Number.MAX_VALUE中,大多数浏览器中,这值为1.7976931348623157e+308。超出范围,值将自动转换成Infinity,可以使用isFinite()函数判定,在范围之内返回true。
分母为0相除返回Infinity,如10/0返回Infinity
数值转换
有3个函数把非数值转换为数值:Number()、parseInt()、parseFloat()
Number()函数的转换规则:
- 如果是Boolean值,true和false将分别转换为1和0
- 如果是null值,返回0
- 如果是undefined,返回NaN
- 如果是字符串,遵循下列规则:
如果字符串只包含数字,则将转换为十进制数值(前导若有零则会忽略)
如果字符串中包含有效的浮点格式,则将其转换为对应的浮点数值(前导若有零则会忽略)
如果字符串中包含有效的十六进制格式,则将其转换为相同大小的十进制整数值
如果字符串是空,则将其转换为0
如果字符串包含除上述格式之外的字符,则将其转换为NaN
- 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值
Number类型提供一些用于将数值格式化为字符串的方法:
toFixed():按照指定的小数位返回数值的字符串表示,可以表示带有0-20个小数位的数值
toExponential():返回以指数表示法表示的数值的字符串形式,接受一个参数且该参数同样也是指定输出结果中的小数位数
toPrecision():返回值看哪种格式最适合,接受一个参数,即表示数值的所有数字的位数(不包括指数部分),,可以表示1-21位小数
var num=10;
console.log(num.toFixed(2));//"10.00"
console.log(num.toExponential(1));//"1.0e+1"
console.log(num.toPrecision(1));//"1e+1"
console.log(num.toPrecision(2));//10
console.log(num.toPrecision(3));//10.0
parseInt()函数转换规则:
- 转换字符串时,忽略前面的空格,直至找到第一个非空格字符,若果第一个字符不是数字字符或者负号,parseInt()返回NaN
- 如果为空字符串,parseInt()返回NaN
- 如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完或遇到第一个非数字字符,如“1234blue”会转换为1234,“22.5”会转换为22
- parseInt()能识别各种整数格式,0x开头且后跟数字字符是十六进制、0开头且后跟数字字符是八进制,ECMAScript5已不具有解析八进制能力,如070会认为是70
- 为了消除上述困惑,parseInt()函数提供第二个参数:转换时使用的基数(即多少进制),如parseInt("AF",16)结果为175,parseInt("AF")结果为NaN
parseFloat()函数转换规则:
- parseFloat()也是从第一个字符开始解析每个字符,直到字符串末尾或者遇到一个无效的浮点数字字符为止
- parseFloat()始终会忽略前导0,十六进制格式的字符串则始终被转换为0,由于parseFloat()只解析十进制,因此没有用第二个参数指定基数的用法
- 如果字符串包含的是一个可解析为整数的数(没有小数点或小数点后面都是0),parseFloat()会返回整数
位操作符
按位非(~):
按位非操作本质:操作数的负值减一
var num=25;
var num1=~num;
alert(num1);//-26
按位与(&):
均1为1
var result=25 & 3;
alert(result);//1
底层操作:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
and=0000 0000 0000 0000 0000 0000 0000 0001
按位或(|):
均0为0
var result = 25 | 3;
alert(result);//27
底层操作:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
or = 0000 0000 0000 0000 0000 0000 0001 1011
按位异或(^):
两个数相同(都为1或都为0)为0,不同(一个数为1一个数为0)为1
var result = 25 ^ 3;
alert(result);//26
底层操作:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
xor = 0000 0000 0000 0000 0000 0000 0001 1010
布尔操作符
逻辑非(!):
逻辑非操作符遵循下列规则:
- 若操作数是一个对象,返回false
- 若操作数是一个空字符串,返回true
- 若操作数是数值0,返回true
- 若操作数是任意非0数值(包括Infinity),返回false
- 若操作数是null或NaN或undefined,返回true
逻辑与(&&):
均真为真
逻辑与操作符遵循下列规则:
- 如果第一个操作数是对象,则返回第二个操作数
- 如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象
- 如果两个操作数都是对象,则返回第二个操作数
- 如果第一个操作数是null,则返回null
- 如果第一个操作数是NaN,则返回NaN
- 如果第一个操作数是undefined,则返回undefined
- 如果第一个操作数能够决定结果,则不会再对第二个操作数求值,如第一个操作数是false,则无论第二个操作数是什么值都返回false
逻辑或(||):
均假为假
逻辑或操作符遵循下列规则:
- 如果第一个操作数是对象,则返回第一个操作数
- 如果第一个操作数的求值结果为false,则返回第二个操作数
- 如果两个操作数都是对象,则返回第一个操作数
- 如果两个操作数是null,则返回null
- 如果两个操作数是NaN,则返回NaN
- 如果两个操作数是undefined,则返回undefined
- 如果第一个操作数能够决定结果,则不会再对第二个操作数求值,如第一个操作数是true,则无论第二个操作数是什么值都返回true