包含语法、操作符、数据类型、内置功能
适用ECMAScript 3
语法
大小写敏感(一切名字都敏感,包括不限于变量名,函数名,操作符名等)
标识符
由字母(包含扩展ASCII字母和Unicode字母),数字,下划线,美元符号组合组成
规则1:第一个字符不能是数字
规则2:不能用保留字和关键词
驼峰命名法是最佳实践
注释
C风格注释
//单行注释
/*
* 多行注释
*/
严格模式
ES5中引入 严格模式
在脚本首行加入
"use strict";
其实是条编译器指令(pragma)
也可在函数中单独使用
function doSomething(){
"use strict";
}
语句
加不加分号都行,但是需要让解释器能够确定语句结束(比如换行)
但是最好加上分号,比如压缩代码时,调试时等
可以使用{}
把多条语句组合成代码块,在if,while等中最好用{}
扩住,以防止不必要的错误
关键字和保留字
abstract
boolean break byte
case catch char class const continue
debugger default delete do double
else enum export extends
false final finally float for function
if implements import in instanceof int interface
long
native new null
package private protected public
short static super switch synchronized
this throw throws transient true try typeof
var void volatile
while with
了解即可
变量
JavaScript是类型松散型,一个变量名可以表示多种变量类型,比方说 鸭蛋儿
这个名字,既可以表示吃的鸭蛋,也可以表示人
如何定义一个变量:
var message;
定义个名字为message的变量,在没有值之前,message有特殊值——undefined,表示值不明确
变量初始化:
var message = "空尼奇瓦";
并不会把message的类型限定为string,只是此时为string,还可以赋值为别的类型
message = 100
可以这么做,但是不推荐
作用域问题
function test(){
var message = "hi";
}
message作用域在函数test中
超出作用域访问会报错
test();
alert(message);//报错 Uncaught ReferenceError: a is not defined
省略var即可创造全局变量
function test(){
message = "hi";
}
test();
alert(message);
注意点:test函数被调用message才会声明,只写message不给值,报错
不推荐使用
联合声明
var message = "hi",
found = false,
age = 29;
写成多行便于阅读,非必须
数据类型
ECMAScript中有6种数据类型,简单类型(也称基本)有5种:undefined
、null
、boolean
、number
和string
,复合数据类型有1种:object
typeof
返回变量的类型,typeof
是操作符,不是函数
6种可能值undefined
boolean
number
string
object
function
,为毛没有null
类型,反而多一个 function
类型,null
和function
其实都是 object
类型,但是null
没有特殊返回一种类型,function
特殊返回function
,并没有返回object
,注意,之前各浏览器实现不同
undefined
undefined
类型只有一个值undefined
。在声明了一个变量,但是没有赋值时,为undefined
var message;//undefined
age;//Uncaught ReferenceError: age is not defined
注意区别
var message;//undefined
alert(typeof message + typeof age);
执行typeof
,都返回undefined
,这就尴尬了,书上说,这合理,我们要做的是,为每个已经声明的变量显式赋值,这样返回undefined
时,我们就能知道这个值是未声明过了,因为已经声明赋值过的变量不会返回undefined
null类型
null
类型有一个值null
,表示空对象指针,但是typeof null
返回object
,合理
最好把一个将来用作对象类型的变量初始化为null,因为这样我们就可以用if(xxx != null)
来判断对象有没有值,假如不怎么做,还有一个undefined
undefined
派生自null
所以
null == undefined//为true
boolean类型
boolean
有两个值 true
和false
所有类型的值都可以转化为boolean
类型,使用Boolean()
函数
返回false
的有,""
(空串),0
与NaN
,null
,undefined
其他返回true
在控制流语句中会自动转换
number类型
包含整数和浮点数(双精度)
整数
默认为十进制
var intNum = 10;//整数10进制10
整数还有8进制和16进制表示法,8进制前缀为0,16进制前缀为0x或则0X,另外在8进制表示法中出现0-7之外的数字,8进制会被当做10进制解析
var a = 10 //10进制的10
var b = 010 //8进制的8
var c = 0x10 //16进制的16
var d = 08 // 会被当做 10进制的8,因为超出了0-7
8进制字面量在严格模式下无效
在进行算术计算时,结果都为10进制
JavaScript可以保存+0
和-0
,二者相等
浮点数
带有小数点,并且小数点后至少必须有一位不为0的数字
var a = 1.1;//浮点数1.1
var b = 0.1;//浮点数0.1
var c = .1;//浮点数0.1,这种写法不推荐
浮点数内存是整数两倍,所以为了节省空间,JavaScript会把可以当做整数的数当做整数
var a = 0.0 //整数0
var b = 1.0 //整数1
对于极大和极小值,JavaScript使用科学计数法
var a = 3.14e7 // 3.14乘以10的7次方
var b = 3.14e-7 // 3.14乘以10的-7次方
ECMAScript会把小数点后面带有6个0以上的浮点数转换为e表示法,如0.0000003
会被转换成3e-7
浮点数最高精度为17位小数(有效数字,从左起第一个不为0的数算起到末尾的个数),用浮点数做运算和比较操作是不准确的,这属于浮点数在计算机中的表示法决定的
数值范围
ECMAScript能够表示的最大数值为Number.MAX_VALUE(1.7976931348623157e+308)
,最小数值为Number.MIN_VALUE(5e-324)
,如果超出这两个范围,会被转换成Infinity(正无穷)
,或-Infinity(负无穷)
,正负无穷无法参与计算,isFinite()
可以判断是不是有穷,另外,正负无穷被保存在Number.NEGATIVE_INFINITY
和Number.POSITIVE_INFINITY
NaN
非数值(Not a Number)是个特殊的数值,数值/0 就会得到NaN
,这个值有两个特点
1、与任何值计算都会返回NaN
2、与任何值都不相等,包括自身
函数isNaN()
来判断是不是NaN
,该函数接受一个参数,参数可以是任何类型
isNaN(NaN);//true
isNaN(10);//false 10
isNaN("10");//false 10
isNaN("blue");//true
isNaN(true);//false 1
isNaN('true');//true
数值转换
三个函数 Number()
,parseInt()
,parseFloat()
。
Number()
把可用于任意类型,parseInt()
和parseInt()
专门用于字符串
Number()
函数装换规则:
-
true
和false
对应1和0 - 数字输出数字
-
null
为0
-
undefined
返回NaN
- 字符串
只包含数字转换为十进制
'1';//1
'123';//123
'011';//前缀0被忽略,11,就8进制不行
'1.1'//1.1
'0xf';//16进制形式,为10进制15
'';//空字符串为0
除了以上格式,皆为NaN
- 对对象使用
Number()
函数
调用对象的valueOf()
方法,依照前述规则进行转换返回的值,如果转换结果为NaN
,则调用对象toString()
,然后依照字符串转换规则转换
Number()
函数过于复杂,一般使用parseInt()
函数
规则:
忽略字符串前面的空格,直到第一个非空字符,如果这个非空字符不是数字或者正负号,返回NaN
,所以parseInt()
转换空字符串返回NaN
,如果第一个非空字符是正负号或者数字,继续解析以后字符,直到遇见非数字字符,1234blue
为1234
,22.5
为22
,因为小数点不是数字字符
如果字符串中的第一个非空字符是数字字符或者正负号,parseInt()
也可以识别出各种进制
' 1234ddd';//1234
'';//NaN
'0xA';//10
'010';//8
'22.5';//22
注意,在ES5中,parseInt()
不能解析8进制(为毛老是8进制),有前缀0的会被解析成10进制
parseInt()
的第二个参数可以指定解析的进制,如parseInt("0xAF",16)
,解析为175
一般我们都指定进制
parsefloat()
和parseInt()
基本类似,不同在于
parsefloat('2.1.1');//为2.1
parseInt('2.1.1');//为2
parsefloat()
会忽略前缀0,可以转成整数就返回整数,如'1.0'
,16进制格式始终返回0,parsefloat()
只解析10进制
'1234kkk';//1234
'0xA';//0
'22.6';//22.6
'22.2.2';//22.2
'0099.09';//99.09
'3.125e7';//31250000
string类型
由0到多位Unicode
字符组成的字符序列,即字符串。由""
或者''
包裹,两者意义相同,配对即可。
字符字面量
特殊字面量,转义序列,用于表示非打印字符或者有特殊用途的字符
\n;//换行
\t;//制表
\b;//空格
\r;//回车
\xnn;nn为16进制,\x41表示A
\unnnn;nnnn为16进制,表示一个Unicode字符,\u03a3
后两种表示法也可以放在字符串中
var text = 'this is a pen apple pen \u03a3';
用length
可以获得字符串中16位字符(哪个大神解释下?16位不就是双字节吗)的数目,如果字符串中包含双字节字符,不精确,一个汉字占用两个长度,但是两字汉字一起却占用三个长度。
字符串特点
字符串不可变,只能用新的字符串覆盖原来的变量名
var str = "Hello";
str = str + " World"//Hello World
转换成字符串
几乎每个值都有toString()
方法,null
和undefined
没有
var a = true;
a.toString();//‘true’
var b = 11;
b.toString();//'11'
数值型调用toString()
方法时,可以指定进制
var num = 10;
num.toString();//10
num.toString(2);//1010
num.toString(8);//12
因为null
和undefined
没有toString()
方法,不小心调用会报错,我们可以使用String()
函数,任意数值都可以转换,转换规则如下:
- 值有
toString
方法,调用返回 - 值是
null
返回'null'
- 值是
undefined
返回'undefined'
使用加号+
操作符,和字符串一起,值就会调用String()
object类型
一组数据和功能的集合,通过new
创建
var o = new Object();//没有参数时,可以省略(),不推荐
Object
类型是所有实例的基础
每个Object
类型都有:
-
Constructor
:保存着用于创建当前对象的函数,比如Object()
-
hasOwnProperty(propertyName)
:propertyName
必须为字符串,检查在当前实例中是否存在相应的属性名 -
isPrototypeOf(object)
:检查传入的对象是否是另一个对象的原型(到底谁是谁的原型) -
propertyIsEnumerable(propertyName)
:属性是否可遍历 -
toLocaleString()
:返回与执行环境地区对应的字符串 -
toString()
:字符串表示 -
valueOf()
:返回对象的字符串,数值或者布尔值表示,对象->值
注意:浏览器环境中的对象,比如BOM
或者DOM
中的对象,属于宿主对象,不一定会继承Object