JavaScript中的变量类型:

基本类型:Undefined,Null,Boolean,Number和String.

按值访问(可直接操作保存在变量中的变量值);

复制规则:当复制基本类型值时:两个变量完全独立,不会互相影响。如下所示:

var a = b = 1;
var c = a;
b = 2;
c = 3;
console.log(a); //
console.log(b); //
console.log(c); //

引用类型值:包含多个值的对象,是一种将数据(属性)与功能(方法)组织在一起的数据结构。

按引用访问(不能直接操作对象的内存空间,操作的实际上是对象的引用);

复制规则:当复制引用类型的值时,复制的其实是一个指针,该指针指向堆中的同一个对象;所以原变量和复制的变量实际上将引用同一个对象,即改变其中一个,另一个也会跟着变化。如下所示:

var cat = new Object();
var dog = cat;
dog.name = "tom";
console.log(cat.name); //tom

变量类型检测:

方法一:type of

有两种写法:typeof xxx ,typeof(xxx);

typeof 2 //   number
typeof null // object
typeof undefined // undefined
typeof '123' // string
typeof true // boolean typeof {} // object
typeof [] // object
typeof (function(){}) // function
typeof new Object() //object
typeof Object //function
typeof /[hbc]at/gi //object

可以看到,用type of 可以很好的区分出number,undefined,string,boolean这四种基本数据类型,但null会被判定为object.此外,该方法还能检测出函数和对象,但是并不能知道某个对象具体是什么类型的实例。

方法二:constructor

每一个对象实例都可以通过 constructor 属性访问它的构造函数:

var cat = new Cat();
console.log(cat.constructor === Cat) // true
console.log(cat.constructor === Cat.prototype.constructor) // true

其实这里的constructor属性并不是实例本身的,而是实例在其原型链上找到的属性,即cat.__proto__对象的属性,而由原型规则(我的另一篇博客写了原型规则)我们知道,cat.__proto__.constructor === Cat,所以继承到该属性后,cat.constructor === Cat 。

参考文献:https://blog.csdn.net/zengyonglan/article/details/53465505

方法三:instanceof

一般用法:如果被检测变量是给定类型的实例,则返回true。

var strObj = new String();
strObj instanceof String //true
strObj instanceof Object //true

如图所示,strObj是String类型的实例,故返回true,另外,由于所有对象都是Object类型的实例,故第三行也返回true。

但其实该方法并没有这么简单,首先说明一点:JS中实例对象的隐式原型.__proto__ === 其构造函数的显式原型.prototype;该方法就是检测左侧的__proto__原型链上,是否存在右侧的prototype原型;即L.__proto__.__proto__ ..... === R.prototype ?如果存在返回true 否则返回false。所以所有的实例 instanseof Object 都返回true ,比如上述代码第三行,然而实例strObj并不是Object直接new出来的实例。那么怎么判断出该实例是否是某构造函数直接new出来的实例呢?可以结合上述constructor属性:

strObj.__proto__.constructor === String; //true

strObj.__proto__.constructor === Object; //false

便可以准确的判断出strObj的直接和构造函数是String而非Object了。

关于instanceof和原型链的原理下面两篇文章说的比较清楚:

https://www.cnblogs.com/libin-1/p/5820550.html

https://www.ibm.com/developerworks/cn/web/1306_jiangjj_jsinstanceof/

这种方法较为稳妥,却不能具体的检测出某个变量的具体类型。那有没有一种方法可以准确的检测出某个变量的类型呢?方法4便是:

方法四:Object.prototype.toString.call()

1.判断基本类型:

Object.prototype.toString.call(null);//”[object Null]”
Object.prototype.toString.call(undefined);//”[object Undefined]”
Object.prototype.toString.call("abdaw");//”[object String]”
Object.prototype.toString.call(1);//”[object Number]”
Object.prototype.toString.call(true);//”[object Boolean]”

2.判断原生引用类型:

//函数类型:
var foo = Function()
console.log(Object.prototype.toString.call(foo))//”[object Function]”
//日期类型:
var date = new Date();
console.log(Object.prototype.toString.call(date))//”[object Date]”
//数组类型:
var arr = [1,2,3];
console.log(Object.prototype.toString.call(arr))//”[object Array]”
//正则表达式:
var reg = /[hbc]at/gi;
console.log(Object.prototype.toString.call(reg))//”[object RegExp]”
//自定义类型:
function Cat(name) {
this.name = name;
}
var cat = new Cat("Tom");
console.log(Object.prototype.toString.call(cat)) //”[object Object]”

然而这种方法不能准确判断cat是Cat类的实例,这时可以结合instanceof 操作符来进行判断:person instanceof Person //true。

文章仅代表个人理解,如有错误或补充,欢迎指出。

