JavaScript的检测及其数据类型


一、JavaScript有几种类型的值?

Javascript有两种数据类型,分别是基本数据类型和引用数据类型。其中基本数据类型包括Undefined、Null、Boolean、Number、String、Symbol (ES6新增,表示独一无二的值),而引用数据类型统称为Object对象,主要包括对象、数组和函数。接下来我们分别看下两者的特点。

二、基本数据类型

1.值是不可变的

var name = 'java';
name.toUpperCase(); // 输出 'JAVA'
console.log(name); // 输出 'java'
复制代码

由此可得,基本数据类型的值是不可改变的

2.存放在栈区

原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储。

3.值的比较

var a = 1;
var b = true;
console.log(a == b); // true
console.log(a === b); // false
复制代码

== : 只进行值的比较,会进行数据类型的转换。

=== : 不仅进行值得比较,还要进行数据类型的比较。

三、引用数据类型

1.值是可变的

var a={age:20};
a.age=21;
console.log(a.age)//21
复制代码

上面代码说明引用类型可以拥有属性和方法,并且是可以动态改变的。

2.同时保存在栈内存和堆内存

引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。

3.比较是引用的比较

当从一个变量向另一个变量赋引用类型的值时,同样也会将存储在变量中的对象的值复制一份放到为新变量分配的空间中。

var a={age:20};
var b=a;
b.age=21;
console.log(a.age==b.age)//true
复制代码

上面我们讲到基本类型和引用类型存储于内存的位置不同,引用类型存储在堆中的对象,与此同时,在栈中存储了指针,而这个指针指向正是堆中实体的起始位置。变量a初始化时,a指针指向对象{age:20}的地址,a赋值给b后,b又指向该对象{age:20}的地址,这两个变量指向了同一个对象。因此,改变其中任何一个变量,都会相互影响。

此时,如果取消某一个变量对于原对象的引用,不会影响到另一个变量。

var a={age:20};
var b=a;
a = 1;
b // {age:20}
复制代码

上面代码中,a和b指向同一个对象,然后a的值变为1,这时不会对b产生影响,b还是指向原来的那个对象。

四、检验数据类型

1.typeof

typeof返回一个表示数据类型的字符串,返回结果包括:number、boolean、string、symbol、object、undefined、function等7种数据类型,但不能判断null、array等

typeof Symbol(); // symbol 有效
typeof ''; // string 有效
typeof 1; // number 有效
typeof true; //boolean 有效
typeof undefined; //undefined 有效
typeof new Function(); // function 有效
typeof null; //object 无效
typeof [] ; //object 无效
typeof new Date(); //object 无效
typeof new RegExp(); //object 无效
复制代码

数组和对象返回的都是object,这时就需要使用instanceof来判断

2.instanceof

instanceof 是用来判断A是否为B的实例,表达式为:A instanceof B,如果A是B的实例,则返回true,否则返回false。instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。

[] instanceof Array; //true
{} instanceof Object;//true
new Date() instanceof Date;//true
new RegExp() instanceof RegExp//true
复制代码

关于数组的类型判断,还可以用ES6新增Array.isArray()

Array.isArray([]); // true
复制代码

instanceof 三大弊端

  • 对于基本数据类型来说,字面量方式创建出来的结果和实例方式创建的是有一定的区别的
console.log(1 instanceof Number)//false
console.log(new Number(1) instanceof Number)//true
复制代码

从严格意义上来讲,只有实例创建出来的结果才是标准的对象数据类型值,也是标准的Number这个类的一个实例;对于字面量方式创建出来的结果是基本的数据类型值,不是严谨的实例,但是由于JS的松散特点,导致了可以使用Number.prototype上提供的方法。

  • 只要在当前实例的原型链上,我们用其检测出来的结果都是true。
  • 在类的原型继承中,我们最后检测出来的结果未必准确
var arr = [1, 2, 3];
console.log(arr instanceof Array) // true
console.log(arr instanceof Object); // true
function fn(){}
console.log(fn instanceof Function)// true
console.log(fn instanceof Object)// true
复制代码
  • 不能检测null 和 undefined

对于特殊的数据类型null和undefined,他们的所属类是Null和Undefined,但是浏览器把这两个类保护起来了,不允许我们在外面访问使用

3.严格运算符===

