引子
汤之盘铭曰:“苟日新,日日新,又日新。”《康诰》曰:“作新民。”《诗》曰:“周虽旧邦,其命维新。”是故君子无所不用其极。
–《大学》
语法
- 区分大小写:变量名区分大小写
- 标识符
- 第一个字母必须是:字母,下划线,或美元符号($)
- 其他字符可以是字母、下划线、美元符号或数字
- 标识符中也可以包含扩展的ACII字符或Unicode字符,但我们不推荐这么做,惯例上ECMAScript标识符采用驼峰大小写格式
- 注释:采用c风格注释
- 单行:// 注释内容
- 多行:/ 注释内容 /
- 严格模式:严格模式为javascript定义了一种不同的解析和执行模型。在严格模式下,ECMAScript3中的一些不确定行为将得到处理,而且某些不安全的操作也会抛出错误。整个脚本启用严格模式,可以在顶部加上代码:’use strict’;也可指定某函数:function doSomething(){‘use strict’ //函数体}
- 语句:ECMAScript中语句以一个分号为结尾;省略分号,则由解析器确定语句的末尾。
关键字和保留字
ECMA-262关键字:
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
ECMA-262保留字:
abstract,enum,int,short,boolean,export,interface,static,byte,extends,long,super,char,final,native,synchronized,class,float,package,throws,const,goto,private,transient,implements,protected,volatile,double,import,public
第五版非严格模式保留字:
class,enum,extends,super,const,export,import
第五版严格模式下增加的保留字:
implements,package,public,interface,private,static,let,protected,yield
关键字和保留字虽然不能用做标识符,但是可以作为属性名使用,但不推荐。
除上述关键字和保留字,第五版还对eval和arguments做了限制,在严格模式下,这两个名字也不能作为标识符或属性名,否则会抛出错误。
变量
- 定义:var message
- 松散类型
- 使用var定义的变量将成为定义该变量作用域内的局部变量
- 省去var可以定义全局变量
数据类型
5种简单数据类型
- undefined
- null
- Boolean
- Number
- String
一种复杂数据类型
- Object
typeof操作符
- undefined 此值未定义
- boolean 此值为bool值
- string 此值为字符串
- number 此值为数值
- object 此值为对象
- function 此值为函数
- typeof null == ‘object’
Undefined类型
Undefined类型只有一个值,undefined
包含undefined值的变量与尚未定义的变量是不一样的,尚未定义的变量直接调用会报错。
对尚未声明的变量只能执行一项操作,即使用typeof操作符检测其数据类型(对未经声明的变量调用delete不会导致错误,但这样做没有什么意义,而且严格模式下确实会导致错误)
尚未声明的变量调用typeof返回undefined
Null类型
Null类型只有一个值,null
从逻辑上讲,null值表示一个空对象指针
如果变量待保存的是对象,初始化的时候就应该明确的让变量保存null值
Boolean类型
Boolean类型只有两个值,true和false
要将一个值转换为其对应的Boolean值,可以调用函数Boolean()
转换规则(除Boolean类型本身):
- String类型,true - 任何非空字符串;false - 空字符串;
- Number类型,true - 任何非0数字值;false - 0和NaN;
- Object类型,true - 任何对象;false - null;
- Undefined类型,undefined - false
Number类型
数值字面量格式有十进制,八进制和十六进制
八进制第一位必须是0,然后是八进制数字序列(0-7)。如果数字序列中的值超出范围,那么前导0将会被忽略,后面数字将被当作十进制解析,八进制在严格模式下是不生效的,会导致javascript引擎抛除错误。
十六进制字面值的前两位必须是0x,后跟任何十六进制数字(0-9,A-F),字母可小写。
进行算数计算的时候,所有八进制和十六进制数字都将被转换为十进制。
浮点数值:所谓浮点数值,就是该数值中必须包含一个小数点,并且小数点后面至少要有一位数字。虽然小数点前面可以没有整数,但是不推荐。
- 由于保存浮点数值需要的内存空间是保存整数数值的两倍,ECMAScript会不失时机地将浮点数转换为整数
- 极大极小值,使用科学计数法,也叫e表示法。用e表示法表示的数值等于e前面的数值乘以10的指数次幂
- 浮点数的最高精度为17位小数,但在进行算术计算时其精确度远远不如整数。0.1 + 0.2 = 0.30000000000000004(中间是15个0)
数值范围:由于内存限制,ECMAScript并不能保存世界上的所有数值。
- 最小值:Number.MIN_VALUE == 5e-324
- 最大值:Number.MAX_VALUE == 1.7976931348623157e+308
- 正无穷:超出最大值,Number.POSITIVE_INFINITY == Infinity
- 负无穷:超出最小值,Number.NEGATIVE_INFINITY == -Infinity
- isFinite:确定数值是否是无穷的,无穷返回false,有穷返回true
NaN:这个数值表示一个本来要返回数值的操作未返回数值的情况
- 任何数值除以0返回NaN
- 任何涉及NaN的操作返回NaN
- NaN与任何值不等,包括自身
- isNaN函数:函数接收一个值会尝试将这个值直接转换为数值,任何不能转换为数值的值都会导致这个函数返回true
- isNaN也适用于对象,在基于对象调用isNaN函数时,会先调用对象的valueof方法,看此返回值能否转化为数值,如果不能,则基于这个返回值再调用toString方法,再测试返回值。这个过程同时也是ECMAScript中内置函数和操作符的一般执行流程。
数值转换:Number(), parseInt(), parseFLoat()
- Number:用于任何数据类型
- Boolean:true&false - 1&0
- Number:返回本身
- Null:返回0
- undefine:返回NaN
- 如果是字符串,遵循规则:
- 如果字符串中只包含数字(包含符号),将其转换为十进制数字值
- 如果字符串中包含有效的浮点格式,则将其转换为对应的浮点数值
- 如果字符串中包含有效的十六进制格式数值,则将其转换为相同大小的十进制数值
- 如果字符串是空的,则将其转换为0
- 如果字符串中包含除上述格式之外的字符,则将其转换为NaN
- 如果是对象,则调用其valueOf()方法,然后依照之前规则转换。如果转换为NaN,则调用对象toString()方法,然后再依照前面得规则转换
- parseInt:更多的看其是否符合数值模式
- 忽略字符串前面空格
- 第一个字符不是数字或者正负号,返回NaN
- 解析在遇到非数字字符结束
- 可以识别不同格式(5中八进制被忽略)
- 第二个参数可以传基数
- parseFloat:主要特点是第一个小数点有效
- 第一个小数点有效
- 始终忽略前导0,没有第二个参数传基数的用法,始终只解析十进制
- 如果能解析为整数,返回整数
- Number:用于任何数据类型