变量是内存中被分配的指定空间的名字,而数据是这个空间中的存储的东西。变量的作用域在任何一个编程语言中应该是一个基本概念,而在 Javascript 中,这一基本概念往往挑战初学者的常识。 JavaScript 是个动态类型的编程语言(关于语言的分类可以研究一下这篇文字 类型系统(Type System)
变量本身数据类型不固定的语言称之为动态语言。
与之相反的是静态类型的编程语言,指的是在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。
JavaScript的变量的数据类型可以分为两类:基本类型(Primitive Values)和引用类型(Reference Values), 也有其他的叫法。 引用类型请移步 JavaScript中的数据类型之引用类型(Reference Values)
基本类型主要有五种: String, Number, Boolean, Null, undefined(ES6新增了 Symbol,Symbol生成一个全局的唯一的值)。其访问方式是按值访问的,就是说你可以操作保存在变量中的实际值。基本类型的数据类型有以下4个特点:
ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。
基本类型的值是不可变的
任何方法都无法改变一个基本类型的值,比如一个字符串:
1 | var name = 'jozo'; |
上面的代码,我们可以看到name的值在toUpperCase后并未发生改变。toUpperCase返回的是一个新的字符串。
1 | var person = 'jozo'; |
通过上面的代码可知,我们不能给基本类型的数据添加属性和方法,再次说明基本类型的数据是不可变的。
基本类型的比较是值的比较
只有在他们的值相等的时候它们才相等。 也许你会遇见这样的:1
2
3var a = 1;
var b = true;
console.log(a == b); // true
它们不是相等吗?其实这是类型转换和 == 运算符的知识了,也就是说在用==比较两个不同类型的变量时会进行一些类型转换。像上面的比较先会把a的数字1
转换为true再和数字b进行比较,结果就是true了。 这是当比较的两个值的类型不同的时候==运算符会进行类型转换,但是当两个值的类型相同的时候,
即使是==也相当于是===。
基本类型的变量是存放在栈区的(栈区指内存中的栈内存)
假如有以下几个基本类型的变量:1
2
3var name = 'jozo';
var city = 'guangzhou';
var age = 22;
那么它的存储结构如下图:
栈区包括了变量的标识符和变量的值。
typeOf类型判断
基本数据类型的数据类型检测使用typeOf()函数。