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 definedObject.prototype.toString.call([]) // [object Array] Object.prototype.toString.call(new Date()) // [object Date] -
instanceof操作符instanceof是 JavaScript 中用于检测对象是否属于特定类或构造函数的运算符。不能用于检测基本数据类型,若左边是基本数据类型则直接返回false,若
Constructor不是函数或没有prototype属性,则抛出TypeErrorobject 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,代码块不会执行 。
-