1. 变量
javascript中的变量是松散型,可以用来保存任何类型的数据。
用var操作符定义的变量将成为定义该变量的作用域中的局部变量。
省略var操作符后可以创建一个全局变量。(不推荐)
可以使用一条语句定义多个变量:
var message = "hi", found = false; age = 26;
2. 数据类型
简单数据类型:undefined, Null, Boolean, Number, String.
复杂数据类型:Object。 Object本质上是由一组无序的名值对组成的。
- typeof 检测给定变量的数据类型,是一个操作符而不是函数
- Undefined 包含undefined值得变量与尚未定义的变量不一样:
var message; alert(message); //undefined alert(age); // 发生错误
- Null 如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其它值。
- Boolean 该类型只有两个字面值:true和false。虽然字面值只有两个,但可以对任何数据类型的值调用Boolean函数,就会返回一个Boolean值。
转化为true的:
Boolean(任何非空字符串)
Boolean(任何非零数字值)
Boolean(任何对象)
转化为false的:
Boolean("")
Boolean(0 和 NaN)
Boolean(null)
Boolean(undifined)
- Number
Number采用的是IEEE 754 64位双精度浮点数编码。
八进制字面值的第一位必须是0,然后是八进制数字序列(0-7)。如果字面值中的数字超过7,那么第一个0会被忽略,后面的数值将被当作十进制数值解析。
var num1 = 070; // 八进制56 var num2 = 079; // 无效的八进制,转化为十进制79 var num3 = 08; // 无效的八进制,转化为十进制8
十六进制字面值的前两位必须是0x.
在进行算术计算时,所有以八进制和十六进制表示的数值最终都将被转换为十进制数值。
浮点数的最高精度是17位小数。3.125e7 = 3.125 * 10^7.
4, 由于ECMAScript中不存在块级作用域,因此在循环内部定义的变量也可以在外部访问到。
5,with语句
with语句的作用是将代码的作用域设置到一个特定的对象中:with(expression) statement;
var qs = location.search.substring(1); var hostname = location.hostname; var url = location.href;
使用with后:
with(location) { var qs = search.substring(1); var hostname = hostname; var url = href; }
上例中,使用with语句关联了location对象,这意味着在with语句的代码块内部,每个变量首先被认为是一个局部变量,而如果在局部环境中找不到该变量的定义,就会查询location对象中是否有同名的属性。如果发现了同名属性,则以location对象属性的值作为变量的值。
6, switch语句
可以在switch语句中使用任何数据类型,无论是字符串还是对象都没有问题。
7, 函数
ECMAScript函数不介意传递进来多少个参数,也不在乎传进来的参数时什么数据类型。原因是ECMAScript中的参数在内部是用一个数组来表示的,函数接受到的是中都是这个数组,而不关心数组中包含哪些参数。
ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数。
ECMAScript不能像传统意义上那样实现重载。如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数。
所有函数的参数都是按值传递的,也就是说把函数外部的值复制给函数内部的参数。
instanceof可以检测引用是什么类型的对象。
8, 执行环境及作用域
每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
全局执行环境是最外围的一个执行环境。在Web浏览器中,全局执行环境被认为是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的。某个执行环境中的所有代码执行完毕之后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。
内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。每个环境都可以向上搜索,但不能向下搜索。