本篇主要总结《Javascript高级程序设计(第三版)》第三章基本概念中的ECMAScript(以下简称ES)语言核心。
ES推荐标识符命名采用驼峰式。
ES第五版引入了严格模式,严格模式需要在JS文件顶部或者函数内部第一行添加"use strict"这条编译指示开启。在严格模式下,很多JS中不确定的或者说不安全的操作将会报错。
ES中变量用var跟变量名来声明,默认情况下赋值undefined。如果声明变量的同时不用var关键字的话,该变量将会被创建成为全局变量(不推荐这样做!)。ES中变量为松散类型,可以存放任意类型的值。
ES中数据类型分为两种,一种是简单数据类型,一种是复杂数据类型。简单数据类型包括五种基本类型:Number,Boolean,String,Null和Undefined。复杂类型就一种——Object。判断一个变量是什么类型可以使用typeof操作符,注意 typeof null 返回object,因为null代表一个对象的空指针引用。还有一点,使用一个尚未定义的变量将会抛出错误,但是给定typeof一个尚未定义的变量名不会报错,会返回undefined。另外,undefined是派生自null值,所以null==undefined会返回true。
针对Boolean类型,用的比较多的是强制转换函数Boolean(),下边有张表来总结各种数据类型的转换关系(事实上隐式转换也一样):
数据类型 | 转换为true的值 | 转换为false的值 |
Boolean | true | false |
String | 非空字符串 | "" |
Number | 非零数值,包括无穷大 | 0和NaN |
Object | 任何对象 | null |
Undefined | 不适用 | undefined |
对于Number类型,此处总结一下整数转小数和小数转整数的方法:
//小数转化整数 var num = 4.721; Math.floor(num);//向下取整,4 Math.ceil(num);//向上取整,5 Math.round(num);//四舍五入,5 Math.round(num*10)/10;//保留一位小数4.7 Math.round(num*100)/100;//保留两位小数4.72 parseInt(num);//直接丢弃小数部分,4 //整数转小数 var num = 4; num.toFixed(2);//保留几位小数,注意此函数输出为字符串"4.00"
另外对于Number类型有个特殊的值NaN(Not a number),ES中任何数值除以0不会报错误,会返回NaN值。NaN有很多特性,任何无法返回确定数值的数学操作一般都会返回NaN值。NaN与任何值都不等,包括它自己,如果进行比大小也都返回false。ES中定义了一个isNaN()的函数来判断一个值是否为NaN,在调用之前,这个函数会首先尝试把传入值转为数值。
关于Number的强制转换有三个函数:Number(),parseInt()和parseFloat()。Number()函数有几个需要注意的转化:首先Number值都返回的是十进制的数字,Number(null) 返回0,Number(undefined)返回NaN,Number("")返回0。parseInt()函数可以指定要转换的进制数,另外需要注意以下几个情况:parseInt("")会返回NaN,parseInt("1234blue")会返回1234。对于parseFloat()也有需要注意的,比如它会忽略第二个小数点,另外它不识别进制数,所以parseFloat("0xA")返回0。
关于布尔操作符,首先对于!操作符,!null,!NaN,!undefined都返回true。对于&&和||操作符,执行短路操作,即如果第一个操作数能够决定最终结果则不会去运算第二个操作数。
关于相等运算符,遵循规则如果运算符两边有数字的话,那么两边都转化为数字进行比较。但是其中有个特殊情况需要注意,那就是在比较相等性的时候,null和undefined不能转换为任何值,所以null == 0返回false。
关于语句就总结一个switch语句,该语句执行的是全等操作,比较的时候并不会执行类型转换。
关于函数,首先没有重载,其次是函数的参数列表并非必须的,只是为了提供方便,因为函数内部有一个arguments数组来维护传入的参数,arguments只与传入的参数产生关系,与定义的参数列表无关。