JavaScript变量类型检测总结
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变量类型检测总结的更多相关文章
- javascript变量类型及作用域
javascript变量类型及作用域 一.简介 变量类型 ECMAScript变量可能包含两种不同类型的数据值:基本类型和引用类型. 基本类型 基本类型指的是简单的数据段,5种基本数据类型:undef ...
- js课程 1-3 Javascript变量类型详解
js课程 1-3 Javascript变量类型详解 一.总结 一句话总结:js对象点(属性方法),json对象冒号(属性方法).属性和方法区别只有一个括号. 1.json对象中的函数的使用? 函数名 ...
- javascript 变量类型判断
一.typeof 操作符 对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时 "); typeof arr ...
- JavaScript 变量类型 保存内存中的位置 和 引用
1. JavaScript变量 基本类型值在内存中占据固定大小的空间 因此被保存在栈内存中. 从一个变量向另一个变量复制基本来下的值 会创建这个值得一个副本. 引用类型的值是对象 保存在堆内存中. 包 ...
- JavaScript中类型检测
文章首发: http://www.cnblogs.com/sprying/p/4349426.html 本文罗列了一般Js类型检测的方法,是构建Js知识体系的一小块,这篇文章是我很早之前总结的. 一. ...
- Javascript之类型检测
一.检测原始(基本数据:字符串.数字.布尔.null.undefined)类型. 用typeof检测原始类型:1.对于字符串,typeof返回"string"; 2.对于数字,ty ...
- Javascript之类型检测(一)
js中有7种内置类型,这7种类型又分为2大类:基本数据类型和对象(object) 一.检测原始(基本数据:字符串.数字.布尔.null.undefined.symbol)类型. 用typeof检测原始 ...
- Javascript 常用类型检测
1.判断变量是否为数组的数据类型? 方法一 :判断其是否具有"数组性质",如slice()方法.可自己给该变量定义slice方法,故有时会失效. 方法二 :obj instance ...
- javaScript 数据类型,变量的类型转换,typeof()可以判断变量类型
js的数据类型和常见隐式转化逻辑. 一.六种数据类型 原始类型(基本类型):按值访问,可以操作保存在变量中实际的值.原始类型汇总中null和undefined比较特殊. 引用类型:引用类型的值是保存在 ...
随机推荐
- 安装 Zsh 及 Oh-my-zsh
详细介绍就略过吧,可以参考这篇文章:使用ZSH的九个理由 下面记录一下我在配置ZSH的过程中的要点: 1.基本上你能找到的配置教程都是基于oh-my-zsh的. 因为zsh配置过于复杂,所以有了oh- ...
- The difference between a local variable and a member variable
package com.itheima_04; /* * 成员变量和局部变量的区别: * A:在类中的位置不同 * 成员变量:类中,方法外 * 局部变量:方法中或者方法声明上(形式参数) * B:在内 ...
- 8.Bootstrap CSS编码规范
Bootstrap CSS编码规范 本节的介绍内容为 Bootstrap 中的 CSS 编码规范. 语法 用两个空格来代替制表符(tab) -- 这是唯一能保证在所有环境下获得一致展现的方法. 为选择 ...
- VS :不会命中断点 代码版本与原始版本不同
设置了断点,但是无法中断,提示"不会命中断点 代码版本与原始版本不同".这种情况下一般是生成的bin\debug下面的文件与实际代码不符. 但是这次确实没有问题,重新更新程序,清理 ...
- Activator 通过SSH解锁屏幕等手势操作
来源:https://qunwang6.github.io/blog/Activator/ Activator 发表于 2015-10-24 | 分类于 iOS Activator Activ ...
- 单例模式中的volatile关键字
在之前学习了单例模式在多线程下的设计,疑惑为何要加volatile关键字.加与不加有什么区别呢?这里我们就来研究一下.单例模式的设计可以参考个人总结的这篇文章 背景:在早期的JVM中,synchr ...
- 打包工具的核心原理(转自:https://juejin.im/entry/5b223ebd518825748b569bda)
打包工具就是负责把一些分散的小模块,按照一定的规则整合成一个大模块的工具.与此同时,打包工具也会处理好模块之间的依赖关系,最终这个大模块将可以被运行在合适的平台中. 打包工具会从一个入口文件开始,分析 ...
- video文件格式说明(笔记)
video标签兼容IE8可使用html5media.js,具体demo可以下载文件中的压缩包 移动端兼容参考: http://www.xyhtml5.com/3252.html
- 使用jenkins SonarQube gitlab 构建自动化发布系统
目前持续集成的生态越来越完善,工具也有很多,开源的或商业的.如: 最最流行的,也是使用最多的 Jenkins 有着持续集成DNA的ThoughtWorks GO.理念:"Deployment ...
- 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165322
Exp0 Kali安装 由于VMWare已经装好,镜像也是从上届拷下来的.下载部分就省略.. 新建虚拟机 安装好VM后点击新建虚拟机 选择稍后安装操作系统,系统选择Linux-ubuntu 接下来根据 ...