JavaScript数据类型判定与转换
在 JavaScript 编程中,数据类型的判定与转换是基础且关键的技能。准确识别数据类型并进行合理转换,能够帮助开发者避免因数据类型不匹配引发的错误,同时确保程序按照预期逻辑运行。
一、数据类型检查
-
typeof
操作符在**
ECMAScript
官方规范中,typeof
被明确列为一元运算符**typeof
是最基础、最常用的数据类型检查方法,它能快速判断基本数据类。例如:typeof 86 === 'number'; // true typeof "a" ==='string'; // true typeof true === 'boolean'; // true typeof undefined === 'undefined'; // true typeof null === 'object'; // 历史遗留问题,实际null是独立类型 typeof Symbol() ==='symbol'; // true typeof function() {} === 'function'; // true
-
**但
typeof
在面对普通对象和数组时,都会返回'object'
,无法进行区分。**使用typeof
来判定null与object时由于typeof
是根据类型的二进制前三位来判断的,而null与object的前三位是相同的都是000
,所以typeof null
的结果位object 。 -
typeof
在检查未声明的变量时,返回 "undefined" 而不是报错 -
typeof
在判定除null之外的基本数据类型以及Function时是准确的(返回唯一)
-
-
Object.prototype.toString.call()
方法Object.prototype.toString.call()
是 JavaScript 中最精确的类型检测方法,可以准确识别所有内置类型和自定义类型。默认返回
[object Type]
格式的字符串,其中Type
是对象类型toString()
方法的行为:默认返回[object Type]
格式的字符串,其中Type
是对象类型call()
的作用:改变toString()
的this
指向,使其指向传进来的数据对象,让任意值都能调用这个方法。当对 JavaScript 的基本数据类型使用Object.prototype.toString.call()
时,除null
和undefined
外,其他基本类型值都会发生隐式转换。
Object.prototype.toString.call(null) // [object Null] Object.prototype.toString.call(2) // [object Number] Object.prototype.toString.call(name) // name is not defined
Object.prototype.toString.call([]) // [object Array] Object.prototype.toString.call(new Date()) // [object Date]
-
instanceof
操作符instanceof
是 JavaScript 中用于检测对象是否属于特定类或构造函数的运算符。不能用于检测基本数据类型,若左边是基本数据类型则直接返回false,若
Constructor
不是函数或没有prototype
属性,则抛出TypeError
object instanceof constructor // 对象 instanceof 构造方法
检测机制:检查 右侧构造函数的
prototype
属性 是否出现在 左侧对象的原型链 上具体流程:
右侧不参与原型链遍历,如下例子中
Car
只是提供Car.prototype
这个固定比对目标function Person(name) { this.name = name; } function Car(prise) { this.prise = prise; } const p1 = new Person("zs"); console.log(p1 instanceof Person); // true console.log(p1 instanceof Object); // true console.log(Car instanceof Object); // true console.log(p1 instanceof Car); // false
-
专用检查方法
对于数组,还可以使用
Array.isArray()
方法进行检查,返回布尔值表示是否为数组:Array.isArray([1]); // true Array.isArray({}); // false
二、数据类型转换
-
转换为数字类型
-
Number () 函数:可以将字符串、布尔值等转换为数字。
Number('123') // 123 Number('123a') // NaN Number(false) // 0
-
parseInt ()
和parseFloat ()
函数:parseInt()
用于将字符串转换为整数,parseFloat()
用于将字符串转换为浮点数。如parseInt('12.34')
返回12
,parseFloat('12.34')
返回12.34
。parseInt("123a"); // 123 parseInt("123.45"); // 123 parseFloat("123.45"); // 123.45 console.log(parseFloat("123.45a")); // 123.45
-
一元加号运算符:
+
、-
也可用于将其他类型转换为数字,效果与Number()
函数类似,如+ '123'
返回123
。console.log(+123); // 123 console.log(+'123') // 123 console.log(-'123') // -123 console.log(-'152s') // NaN
-
-
转换为字符串类型
-
String () 函数:将其他类型转换为字符串,例如
String(42)
返回"42"
。 -
toString ()
方法:几乎所有数据类型都有toString()
方法,如(42).toString()
返回"42"
,true.toString()
返回"true"
-
模板字面量:通过模板字面量
${}
也能实现类型转换,如const num = 123;
Hello ${num}返回
"Hello 123"`。
-
-
转换为布尔类型
使用
Boolean()
函数将其他类型转换为布尔值,遵循特定的转换规则:0
、""
、null
、undefined
、NaN
转换为false
,其他值转换为true
。例如:Boolean(0); // false Boolean(1); // true Boolean(''); // false Boolean('abc'); // true
-
复杂类型转换
-
对象与字符串转换:对象转换为字符串可使用
JSON.stringify()
,字符串转换为对象使用JSON.parse()
,如JSON.parse('{"name":"Bob"}')
返回{name: 'Bob'}
。const person = { name: 'zs', age: 18, sex: '男' } const pToString = JSON.stringify(person) console.log(pToString) //{"name":"zs","age":18,"sex":"男"} const pToObject = JSON.parse(pToString) console.log(typeof pToObject)
-
类数组转换为数组:通过
Array.from()
可以将类数组对象转换为真正的数组;[...similar]
用于可迭代对象(如arguments、NodeList
等);Array.prototype.slice.call(similar)
;const similar = { 0: '123', 1: '456', 2: '789', length: 3 } const arr = Array.from(similar) console.log(arr) // ['123', '456', '789'] const strArr = Array.from('12345') console.log(strArr) // ['1', '2', '3', '4', '5'] // 只能用于可迭代对象(如arguments、NodeList等) // const arr1 = [...similar] // console.log(arr1) const arr2 = Array.prototype.slice.call(similar) console.log(arr2) // ['123', '456', '789']
-
-
隐式转换
隐式转换: JavaScript 在执行某些操作时,自动将数据类型进行转换的过程
-
算术运算中的隐式转换:
当进行加法运算时,如果其中一个操作数是字符串,那么另一个操作数也会被转换为字符串进行拼接。
let a = '1' + 2 console.log(typeof a) // string console.log(a) // 12
而在减法、乘法、除法等运算中,操作数会被隐式转换为数字类型,如
"3" - 1
返回2
,"2" * "3"
返回6
。let a = '3' - '3' let b = '3' - 2 console.log(a,b) // 0 1 console.log(typeof a,typeof b) // number number
-
比较运算中的隐式转换:在使用
==
进行比较时,会发生隐式转换。0 == false
返回true
,因为false
会被转换为0
;console.log(0 == false) // true console.log(0 == '0') // true console.log(5 == '5') // true
但需要注意的是,
null == undefined
返回true
,且**null
和undefined
与其他值比较时不会进行类型转换** 。而使用===
进行严格比较时,不会发生隐式转换,只有类型和值都相等时才返回true
,如"5" === 5
返回false
。console.log(null == undefined) // true console.log(null == '') // false console.log(5 === '5') // false
-
条件语句中的隐式转换:在
if
、while
等条件语句中,表达式的值会被隐式转换为布尔类型。例如
if (1) { // 执行代码 }
,因为1
会被转换为true
,所以代码块会执行;而if (0) { // 不执行代码 }
,因为0
会被转换为false
,代码块不会执行 。
-