JavaScript变量类型检测总结的更多相关文章

  1. javascript变量类型及作用域

    javascript变量类型及作用域 一.简介 变量类型 ECMAScript变量可能包含两种不同类型的数据值:基本类型和引用类型. 基本类型 基本类型指的是简单的数据段,5种基本数据类型:undef ...

  2. js课程 1-3 Javascript变量类型详解

    js课程 1-3  Javascript变量类型详解 一.总结 一句话总结:js对象点(属性方法),json对象冒号(属性方法).属性和方法区别只有一个括号. 1.json对象中的函数的使用? 函数名 ...

  3. javascript 变量类型判断

    一.typeof 操作符 对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时 "); typeof arr ...

  4. JavaScript 变量类型 保存内存中的位置 和 引用

    1. JavaScript变量 基本类型值在内存中占据固定大小的空间 因此被保存在栈内存中. 从一个变量向另一个变量复制基本来下的值 会创建这个值得一个副本. 引用类型的值是对象 保存在堆内存中. 包 ...

  5. JavaScript中类型检测

    文章首发: http://www.cnblogs.com/sprying/p/4349426.html 本文罗列了一般Js类型检测的方法,是构建Js知识体系的一小块,这篇文章是我很早之前总结的. 一. ...

  6. Javascript之类型检测

    一.检测原始(基本数据:字符串.数字.布尔.null.undefined)类型. 用typeof检测原始类型:1.对于字符串,typeof返回"string"; 2.对于数字,ty ...

  7. Javascript之类型检测(一)

    js中有7种内置类型,这7种类型又分为2大类:基本数据类型和对象(object) 一.检测原始(基本数据:字符串.数字.布尔.null.undefined.symbol)类型. 用typeof检测原始 ...

  8. Javascript 常用类型检测

    1.判断变量是否为数组的数据类型? 方法一 :判断其是否具有"数组性质",如slice()方法.可自己给该变量定义slice方法,故有时会失效. 方法二 :obj instance ...

  9. javaScript 数据类型,变量的类型转换,typeof()可以判断变量类型

    js的数据类型和常见隐式转化逻辑. 一.六种数据类型 原始类型(基本类型):按值访问,可以操作保存在变量中实际的值.原始类型汇总中null和undefined比较特殊. 引用类型:引用类型的值是保存在 ...

随机推荐

  1. Linux常见操作指令(转载)

    Linux,免费开源,多用户多任务系统.基于Linux有多个版本的衍生.RedHat.Ubuntu.Debian 安装VMware或VirtualBox虚拟机.具体安装步骤,找百度. 再安装Ubunt ...

  2. LeetCode算法题5----Longest Palindromic Substring

    #5. Longest Palindromic Substring Given a string S, find the longest palindromic substring in S. You ...

  3. Android Editable

    在android的sdk中有讲,“This is the interface for text whose content and markup can be changed (as opposed ...

  4. notepad 操作总结

    1.竖向选择 先把鼠标光标放在起始位置,然后同时按 Alt+Ctrl 或Alt+shift键,然后移动鼠标选取内容. Word中只能用Alt+Shift .

  5. minimal sparse ruler problem 最少尺子刻度问题

    一个长度13的尺子,如果在1位置刻点可以量出1和12,13三种刻度.那么至少刻几个点,可以直接量出1-13所有的长度,分别刻在哪几个位置? 注:必须是直接量.即在尺子上能找出一个1-13任意的整数长度 ...

  6. SVN合并时报错:合并跟踪不允许丢失子树Merge tracking not allowed with missing subtrees; try restoring these items

    使用的是TortoiseSVN; Merge tracking not allowed with missing subtrees; try restoring these items 下面会有跟着几 ...

  7. 修改UIView的backedlayer为CAShapeLayer

    修改UIView的backedlayer为CAShapeLayer 什么叫backedlayer呢?backedlayer指的是一个View在创建好的时候就已经帮你创建好了一个与View大小一致的CA ...

  8. Python初学者第十七天 函数(1)

    17day 函数 1.函数定义: 函数 是指将一组语句的集合通过一个名字(函数名)封装起来,想要执行这个函数,只需调用其函数名即可 2.函数的特性: a 减少重复代码 b 使程序变得可扩展 c 使程序 ...

  9. SVN图标不显示的解决几种方式

    系统安装的Tortoise SVN,不知道是不是安装了其他软件的缘故,造成SVN客户端功能可以正常使用,就是文件夹或文件的左下角不显示图标.故上网查找解决方法: 方法一: 升级到最新版本,基本是没用的 ...

  10. Java学习---异常处理的学习

    基础知识 任何一门计算机程序设计语言都包括有绝对正确和相对正确的语句.绝对正确: 指任何情况下, 程序都会按照流程正确执行:相对正确: 程序的运行受到运行环境的制约, 在这种情况下, 需要附加检测和控 ...