首先进行分类,包括基本数据类型和引用数据类型
-
基本数据类型:boolean,null,undefine,string,number,symbol
-
引用数据类型:对象(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是基于原型链的检查,因此如果某个对象的原型链比较深,那么检查的效率会比较低。
下期说一下原型原型链以及一些延伸知识。