只能用于判断null和undefined,因为这两种类型的值都是唯一的

var a = null
typeof a // "object"
a === null // true
复制代码

undefined 还可以用typeof来判断

var b = undefined;
typeof b === "undefined" // true
b === undefined // true
复制代码

4.constructor

constructor作用和instanceof非常相似。但constructor检测 Object与instanceof不一样,还可以处理基本数据类型的检测。

var aa=[1,2];
console.log(aa.constructor===Array);//true
console.log(aa.constructor===RegExp);//false
console.log((1).constructor===Number);//true
var reg=/^$/;
console.log(reg.constructor===RegExp);//true
console.log(reg.constructor===Object);//false 
复制代码

constructor 两大弊端

  • null 和 undefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断。
  • 函数的 constructor 是不稳定的,这个主要体现在把类的原型进行重写,在重写的过程中很有可能出现把之前的constructor给覆盖了,这样检测出来的结果就是不准确的
function Fn(){}
Fn.prototype = new Array()
var f = new Fn
console.log(f.constructor)//Array
复制代码

本次给大家推荐一个免费的学习群,里面概括移动应用网站开发,css,html,webpack,vue node angular以及面试资源等。 对web开发技术感兴趣的同学,欢迎加入Q群:864305860,不管你是小白还是大牛我都欢迎,还有大牛整理的一套高效率学习路线和教程与您免费分享,同时每天更新视频资料。 最后,祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰。

转载于:https://juejin.im/post/5bc9c929e51d450e4369bcca

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我是Leader,我被降职成了普通员工,HR说:公司要梯队年轻化

“BAT也不是完美的避风港哇~”这是老刘说的,老刘是BAT某家的一个Leader,职级约类似T7(T族一般是技术族,管理是M族),在BAT某家呆了11年,但是在整个互联网行业推崇,梯队年轻化的氛围时,老刘所在的…

in最多可以放多少?_汽车最多可以停放多少天不开?维修师傅:尽可能别超过这个时间...

在当下,买车似乎已经成为了一种消费潮流,其中不乏一些本身用车需求不明显但也随大流买车的人,结果车买回来之后最初的新鲜劲一过就放在那里不怎么用了。当然也有部分车主是因为自己的工作修需要经常需要在外出差,那么就算想天天开…

计算机电源风扇安装方法,机箱风扇怎么装 电脑机箱风扇电源线接法

夏天天气炎热,电脑机箱内温度也较高,温度过高会影响电脑性能出现死机等问题,甚至影响硬件寿命。所以给机箱装风扇来散热是非常重要的。那么,机箱风扇怎么装合理呢?机箱风扇的电源线怎么接呢?下面分享一下机箱风...夏天天气炎热&…

使用微服务失败的12个原因

在过去的几年中,我已经对处于数字化转型过程中的多个产品团队进行了架构审查。大多数团队都在按照微服务架构构建产品。他们有使用基于微服务的体系结构的所有正确意图-更快的开发,更好的可伸缩性,更小的独立团队,独立的部署&…

市场压力只有老板扛?柏明顿阿米巴如何传递经营压力

内部交易是阿米巴经营模式中的一个重要环节,通过内部交易,使企业内部上下道工序之间以价格为纽带,以服务和产品进行等价交换,统一结算交易。通过内部交易行为,可以掌握各个阿米巴单元的盈亏状态。阿米巴构建内部市场&a…

flutter怎么添加ios网络权限_视频号直播间怎么添加购物车商品;超详细流程步骤。丨国仁网络资讯...

蘑菇租房的联合创始人龙东平前几个月曾说:“视频号是一次掀翻桌子重新排座次的机会,是巨浪滔天,是新世界,新秩序。”视频号发展趋势愈加迅猛,越来越多的玩家涌入,正在获得新一波社交流量。为什么更加受欢迎…

网络中服务器是指为网络提供资源,并对这些资源进行管理的计算机,2016年职称计算机考试Internet冲刺试题及答案3...

1、Internet的通信协议是( A )A、TCP/IP B、OSI/ISOC、NetBEUI D、NWLink2、把计算机网络分为有线和无线网的主要分类依据是(C)A、网络成本 B、网络的物理位置C、网络的传输介质 D、网络的拓扑结构3、要将两台计算机直接相连,那么使用双绞线的类型为(A)A、交叉线 B、…

