基础
Javascript中的变量是大小写敏感的。
一个 JavaScript 标识符必须以字母、下划线(_)或者美元符号($)开头;后续的字符也可以是数字(0-9)。 因为 JavaScript 语言是区分大小写的,所以字母可以是从“A”到“Z”的大写字母和从“a”到“z”的小写字母。
声明
声明变量
- var:声明一个局部或全局变量,可选初始值;可以变量提升。
- let:声明一个块作用域的局部变量,可选初始值;不能变量提升。
- const:声明一个块作用域的只读常量,必初始值。
变量求值
// 直接代码说明
// 取值
var a;
console.log(a); // undefined
console.log(b); // undefined,存在变量提升
var b;
console.log(c); // 未捕获的引用错误: c 未被定义
let x;
console.log(x); // undefined
console.log(y); // 未捕获的引用错误: c 未被定义, let声明的变量不会被提升
let y;
// 隐式转换
// undefined和null在布尔类型环境中都会转换为false
var isLogin;
if (isLogin) {
// do something...
}
// 在数值环境中,undefined被转为NaN,null被转为0
var num;
console.log(num - 0); // NaN
var num2 = null;
console.log(num2 - 0); // 0
复制代码
变量作用域
在函数之外声明的变量,叫做全局变量,因为它可被当前文档中的任何其他代码所访问。在函数内部声明的变量,叫做局部变量,因为它只能在当前函数的内部访问。
ECMAScript 6 之前的 JavaScript 没有 语句块 作用域
if (true) {
var x = 5;
}
console.log(x); // 5
if (true) {
let x = 5;
}
console.log(x); // ReferenceError: y 没有被声明
复制代码
变量提升
JavaScript中可以先使用变量稍后再声明变量而不会引发异常。这一概念称为变量提升。
JavaScript 变量感觉上是被“提升”或移到了函数或语句的最前面。但是,提升后的变量将返回 undefined 值。因此在使用或引用某个变量之后进行声明和初始化操作,这个被提升的变量仍将返回 undefined 值。
console.log(x === undefined); // true
var x = 3;
复制代码
由于存在变量提升,一个函数中所有的var语句应尽可能地放在接近函数顶部的地方。
在 ECMAScript 6 中,let(const)将不会提升变量到代码块的顶部。因此,在变量声明之前引用这个变量,将抛出引用错误(ReferenceError)。
函数提升
对于函数来说,只有函数声明会被提升到顶部,而函数表达式不会被提升。
/* 函数声明 */
foo(); // "bar"
function foo() {
console.log("bar");
}
/* 函数表达式 */
baz(); // 类型错误:baz 不是一个函数
var baz = function() {
console.log("bar2");
};
复制代码