《javascript高级程序设计》笔记:变量及变量检测

变量的特点

  1. js变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。换句话说, 每个变量仅仅是一个用于保存值的占位符而已
  2. js变量可以用来保存任何值,未经过初始化的变量,会保存一个特殊的值—undefined,如:var msg;
  3. js变量的初始化并不会为它标记类型;初始化的过程就是给变量赋一个值那么简单。因此,可以在修改变量值的同时修改值的类型(不推荐)
  4. js变量的生命周期就是其所在的作用域,因此不推荐在全局内定义变量(内存泄漏)
  5. js变量直接声明时,会创建一个全局变量,严格模式下会报错 function test(){ msg = "hi"; }
  6. 可以使用一条语句定义多个变量,只要像下面这样把每个变量(初始化或不初始化均可)用逗号分隔开即可

    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);

注意:

  1. 在检测一个引用类型值和 Object 构造函数时,instanceof 操作符始终会返回 true,因为所有引用类型的值都是 Object 的实例
  2. 如果使用 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]';  
}
    原文作者:同梦奇缘
    原文地址: https://segmentfault.com/a/1190000010539458
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