重新学习,JavaScript(一)
var
var 是变量声明命令(ES6增加了let和const)
var a; // 通知解释引擎,要创建变量a
var a = 1; // 声明变量 a 并赋值为 1
var a = 1 + 1; // 声明变量 a 并赋值为表达式 1+1
只声明变量不赋值
var a;
a; // undefined
声明变量并赋值
var a;
a = 1;
a; // 1
var a = 1;
a; // 1
不声明变量直接使用
a; // ReferenceError: a is not defined
变量提升
javascript 引擎的工作方式为先解析代码,获取所有被声明的变量,再一行行运行。
结果,所有变量声明语句会被提升到代码的顶部,这就叫变量提升。
console.log(a); // undefined
var a = 1;
// 因为存在变量提升,所以不会执行失败,相当于以下代码
var a;
console.log(a); // undefined
a = 1;
ES6 let 和 const
let
ES6 新增了 let 命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
{
let a = 1;
var b = 2;
}
a // ReferenceError: a is not defined.
b // 2
let 不存在变量提升问题
// var 的情况
console.log(a); // 输出:undefined
var a = 1;
// let 的情况
console.log(a); // 报错:ReferenceError
let a = 1;
let 不允许同一作用域下重复声明
// var 的情况
// 报错
function func() {
let a = 10;
var a = 1;
}
// let 的情况
// 报错
function func() {
let a = 10;
let a = 1;
}
// 不报错
function func() {
let a = 10;
if (true) {
let a = 1;
}
}
func();
// 不报错
function func(a) {
if (true) {
let a = 1;
}
}
func();
const
const 声明一个只读的常量。一旦声明,常量的值就不能改变。
const 和 let 一样有作用域,需要注意的是 const 声明时需要赋值,不赋值会报错。
const 本质为,变量指向的那个内存地址所保存的数据不得改动。
const a = {};
a.b = 1;
a.b // 1
// 重新指向另一个对象报错
a = {}; // TypeError: "a" is read-only
数据类型
JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。(ES6新增了第七种 symbol)
- 数值(number):整数和小数(比如 1 和 3.14 )
- 字符串(string):文本(比如 Hello World)。
- 布尔值(boolean):表示真伪的两个特殊值,即 true(真)和 false(假)
- undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
- null:表示空值,即此处的值为空。
- 对象(object):各种值组成的集合。
通常,数值、字符串、布尔值这三种类型,合称为原始类型(primitive type)的值,即它们是最基本的数据类型,不能再细分了。对象则称为合成类型(complex type)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。至于 undefined 和 null ,一般将它们看成两个特殊值。
对象是最复杂的数据类型,又可以分成三个子类型。
- 狭义的对象(object)
- 数组(array)
- 函数(function)
typeof
typeof 运算符可以返回一个值的数据类型。
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
function f() {}
typeof f
// "function"
typeof undefined
// "undefined"
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
instanceof 运算符可以区分数组和对象
var o = {};
var a = [];
o instanceof Array // false
a instanceof Array // true
参考资料
阮一峰: JavaScript 教程
阮一峰: ECMAScript 6 入门