//变量是表示值的一个符号名字
//变量是通过var关键字声明的
var x; //声明一个变量x
//值可以通过等号赋值给变量
x = 1; //现在变量x的值为1
console.log(x); //=> 1:通过变量获取其值
//JavaScript支持多种数据类型
x = 1; //数字型
x = 0.01; //浮点型
x = "xxx"; //由双引号内的文本构成的字符串
x = 'xxx'; //由单引号内的文本构成的字符串
x = true; //布尔值
x = false; //另一个布尔值
x = null; //null是一个特殊的值,意思是"空"
x = undefined; //undefined和null非常类似,意思是"未定义"
//JavaScript中最重要的类型就是对象
//对象是名/值对的集合,或字符串到值映射的集合
var book = { //对象是由花括号括起来的
top: "JavaScript", //属性'top'的值是'JavaScript'
fat: true //属性'fat'的值是true
}; //右花括号标记了对象的结束
//通过"."或"[]"来访问对象属性
book.top //=>"JavaScript"
book["fat"] //=>true:另外一个获取属性的方法
book.author = "Flanagen"//通过赋值创建一个新属性
book.contents = {}; //{}是一个空对象,它没有属性
//JavaScript同样支持数组(以数字为索引的列表)
var primes = [2,3,5,7]; //拥有四个值的数组,由"["和"]"划定边界
primes[0]; //=>2: 数组中的第一个元素
primes.length //=>4: 数组中的元素个数
primes[primes.length - 1]; //=>7: 数组的最后一个元素
primes[4] = 9; //通过赋值来添加新元素
primes[4] = 11; //或通过赋值来改变已有的元素
var empty = []; //[]是空数组,它具有0个元素
empty.length //=> 0
//数组和对象中都可以包含另一个数组或对象
var points = [ //具有两个元素的数组
{x: 0, y: 0}, //每个元素都是一个对象
{x: 1, y: 1}
];
var data = { //一个包含两个属性的对象
trial1: [[1, 2],[3,4]], //每一个属性都是数组
trial2: [[2, 3],[4,5]] //数组的元素也都是数组
};
var a;
function b(){
var a = 1;
}
b();
console.log(a);
//输出undefined
var a;
function b(){
a = 1;
}
b();
console.log(a);
//输出1
作用域与两种,一种是全局作用域,一种是局部作用域
在函数体外部声明的变量是全局作用域,在函数体内部也可以使用
在函数体内部声明的变量是局部作用域,在函数体外部不能使用
声明不等于赋值,在函数体外部声明的变量,在函数体内部赋值,在函数体外部可以随时调用
在函数体内部,局部变量的优先级高于同名的全局变量。
如果在函数体内部声明的一个局部变量和全局变量重名,那么全局变量就会被局部变量覆盖。
var scope = "global"; //声明一个全局变量
function person(){
var scope = "local"; //声明一个同名的局部变量
return scope; //返回局部变量的值,而不是全局变量的值
}
person(); //=>"local"
在全局作用域编写代码时可以不写var语句,但声明局部变量时则必须使用var语句。
scope = "global"; //声明一个全局变量,不用var语句来声明
function person(){
scope = "local"; //这就是修改了全局变量
myscope = "123"; //这里是显式的声明了一个全局变量
return [scope,myscope]; //返回两个值
}
person(); //["local", "123"]: 产生了副作用
scope //=>"local":全局变量修改了
函数定义是可以嵌套的。由于每个函数都有它自己的作用域,因此会出现几个局部作用域嵌套的情况。
var scope = "global scope"; //全局变量
function person(){
var scope = "local scope"; //局部变量
function nested(){
var scope = "nested scope"; //嵌套作用域内的局部变量
return scope; //返回当前作用域内的值
}
return nested();
}
person(); //=>嵌套作用域
//输出"nested scope"