js变量类型有哪些?如何检测判断变量类型?(上)

js有哪些变量类型?如何检测变量类型?
之前在学习过程中没有对变量重视而且觉得js变量类型多没有一个大体的框架,这几天在看书重温了这方面的知识,对变量有了更多的认识,下面这篇白话文章会解答上面那几个问题。总之,变量很基础也很重要。

变量类型:

画了个框架图,一目了然
在这里插入图片描述
在这里插入图片描述

var a="a new world";
var b=10;
var c=true;

“a new world”、10、true 它只是一个字面量,并且是一个不可变的值。如果要在这个字面量上执行一些操作,比如获取长度、访问其中某个字符等,那需要将其转换为 String 对象、Number对象、Boolean对象。
幸好,在必要时语言会自动把字符串字面量转换成一个 String 对象、Number对象、Boolean对象,也就是说你并不需要显式创建一个对象。
例如,下面这个例子可以直接在访问属性或方法

var strPrimitive = "I am a string";
console.log( strPrimitive.length ); // 13
console.log( strPrimitive.charAt( 3 ) ); // "m"

在操作对象时,实际上是在操作对象的引用而不是实际的对象。这句话不严密,复制时操作的是对象的引用,添加属性时,是操作实际的对象。先搞清楚变量类型,下一篇文章会继续讲解。

类型检测:

1、检测基本数据类型:typeof

typeof 是操作符,不是函数!

变量 返回值
未定义 undefined
布尔值 Boolean
字符串 string
数值 number
对象、null object
函数 function
var s = "Nicholas";
var b = true;
var i = 22;
var u;
var n = null;
var o = new Object();
alert(typeof s); //string
alert(typeof i); //number
alert(typeof b); //boolean
alert(typeof u); //undefined
alert(typeof n); //object
alert(typeof o); //object

这里可能会产生疑惑,为什么null会返回object呢?
原因是 null 值 表示的是一个空对象指针,所以检测null值时会返回object

补充一些null的知识点:
如果定义了变量,这变量是拿来保存对象(的引用)的,但是暂时还没拿来保存,那就可以先将这个变量初始化为null。这样做也方便检查打算拿来存放对象(的引用)的变量现在有没有保存对象(的引用)。

if(car!=null){  
    //对car对象执行某些操作
}

如果car不等于null,也就是car已经保存了对象的话,就执行{…}

用typeof检测引用类型数据 返回的都是object,所以如果我们想知道它是什么类型的object的话(如:Array、RegExp等),用typeof是检测不出来的
下面介绍另一种操作符

2、检测基本数据类型:instanceof

instanceof操作符返回值只有 true、false
那怎么用这个进行检测吗?
检测的时候是用instanceof来进行判断 语法是:result = variable instanceof constructor
白话一点来说: xxx变量 是不是 xxx类型 ;是则返回true,不是则返回false
(不像typeof可以直接告诉我们那是什么类型)
下面举一些例子:

alert(person instanceof Object); // 变量 person 是 Object 吗?
alert(colors instanceof Array); // 变量 colors 是 Array 吗?
alert(pattern instanceof RegExp); // 变量 pattern 是 RegExp 吗?

要注意一下:有项规定:因为引用类型都是object的实例,所以用instanceof来检测引用类型的变量是不是Object的时候,都是正确的返回都是true

var a = new Array(3);
var b=function(){};
console.log(a instanceof Object); //true   变量a是object类型吗?是
console.log(a instanceof Array);  //true  变量a是array类型吗?是
console.log(a instanceof RegExp);  //false  变量a是RegExp类型吗?是

console.log(b instanceof Object);  //true   变量b是object类型吗?是
console.log(b instanceof Function); //true  变量a是Function类型吗?是

再来看看下面这个代码 ,用instanceof来检测基本类型string和引用类型String

var strPrimitive = "I am a string";
typeof strPrimitive; // "string"
console.log(strPrimitive instanceof String);// false

var strObject = new String( "I am a string" );
typeof strObject; // "object"
strObject instanceof String; // true
// 检查 sub-type 对象
console.log(Object.prototype.toString.call( strObject ));// [object String]

简单基本类型(string、boolean、number、null 和 undefined)本身并不是对象
有一种常见的错误说法是“JavaScript 中万物皆是对象”,这显然是错误的。——《你不知道的js》

下面这篇文章会讲解变量动态添加属性,变量复制,传递参数
js变量添加属性、复制变量?函数传参(下)

参考:《JavaScript高级程序设计》(第三版)

猜你喜欢

转载自blog.csdn.net/i_ViOLeT_i/article/details/86575238