语法
1.区分大小写
2.标识符:命名规则和c语言一样,推荐使用驼峰命名法
3.注释:和C语言相同的单行注释和多行注释
4.严格模式:"use strict"
5.语句:末尾可以省略分号,不推荐.使用{}包含一个语句块
关键字和保留字
注意:关键字和保留字不要作为标识符
变量
特点:松散型,每个变量仅仅是一个用于保存值的占位符
定义:使用var关键字
var message
var message = "hi"
message = 100 不推荐改变变量类型
作用域:使用var定义的变量将成为该变量的作用域内的局部变量
数据类型
1.分类
简单类型(5种):Undefined,Null,Boolean,Number,String
复杂类型:Object
2.typeof操作符
返回的字符串类型可能值
- "undefined"---这个值可能没有定义
- "boolean"---这个值是布尔值
- "string"---这个值是字符串
- "number"---这个值是数值
- "object"---这个值是对象或者空
- "function"---这个值是函数
var message = "some string";
alert(typeof message);
alert(typeof(message));
alert(typeof 95);
注意:typeof是操作符不是函数,所以后面的括号不是必须的
3.Undefined类型
说明:使用var声明变量但是没有对其初始化时的值
var message;
alert(message == undefined);//true
4.Null类型
说明:空类型只有一个值null,表示一个空对象指针.
var car = null;
alert(typeof car); //"object"
注意:null需要显示的设置为null,用来说明将来保存对象
5.Boolean类型
说明:该类型具有两个字面值:true和false(区分大小写,必须是小写的),注意true不一定等于1,false不一定等于0.
var found = true;
var lost = false;
转换:所有的类型都能装换成Boolean类型
var message = "Hello world!";
var messageAsBoolean = Boolean(message);
转换规则:任何非空字符串,非0数字值,任何非空对象,都能转换为true
6.Number类型
1.整数:所有的八进制和十六进制在进行数值计算时都会被转换成十进制数值
var intNum = 55;//整数
var octalNum = 070; //八进制的56,严格模式下无效
var hexNum = 0xAb;//十六进制,字母大小写都可以
2.浮点数值
说明:小数点后面必须至少有以为数字
var floatNum = 1.1
a.由于浮点数的内存空间是整数的两倍,系统会在必要时自动将浮点数转换为整数
var floatNum1 = 1. ;//转换为整数
var floatNum2 = 10.0;//转换为整数
对于极大和极小的数值,可以使用科学计数法表示
var floatNum1 = 3.12e7;
var floatNum2 = 3.12e-7
注意:不要使用判断浮点数
0.1 + 0.2 = 0.30000000000000004
数值转换:把非数值转化为数值:Number(),parseInt(),parseFloat(),第一个函数可以应用于任何类型,而另外两个函数专门把字符串转换为数值
Number()转换规则
- Boolean类型,true和false分别被转换为1何0
- 数字值,只是简单的传入和返回
- null值,返回0
- undefined ,返回NaN(非数值)
- 字符串
- 如果字符串中值包含数字(包括前面带正号或者负号的情况),将其转换为十进制数值,会忽略前面的0
- 如果包含浮点格式,将转换为浮点数
- 如果包含十六进制,转换为十六进制,
- 如果时空字符串,转换为0
- 如果包含上述格式之外的内容,转换为NaN
- 如果是对象,则调用对象的valueoOf方法,然后按照前面的规则转换,如果转换的结果是NaN,则调用对象的toString()方法,再按照前面的规则转换
var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number(true); //1
parseInt(),parseFloat(),用到时可以自己查看转换规则
7.String类型
说明:字符串可以用单引号或者双引号,没有区别.
1)字符字面量(转义序列)
\n \t \f...
2)字符串的特点
字符串是不可变的
var lang = "Java";
lang = lang + "Script";
实际操作过程如下,首先创建一个能容纳10个字符的新字符串,然后在这个字符串中填充"Java"和"Script",最后一步是销毁原来的字符串"Java"和"Script".
3)转换为字符串(使用toString()方法)
var age = 11;
var ageAsString = age.toString();//字符串11
var found = true;
var foundAsString = found.toString();//字符串"true"
注意null和undefined没有这个方法,如果不知道数据类型,可以使用String()函数,String()函数的规则
- 如果值有toString()方法,则调用该方法
- 如果是null,则返回null
- 如果是undefined,则返回"undefined"
8.Object类型
说明:对象就是一组数据和功能的集合,使用new创建
var o = new Object();
Object的每个实例都具有下列属性和方法
- constructor:保存着用于创建当前对象的函数,对于前面的例子,构造函数(constructor)就是Object.
- hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在,作为参数的属性名(propertyName)必须以字符串的形式制定(如: o.hasOwnProperty(name))
- isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型
- propertyIsEnumerable(propertyName): 用于检查给定的属性是否能够使用for-in语句来枚举
- toLocaleString(): 返回对象的字符串表示,该字符串与执行环境的地区对应
- toString(): 返回对象的字符串表示
- valueOf(): 返回对象的字符串,数值或者布尔值表示,通常与toString()方法的返回值相同
操作符
一元操作符
1.递增和递减,分为前置递增和递减和后置递增和递减,区别在,前置时,变量的值在语句被求值之前改变
var age = 29;
var anotherAge = --age + 2;
alert(age);//输出28
alert(anotherAge);//输出30
var age = 29;
var anotherAge = age-- + 2;
alert(age);//输出28
alert(anotherAge);//输出31
2.一元加和减操作符
一元加操作符运用于数值前,不会产生任何影响
一元减操作符运用于数值前,会变成相反数
一元加减运用于飞数值钱,先进行转换为数值,再进行上面的判断
3位操作符
包括按位与或非,异或,有无符号右移,左移,可以自己研究
4.布尔操作符
1).逻辑非(!)
2).逻辑与(&&):是一个短路操作符,如果第一个是假,就不会判断后面的数值
逻辑与不一定用于布尔值遵循以下规则
- 如果第一个操作室是对象,则返回第二个操作数
- 如果第二个操作室是对象,只有第一个操作数的求值结果为true的情况下才会返回该对象
- 如果两个操作数都是对象,则返回第二个操作数
- 如果有一个操作数是null,则返回null
- 如果有一个操作数是NaN,则返回NaN
- 如果有一个操作数是undefined,则返回undefined
3)逻辑或(||):是一个短路操作符,如果第一个操作数结果为true,则不会对第二个操作数求值,不是布尔值遵循下面的规律
- 如果第一个操作数是对象,则返回第一个操作数
- 如果第一个操作数的求值结果是false,则返回第二个操作数
- 如果两个操作数都是对象,则返回第一个操作数
- 如果两个操作数都是null,则返回null
- 如果两个操作数都是NaN,则返回NaN
- 如果两个操作数都是undefined,则返回undefined
5.乘性操作符
如果应用于非数值,会执行自动的类型转换
1)乘法(*)
2)除法(/)
3求模(%)
5.加性操作符
如果应用于非数值,会执行自动的类型转换
1)加法(+)
2)减法(-)
6.关系操作符
如果应用于非数值,会执行自动的类型转换
符号为:(<)(>)(<=)(>=),结果返回布尔值类型
7.相等操作符
相等不相等(== !=)
全等和不全等(=== !==)
8.条件操作符(三目操作符)
? :
9.赋值操作符(=)
符合赋值操作符(+=, -=, *=.....)
10.逗号操作符(,)
逗号操作符依次执行,返回表达式的最后一项.
11.语句:if,while,do-while,for-in
12.label语句
使用label语句可以在代码中添加标签,以便将来使用
label: statement
示例:
start: for(...){
}
13.break和continue语句
联合label语句跳到指定的位置
14.with语句:将代码的作用域设置到一个特定的对象中
严格模式下会发生错误,并且导致性能下降,不建议使用
15.switch语句
每个case后面都要添加break语句,防止贯穿
函数
使用function关键字来声明
不必指明返回值,直接使用return关键字就可以返回
参数的理解
传递的参数个数没有规定,即使定义的函数只接收两个参数,也可以传任意个数的参数,在函数体内可以通过arguments对象来访问参数的数组
基本类型和引用类型的值
1.复制变量值
复制基本变量的值,会创建一个新值,并把该值复制到新变量分配的位置上
var num1 = 5;
var num2 = num1;
num1 和num2 有不同的存储空间
复制引用类型的值
var obj1 = new Object();
var obj2 = obj1;
只是将地址复制给了obj2 ,两个变量指向的是同一个空间
检测类型
1.基础类型:使用typeof
2.对象使用instanceof
alert(person instanceof Object)
alert(colors instanceof Array)
执行环境和作用域
说明:
1.每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中.
2.全局执行环境是最外围的一个执行环境,在web浏览器中,全局执行环境被认为是window对象,因此,所有全局变量和函数都是作为window对象的属性和方法创建的.某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁
3.每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中,,当函数执行之后,栈将环境弹出,把控制权返回给之前的执行环境
4.当代码在一个环境中执行时,会创建变量对象的一个作用域链,用途:保证对执行环境有权访问的所有变量和函数的有序访问.
5.如果环境是函数,则将其活动对象作为变量对象,活动对象最开始时只包含一个变量,即arguments对象.作用域链中的下一个变量对象来自包含环境(外部)环境.下一个变量对象来自下一个包含环境.一直延续到全局执行环境.全局执行环境的变量对象始终都是作用域链中的最后一个对象
举例说明:
var color = "blue";
function changeColor() {
var anotherColor = "red";
function swapColors(){
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
//此处可以访问color, anotherColor和tempColor
}
//这里可以访问color和anotherColor,但不能访问tempColor
swapColors();
}
//此处只可以访问color,并且此处不能访问 swapColors();因为外部环境不能访问内部环境的变量和函数
changColor();
解析:
1.此处包含三个环境:全局环境,changeColor()的局部环境和swapColors()的局部环境,对于全局环境而言,变量对象保存了color变量和changeColor()函数.changeColor()的变量对象保存了anotherColor变量和swapColors()函数.
2.对于swapColors(),其作用域链包含3个对象,swapColors()的变量对象,anotherColor的变量对象,全局变量对象.
3.内部环境可以通过作用域链访问所有的外部环境,但是外部环境不能访问内部环境中的任何变量和函数.
延长作用域链
try-catch语句的catch块
没有块级作用域
除非在函数中,如果只是在{}之间,在外面也可以访问{}之内的变量
if (true) {
var color = "blue";
}
alert(color) //"blue"