一、关键字和保留字
ECMA-262描述了一组具有特定用途的关键字,这些关键字可用于表示控制语句的开始或结束,或 者用于执行特定操作等。按照规则,关键字也是语言保留的,不能用作标识符。下列是全部关键字:
break case catch continue debugger* default delete
do instanceof else new finally return for switch
function this if throw in try typeof var void while with
ECMA还描述了另外一组不能用作标识符的保留字。尽管保留字在这门语言中还没有任何特定 的用途,但它们有可能在将来被用作关键字。
abstract boolean byte char class const debugger double
enum export extends final float goto implements import
int interface long native package private protected public
short static super synchronized throws transient volatile
二、变量
ECMAScript的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。
每个变量仅仅是一个用于保存值的占位符而已。定义变量时要使用var操作符(注意var是一个关键 字),后跟变量名(即一个标识符),如下所示:
var message;
//这行代码定义了一个名为message的变量,
//该变量可以用来保存任何值(像这样未经过初始化的变量,会保存一个特殊的值——undefined)
ECMAScript 也支持直接初始化变量,因此在定义变量的同时就可以设置变量的值,如下所示:
var message = "hi";
//变量 message 中保存了一个字符串值"hi"。
像这样初始化变量并不会把它标记为字符串类型;初始化的过程就是给变量赋一个值那么简单。因此,可以在修改变量值的同时修改值的类型,如下所示:
var message = "hi";
message = 100; // 有效,但不推荐
用 var 操作符定义的变量将成为定义该变量的作用域中的局部变量。也就是说, 如果在函数中使用 var 定义一个变量,那么这个变量在函数退出后就会被销毁。
function test(){
var message = "hi"; // 局部变量
}
test();
alert(message); // 错误!
变量 message 是在函数中使用 var 定义的。当函数被调用时,就会创建该变量并为其赋值。 而在此之后,这个变量又会立即被销毁,因此例子中的下一行代码就会导致错误。不过,可以像下面这样省略 var 操作符,从而创建一个全局变量:
function test(){
message = "hi"; // 全局变量 }
test(); alert(message); // "hi"
//省略了var操作符,因而message就成了全局变量。
三、数据类型
ECMAScript中有5种简单数据类型(基本数据类型):Undefined、Null、Boolean、Number和String。还有 1 种复杂数据类型——Object,Object 本质上是由一组无序的名值对组成的。ECMAScript 不支持任何创建自定义类型的机制,而所有值最终都将是上述 6 种数据类型之一。
对一个值使用 typeof 操作符可能返回下列某个字符串:
"undefined"——如果这个值未定义;
"boolean"——如果这个值是布尔值;
"string"——如果这个值是字符串;
"number"——如果这个值是数值;
"object"——如果这个值是对象或 null;
"function"——如果这个值是函数。
var message = "some string";
alert(typeof message);// "string"
alert(typeof(message)); // "string"
alert(typeof 95);// "number"
typeof 操作符的操作数可以是变量(message),也可以是数值字面量。注意, typeof 是一个操作符而不是函数,因此例子中的圆括号尽管可以使用,但不是必需的。
有些时候,typeof 操作符会返回一些令人迷惑但技术上却正确的值。比如,调用typeof null会返回"object",因为特殊值 null 被认为是一个空的对象引用。
Undefined 类型只有一个值,即特殊的 undefined。在使用 var 声明变量但未对其加以初始化时,这个变量的值就是 undefined:
var message;
alert(message == undefined); //true
//等价于
var message = undefined;
alert(message == undefined); //true
包含 undefined 值的变量与尚未定义的变量还是不一样的
var message; // 这个变量声明之后默认取得了 undefined 值 // 下面这个变量并没有声明
// var age
alert(message);
alert(age);
// "undefined" // 产生错误
对未初始化和未声明的变量执行 typeof 操作符都返回了 undefined 值
var message; // 这个变量声明之后默认取得了 undefined 值
// 下面这个变量并没有声明
// var age
alert(typeof message);// "undefined"
alert(typeof age);// "undefined"
Null 类型是第二个只有一个值的数据类型,这个特殊的值是 null。从逻辑角度来看,null 值表示一个空对象指针,使用 typeof 操作符检测 null 值时会返回"object":
var car = null;
alert(typeof car);//"object"
如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为 null 而不是其他值。这样 只要直接检查 null 值就可以知道相应的变量是否已经保存了一个对象的引用。
if (car != null){
// 对 car 对象执行某些操作
}
实际上,undefined的值是派生自null 值的:
alert(null == undefined); //true
四、null和undefined的区别
在JavaScript中,null 和 undefined 几乎相等,都是原始类型,保存在栈中变量本地。
null表示没有对象,即该处不应该有值,主动释放一个变量引用的对象,表示一个变量不再指向任何对象地址。
1) 作为函数的参数,表示该函数的参数不是对象
2) 作为对象原型链的终点
3)当使用完一个比较大的对象时,需要对其进行释放内存时,设置为null。
undefined表示缺少值,即此处应该有值,但没有定义,所有没有赋值变量的默认值,自动赋值
1)定义了形参,没有传实参,显示undefined
2)对象属性名不存在时,显示undefined
3)函数没有写返回值,即没有写return,拿到的是undefined
4)写了return,但没有赋值,拿到的是undefined
console.log(null==undefined); //true 因为两者都默认转换成了false
console.log(typeof undefined); //"undefined"
console.log(typeof null); //"object"
console.log(null===undefined); //false
//"==="表示绝对相等,null和undefined类型是不一样的,所以输出“false”
null和undefined转换成number数据类型
null 默认转成 0
undefined 默认转成 NaN