Visio 图形大小如何随文字多少自动调整?

Visio 图形大小默认是根据图形内文字多少自动调整。 如果手动调整过图形,那么该图形就不再随文字多少自动调整了。 解决办法: 删除该图形,重新拉取一个,重新编写文本

java同一个包中,类之间的的调用

如果是静态方法,直接 类名.方法名即可,如果是非静态方法,则需new一个对象出来,然后用对象.方法名调用如:public class A{public static void T(){System.out.print("这是A类的方法");}public void T2(){Syst…

mos管开关电路_【电路】MOS管开关电路图详解(一)

MOS管的开关特性静态特性MOS管作为开关元件,同样是工作在截止或导通两种状态。由于MOS管是电压控制元件,所以主要由栅源电压uGS决定其工作状态。工作特性如下:※uGS※ uGS>开启电压UT:MOS管工作在导通区,漏源电流iDSUDD/(RDrDS…

Visio图形自动编号

操作步骤: 1.进入“视图”--“加载项” 2.“加载项”---“运行加载项” 3.“运行加载项”---“给形状编号”

伪代码就是计算机语言 正确吗,伪代码实例绍.ppt

伪代码实例绍第2章 伪代码实例介绍 主讲:黄明琼 第2章 伪代码实例介绍 2.1 伪代码介绍 2.2 三角形问题 2.3 NextDate函数问题 2.4 佣金问题 2.5 简单ATM系统 2.6 货币转换器 本章教学目标 正确理解伪代码的概念 正确理解伪代码的规则 正确理解伪代码实例中的逻辑 能…

Java面试170题答案解析(1-20题)

为什么80%的码农都做不了架构师?>>> 转载于:https://my.oschina.net/lanyu96/blog/2250020

query builder python-elasticsearch返回指定字段

1. postman 请求elasticsearch 返回指定字段 1.直接在请求体当中,json 数据,对应的是一个列表 { "_source":["title","id","desc"], "from":10, "size":100, } 至于from和size是浅分页 2. …

Visio各图形如何一键自动对齐?

在创作的过程中,不用管图形是否对齐,间距是否一致,在最后的时候,一键对齐 具体操作: 开始---------位置------自动对齐与自动调整间距

黎明之路服务器正在维护,黎明之路进不去怎么办_黎明之路更新失败怎么办_玩游戏网...

《代号Z》什么时候上线根据最新的消息,《代号Z》这款游戏已经正式更名为《黎明之路》,那么名字也最终确定了,这款游戏到底什么时候上线呢?下面就跟着玩游戏网的小编一起了解一下吧~《代号Z》上线时间:游戏将会在4月26日…

OpenGL阴影添加学习材料及总结

学习材料 PBR基于物理的实时渲染采用了更符合物理学规律的方式来模拟光线,通过模拟虚拟物体表面的粗糙程度,来计算出射该物体的光线呈现一个怎样的方式。PBR材料的三个主要参数称为:反照率、粗糙度、金属度,上图反映了在不同粗糙度…

Springboot与Spring的关系

阐述 boot这词的翻译:[计算机科学] 引导。 先拿生活中打电话的例子来解释下这两者的关系: Spring的电话号码是:13355556666 攻城狮A,B,C都要联系Spring 攻城狮A,每次都输入Spring的号码,再按拨号键,联…

php修改学生信息代码_值得收藏的CRM软件客户管理系统(包括JAVA/PHP)

悟空CRM是一款永久开源免费的CRM管理系统,悟空CRM-基于JAVA/TP5.0vueElementUI的前后端分离CRM系统 ,悟空CRM是基于JAVA/PHP多语言的B/S架构的管理软件,为企业提供行业专属的crm客户管理方案。 悟空CRM,CRM,免费CRM,开源HRMS,开源OA,移动办公,办公软件,手…

ajax验证码验证对错,jQuery Ajax显示对号和错号用于验证输入验证码是否正确

AJAX 的 jQuery Ajax显示对号和错号用于验证输入验证码是否正确废话不多说了,直接给大家贴代码了,具体代码如下所示:$(document).ready(function(e) {$(#yes).hide();$(#no).hide();$(input[namegcode]).keyup(function(){if($(this).val().l…