变量是存储信息的容器,在JS中,变量是松散类型的,所以JS中的变量可以用来保存任何类型的数据。所以变量是没有类型的,值才有。
变量标识符
标识符是指变量、函数和属性的名字,或者函数的参数,标识符需要满足一下条件:
第一个字符必须是一个字符、下划线
_
或一个美元符号$
;其他字符可以是字母、下划线、美元符号或数字;
JS中有一组具有特殊用途的关键字,这些关键字可用于表示控制语句的开始或结束,或者用于执行特定操作,这些关键字不可用于标识符;另外还有一组可能将来被用作关键字的保留字,最好也不要用保留字作为标识符;
var case = 1; // 报错,case为关键字 var char = 2; // 未报错,但char为保留字,建议不要用于标识符
定义变量
在JS中变量的定义会被分为两步,变量声明和变量赋值。
var a = 1; // 声明变量并赋值
// 上面可以拆分为两步
var a; // 变量声明
a = 1; // 变量赋值
var b; // 声明变量未赋值,变量值为undefined
上面的代码我们使用了var
操作符定义变量,变量将会作为变量所在作用域中的局部变量。如果在函数中使用var定义一个变量,那么这个变量在函数退出后将会被销毁。
如果未用var
操作符而直接对变量进行赋值,变量将会自动声明成为全局变量,在浏览器中全局变量会作为window对象的属性。
a = 1; // 未使用var
window.a // 1
在变量声明之后再声明同名变量
var a = 1;
a // 1
var a = 2; // 再次声明赋值同名变量,变量声明已经有同名的,所以重复的var声明被忽略,但赋值不会,所以a被赋新值2
a // 2
var a; // 再次声明同名变量,变量声明已经有同名的,所以重复的var声明被忽略,这条语句无效
a // 2
变量值的类型
JS变量仅仅是一个保存值的占位符而已,所以变量的值可以是任何类型的数据。
在JS中数据有七种内置类型:空值( null)、未定义( undefined)、布尔值( boolean)、数字( number)、字符串( string)、对象( object)、符号( symbol, ES6 中新增)。null,表示一个空对象指针,用于将来保存对象但还没有真正保存对象时,变量初始化的值;undefined,表示变量已声明但未初始化赋值;Boolean,布尔类型,布尔(逻辑)只能有两个值:true 或 false;string,字符串是储存字符的变量;number,数字类型;object,对象是一组数据和功能的集合。
var a = 1; // 变量值可以是基本类型
a = function () { console.log(2) }; // 修改变量的值为一个函数
变量值还有另一种类型区分方式,分为基本类型值(如undefined、null、boolean、number、string)和引用类型值(如object)。
基本类型值,保存在栈内存,这种值完全保存在内存的一个位置;
var a = 1; var b = a; b = 2; a // 1,基本类型值通过值复制传递,两个值之间相互独立,不会互相影响
引用类型值,保存在堆内存,变量保存的实际上只是一个指针,这个指针指向内存中的一个位置,该位置保存对象;
var a = [1]; var b = a; b.push(2); a // [1, 2],引用类型通过引用复制传递,两个变量指向同一个对象,会相互影响