javascript重修之书(一):如何判断变量的数据类型

写在前面:写的有点乱哈,不足之处希望大家可以多多指正_(┐「ε:)_。

一:基本类型和引用类型的区别

1:动态属性:

   对于引用类型的值,我们可以对其动态的添加属性和方法,也可以改变和删除其属性和方法,如果这个对象不删除或者添加的属性和方法不删除,其属性和方法会一直存在。

而对于基本类型的值,我们不能为其添加属性,这样做虽然不会报错,但是会返回undefined,看一下代码:

function fun() {
console.log("我是一个方法");
}

var obj = new Object;
obj.name = "林冲";
obj.fun1 = fun;
console.log(obj.name);
console.log(obj.fun1);

var val = "12";
val.name="二狗";
val.fun1=fun;
console.log(val.name);
console.log(val.fun1);

打开f12查看输出的结果:

从以上代码我们可以发现,引用类型可以为其动态添加属性和方法,也可以访问。基本类型未报错,但访问的值确实undefined。

2:复制变量值:

基本类型的值,复制的值是相互独立的,操作其中的一个变量,另一个变量不受影响,看以下代码:

var name1 = '林冲';
var name2 = name1;
name2 = "二狗";
console.log(name1); //“林冲”
console.log(name2); //“二狗”

从以上代码可以发现,我们将name1的值复制给name2,然后我们修改了name2的值,name1却未受影响,请看以下示意图:

   当将一个变量给另一个变量复制引用类型的值的时候,两个变量实际上引用的是同一个对象,改变其中一个变量就会影响另外一个变量,看一下的代码:

var people = new Object;
people.name = "林冲";
var people2 = people;
people2.name = "二狗";
console.log(people.name); //二狗

以上代码我们将变量people保存一个对象的新实例并动态添加了name属性,然后将people复制到people2,修改people2的name属性后,输出people的name属性会发现值也被修改了。因此,当复制引用类型的值的时候,改变其中一个变量也会影响到另一个变量。看下图:

 

二:检测值类型 基本类型:(Undefined、Null、Boolean、Number和String)

以上我们了解了何为基本类型和引用类型,那么如何判断一个变量究竟是什么类型的呢?这个时候我们就可以用到typeof操作符。我们先分析以下这段代码输出的值:

var a ="123";
var b = 123;
var c = true;
var d;
var e = null;
var f = new Object();
console.log("a的数据类型是"+typeof a);
console.log("b的数据类型是"+typeof b);
console.log("c的数据类型是"+typeof c);
console.log("d的数据类型是"+typeof d);
console.log("e的数据类型是"+typeof e);
console.log("f的数据类型是"+typeof f);

打开浏览器的f12,我们可以看到输出了以下这些内容:

从输出的内容中我们可以发现,变量a,b,c,d,f的类型很好理解,可为什么变量e的值为null,输出的数据类型却是object呢?我们可以参考参考ECMAScript5.1中文版4.3.11节中对null值的描述:

空值 (null value):

代表对象值故意留空的一个原始值(其意思是它只是期望此处将引用一个对象, 注意是"期望")

三:检测引用类型(Object  Function  array RegExp。。。)

引用类型值是指可能由多个值构成的对象。引用类型值保存在内存中,而JS是不能直接访问内存的,所以对于引用类型,操作的不是实际的对象而是对象的引用。先看一下代码理解到底什么是引用类型:

function myArray(){
var a = ["林冲"];
var b = a;
console.log(a[0]);//林冲
b[0] = '林二狗';
console.log(a[0]); //林二狗
}
myArray();

 从以上代码的输出结果可以看出,修改b[0]的值也改变了a[0]的值,这是因为引用类型复制和简单类型不同,复制完成后新值和之前的值都是引用的同一个对象,所以之前的值改变,也会影响复制后的值。如图:

以上的例子我们了解了什么是引用类型,但是根据规定所有引用类型的值都是Object的实例,那么我们是要typeof操作符输出的值肯定是object,但是引用类型值是指可能由多个值构成的对象,那我们怎样才能知道这个引用类型究竟是什么类型的对象呢?这个时候我们就要用到instanceof操作符,其语法如下所示:

result = variable instanceof constructor

我们在上面的代码作出以下修改:

function myArray(){
var a = ["林冲"];
var b = a;
console.log(a[0]);
console.log(typeof a);
console.log(a instanceof Function); //false
console.log(a instanceof Array); //true
b[0] = '林二狗';
console.log(a[0]);
console.log(b instanceof Array); //true
}
myArray();

从上面的代码可以看出,检测引用类型a是否为Function的时候会返回false,二是否为数组则会返回true, 引用类型b也是同理。这里要注意的是:使用instanceof操作符检测基本类型会一直返回false,因为基本类型值不是对象。

