变量的特点
- js变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。换句话说, 每个变量仅仅是一个用于保存值的占位符而已
- js变量可以用来保存任何值,未经过初始化的变量,会保存一个特殊的值—undefined,如:
var msg;
- js变量的初始化并不会为它标记类型;初始化的过程就是给变量赋一个值那么简单。因此,可以在修改变量值的同时修改值的类型(不推荐)
- js变量的生命周期就是其所在的作用域,因此不推荐在全局内定义变量(内存泄漏)
- js变量直接声明时,会创建一个全局变量,严格模式下会报错
function test(){ msg = "hi"; }
可以使用一条语句定义多个变量,只要像下面这样把每个变量(初始化或不初始化均可)用逗号分隔开即可
var message = "hi", found = false, age = 29;
变量的分类和检测
ECMAScript 中有 5 种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number 和 String。还有 1 种复杂数据类型—Object,Object 本质上是由一组无序的键值对组成的
1. 变量检测—typeof
typeof始终返回的是下列的某个字符串
“undefined”—如果这个值未定义;
“boolean”—如果这个值是布尔值;
“string”—如果这个值是字符串;
“number”—如果这个值是数值;
“object”—如果这个值是对象或 null;
“function”—如果这个值是函数;
注意:
特殊值null被认为是一个空的对象引用,因此typeof null === 'object'
typeof会将函数类型识别为’function’,虽然函数不是单独的数据类型
var s = "Nicholas";
var b = true;
var i = 22;
var u;
var n = null;
var o = new Object();
var f = new Function();
alert(typeof s); //string
alert(typeof i); //number
alert(typeof b); //boolean
alert(typeof u); //undefined
alert(typeof n); //object
alert(typeof o); //object
alert(typeof f); //function
typeof 操作符是确定一个变量是字符串、数值、布尔值,还是 undefined 的最佳工具。如果变量的值是一个对象或 null,则 typeof 操作符会像下面例子中所示的那样返回”object”,我们依然无法确定对象的具体类型…
2. 变量检测—instanceof
语法: result = variable instanceof constructor
如果变量是给定引用类型(根据它的原型链来识别)的实例,那么 instanceof 操作符就会返回 true
alert(person instanceof Object);
alert(colors instanceof Array);
alert(pattern instanceof RegExp);
注意:
- 在检测一个引用类型值和 Object 构造函数时,instanceof 操作符始终会返回 true,因为
所有引用类型的值都是 Object 的实例
- 如果使用 instanceof 操作符检测基本类型的值,则该操作符始终会返回 false,因为基本类型不是对象
instanceof 能够确定引用类型的实例对象是否在某条原型链上,但是无法精准的判断变量到底是什么类型,而且在面对基本类型时都会返回false…
3. 变量检测—Obect.prototype.toString
这个方法是检测数据类型最准确的方法(在不认为更改对象原型方法toString的前提下),建议将其封装为函数做判别
Object.prototype.toString.call(123) //'[object Number]'
Object.prototype.toString.call('123') //'[object String]'
Object.prototype.toString.call(undefined) //'[object Undefined]'
Object.prototype.toString.call(true) //'[object Boolean]'
Object.prototype.toString.call({}) //'[object Object]'
Object.prototype.toString.call([]) //'[object Array]'
Object.prototype.toString.call(function(){}) //'[object Function]'
Object.prototype.toString.call(new Date) // '[object Date]'
函数封装:
// 判断是否为函数
function isFunction(fn) {
return Object.prototype.toString.call(fn) === '[object Function]';
}
// 判断是否为数组
function isArray(o) {
return Object.prototype.toString.call(o) === '[object Array]';
}