目录
- 原始值和引用值
- 数据类型判断
- ❓ typeof 能判断哪些类型?
❀原始值和引用值
在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值。
原始值类型,即一些代表原始数据类型的值,也叫基本数据类型。包括:Undefined、Null、Boolean、Number、String、Symbol【ES6】 以及 BigInt【ES11】;
let a //undefined
let b = null;
let c = true;
let d = 1;
let e = '123';
let f = Symbol('f');
复制代码
原始值存储在栈中。意思就是说,当一个原始变量把值赋给另一个原始变量时,只是把栈中的内容复制给另一个原始变量,此时这两个变量互不影响,即当一个变量值改变时,另一个变量不会因此而发生任何变化。
let a = 100;
let b = a;
a = 200;
console.log(a,b);//200 100
复制代码
引用值类型,保存为对象,其本质是指向内存位置的引用。包括:Object,function,Array,RegExp,Data ; 如果把一个引用值由一个变量赋给另一个变量,实际上是将复制的是指向存储在堆内存对象的地址,两个变量均指向同一个对象。当通过一个变量修改对象内容时,修改变换也会反应在另外变量指向的对象上。
let a = [1,2,3];
let b = a;
a.push(4);
console.log(a);//[1, 2, 3, 4]
console.log(b);//[1, 2, 3, 4]
复制代码
❀数据类型判断
typeof
运算符:判断基本类型instanceof
运算符:判断A是B的实例isPrototypeOf()
方法: 判断A是B的原型Object.prototype.toString.call()
方法
typeof运算符:判断基本类型
能够区分8种类型:Number, String, Boolean, Undefined, Symbol, BigInt, function, Object; 即值类型(6个),函数(function),对象(object)。
需要注意的是,1)typeof是一个一元运算符,并不是一个函数或者语句,所以可以用括号包裹起来,即这两个语句等效typeof 1; typeof (1);
;2)输出是字符串;3)当判断typeof null
时,输出的是"object"
,可以理解null是一个指向空对象的指针。
typeof 1;//"number",语句等效于typeof (1)
typeof '1';//"string"
typeof false;//"boolean"
typeof undefined;//"undefined"
typeof Symbol();//"symbol"
typeof 2n;//"bigint"
typeof function(){} //"function"
typeof [1,1,1] //"object"
typeof null //"object"
复制代码
❓常考题:typeof能判断哪些类型?
答:能判断number, string, boolean, undefined, symbol,bigInt, function,object。
对于null会返回object
复制代码
instanceof运算符:判断A是B的实例
左操作数是一个对象,右操作数标识对象的类。如果左侧的对象是右侧类的实例,则表达式返回true;否则返回false。
语法:result = variable instanceof constructor
let a = new Array(1,2,3);//a = [1,2,3]
a instanceof Array;//ture
a instanceof Object;//ture
a instanceof Data;//false
//a 是Array的实例,也是Object的实例
复制代码
isPrototypeOf()方法: A是B的原型
isPrototypeOf()
方法检测一个对象是否是另一个对象的原型(或者处于原型链中)。语法:result = prototypeObject.isPrototypeOf( object )
let Person = {name:'Jack'};//定义一个原型对象
let person1 = Object.create(Person);//使用这个原型创建一个对象
Person.isPrototypeOf(person1);//ture
Object.prototype.isPrototypeOf(Person);//ture,Person继承自Object.prototype
Object.prototype.isPrototypeOf(person1);//ture,person1继承自Object.prototype
复制代码
Object.prototype.toString.call()方法:
对于 Object.prototype.toString()
方法,会返回一个形如 "[object XXX]"
的字符串。
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call(123) // "[object Number]"
Object.prototype.toString.call('123') // "[object String]"
Object.prototype.toString.call(new Date) // "[object Date]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(Symbol()) // "[object Symbol]"
复制代码