js的数据类型

首先进行分类,包括基本数据类型和引用数据类型

  1. 基本数据类型:boolean,null,undefine,string,number,symbol

  2. 引用数据类型:对象(Object,Array,Data,Function,正则表达式)

以下简单写一些案例增强理解:

//写一个对象,姓名/性别/职业/
var name = '张三'
var ssex = '男'
var ages = 45
var jobs = '法外狂徒'
//用es6简写创建一个对象
var person = {
	name,
	ssex,
	ages,
	jobs
}
//打印输出
console.log(person)//{ name: '张三', ssex: '男', ages:45, jobs: '法外狂徒' }
//没烦恼,男,外号无忧,其朋友不高兴,爱好洗脚,外号无虑,字面量描述一下
const noWorried = {
	name:'没烦恼',
	sex:'男',
	title:'无忧',
	friends:{
		name:'不高兴',
		sex:'男',
		title:'无虑'
	}
}
console.log(noWorried.friends)
//{ name: '不高兴', sex: '男', title: '无虑' }

了解js的数据类型,还应该知道判断数据类型的方法

typeof

这个操作符会返回一个表示给定变量或表达式类型的字符串。在 JavaScript 中,变量可以存储不同类型的值,比如数字、字符串、对象等,而 typeof 允许你查询这些值的类型。

console.log(typeof 22);            // 输出: "number"  
console.log(typeof 'blubber');     // 输出: "string"  
console.log(typeof true);          // 输出: "boolean"  
console.log(typeof undefined);     // 输出: "undefined"  
console.log(typeof null);          // 注意: 这里输出 "object",这是一个历史遗留问题  
console.log(typeof {prop: 'value'}); // 输出: "object"  
console.log(typeof [1, 2, 3]);     // 输出: "object",因为数组在 JavaScript 中是对象  
console.log(typeof function(){});  // 输出: "function"  
console.log(typeof Symbol());      // ES6 新增,输出: "symbol"  
console.log(typeof BigInt(123));   // ES2020 新增,输出: "bigint"

解释一下typeOf null 的结果围为 ‘Object’,这是一个历史遗留问题,早期使用32位的值表示一个变量的,其中前三位表示这个变量的类型,比如000表示对象,010表示浮点数,100是字符串,110 表示布尔值,和其他的值都被认为是指针。在这种情况下,null表示一个全零指针,也被理解为空对象的引用,因而type null 结果为’Object’

toString

Object.prototype.toString 方法可以返回一个值的内部类型,它适用于所有值,包括 null 和 undefined。它的基本语法如下:

Object.prototype.toString.call(obj)

//obj 表示要判断类型的值。
//返回值是一个形如 [object Type] 的字符串,其中 Type 表示值的内部类型。
//例如:
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(true); // "[object Boolean]"
Object.prototype.toString.call(999); // "[object Number]"
Object.prototype.toString.call("aaa"); // "[object String]"
Object.prototype.toString.call(Symbol("bbb")); // "[object Symbol]"
Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call(function () {}); // "[object Function]"
Object.prototype.toString.call([]); // "[object Array]"
Object.prototype.toString.call(new Date()); // "[object Date]"
Object.prototype.toString.call(/abc/); // "[object RegExp]"

//需要注意的是,使用 Object.prototype.toString 方法判断基本类型值时,
//返回的是其包装对象的类型,而不是基本类型本身的类型。

instanceof

首先我们得清楚一下原理:instanceof运算符用于监测构造函数的protype属性出现在某个实例对象的原型链上,详细说就是通过检查object的原型链是否包含construtor的原型对象,如果说object的原型链中存在construtor(构造函数)的原型对象,那么那么object就是constructor的一个实例,返回值为true,否则返回false,可能有点绕,以下代码解释一下:

function exInstanceOf(obj,constructor){
	//获取obj的原型
	let proto = Object.getPrototypeOf(obj)
	wile(proto){
		if(proto === constructor.prototype){
			return true
		}
		//获取原型链上的下一个圆形
		proto = Object.getPrototypeOf(proto)
	}
	return false
}

在举一个案例代码加深理解:

function Person(){}
function San(){}
San.prototype = new Person()
var san = new San()
console.log(san instanceof San)//true
console.log(san instanceof Person)//true

需要注意的是,instanceof运算符只能用于检查对象是否是某个构造函数的实例,不能用于基本类型(如字符串、数字等)的检查。如果检查的对象不是一个对象类型,instanceof会抛出一个TypeError异常。此外,由于instanceof是基于原型链的检查,因此如果某个对象的原型链比较深,那么检查的效率会比较低。

下期说一下原型原型链以及一些延伸知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值