javascript重修之书(一):如何判断变量的数据类型的更多相关文章

  1. go的变量、常量以及判断变量的数据类型

    1.定义变量 p.p1 { margin: 0; font: 12px "Helvetica Neue"; color: rgba(69, 69, 69, 1) } span.s1 ...

  2. Python学习--判断变量的数据类型

    import types aaa = 0 print type(aaa) if type(aaa) is types.IntType: print "the type of aaa is i ...

  3. Python判断变量的数据类型的两种方法

    https://www.cnblogs.com/jessicaxu/p/7727264.html

  4. 学习 JavaScript (三)核心概念:语法、变量、数据类型

    JavaScript 的核心概念主要由语法.变量.数据类型.操作符.语句.函数组成,这篇文章主要讲解的是前面三个,后面三个下一篇文章再讲解. 01 语法 熟悉 JavaScript 历史的人应该都知道 ...

  5. javascript学习笔记(一):基础、输出、注释、引用、变量、数据类型

    javascript脚本必须位于<script></script>之间,<script>标签可以位于<head>中,也可以位于<body>中 ...

  6. js课程 1-5 js如何测试变量的数据类型

    js课程 1-5 js如何测试变量的数据类型 一.总结 一句话总结:用typeof()方法. 1.js如何判断变量的数据类型? 用typeof()方法. 13 v=10; 14 15 if(typeo ...

  7. Javascript 判断变量类型的陷阱 与 正确的处理方式

    Javascript 由于各种各样的原因,在判断一个变量的数据类型方面一直存在着一些问题,其中最典型的问题恐怕就是 typeof null 会返回 object 了吧.因此在这里简单的总结一下判断数据 ...

  8. JavaScript如何判断变量是数组还是对象

    编辑 方法一:通过判断变量的类型,并且变量的length属性(除了有一种例外是arguments对象–当给函数传参时数据存储的地方) var arr=[2,3,4]; var obj={"n ...

  9. JavaScript 变量克隆和判断变量类型

    一.变量克隆 在js中经常会遇到将一个变量赋值给一个新的变量这种情况,这对于基本类型很容易去实现,直接通过等号赋值就可以了,对于引用类型就不能这样了.(注:像函数,正则也可以直接通过等号赋值) 这里我 ...

随机推荐

  1. JavaScript中的this关键字的用法和注意点

    JavaScript中的this关键字的用法和注意点 一.this关键字的用法 this一般用于指向对象(绑定对象); 01.在普通函数调用中,其内部的this指向全局对象(window); func ...

  2. [solr] - solr5.2.1环境搭建 - 使用solr自带的jetty服务器

    solr除了使用tomcat作为容器外,还可以使用其他的常用容器,比如jetty,jboos等,而且solr自身就自带jetty服务器,那么现在就solr自带的jetty服务器进行安装操作.由于sol ...

  3. JAVA三大特性之三——多态

    作为JAVA的三大特性之一,多态性是很多人都没有弄清楚的一个重要特性,今天我就来从我所理解的角度来说一下. 首先,从他的字面意思来理解,多态,从其字面来理解就是多种形态,多种表现形式.根据这些,我最能 ...

  4. 单点登录实现(spring session+redis完成session共享)

    一.前言 项目中用到的SSO,使用开源框架cas做的.简单的了解了一下cas,并学习了一下 单点登录的原理,有兴趣的同学也可以学习一下,写个demo玩一玩. 二.工程结构 我模拟了 sso的客户端和s ...

  5. VFL(Visual Format Language)语言

    VFL的使用 使用VFL来创建约束数组: +(NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFor ...

  6. 康复计划#5 Matrix-Tree定理(生成树计数)的另类证明和简单拓展

    本篇口胡写给我自己这样的什么都乱证一通的口胡选手 以及那些刚学Matrix-Tree,大致理解了常见的证明但还想看看有什么简单拓展的人- 大概讲一下我自己对Matrix-Tree定理的一些理解.常见版 ...

  7. 《你不知道的JavaScript》整理(五)——值与原生函数

    一.值 1)数字 JavaScript只有一种数值类型:number(数字),包括"整数"和带小数的十进制数. //数字的语法 a.toExponential(); // &quo ...

  8. Spring总结_04_容器和bean

     一.概念理解 1.容器 IoC容器负责容纳并管理bean,在Spring中,BeanFactory是IoC容器的核心接口. 它的职责包括:实例化.定位.配置应用程序中的对象及建立这些对象间的依赖. ...

  9. mybatis基础,mybatis配置文件核心组件typeHandler元素

    无论是从预处理语句中设置一个值,还是从结果集里取出一个值,都会用类型处理器将获取的值以合适的方式转换成 Java 类型 可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型 实现 o ...

  10. 网络安全实验室 脚本关通关writeup

    [1]key又又找不到了查看源代码.发现key的路径,点击进行了302跳转,抓包,得到key [2]快速口算要2秒内提交答案,果断上python import requests,re s = requ ...