JS判断
在JS中可以分为条件判断和类型判断
条件判断
- if-else
- 三元运算符(condition ? expression1 : expression2)
类型判断
名称 | 作用 |
---|---|
typeof | 判断数据类型,返回表示数据类型的字符串 |
instanceof | 判断一个对象是否是某个class的instance,返回true or false |
Object.prototype.toString.call | 获取对象的内部属性 [[Class]],从而判断其类型 |
Array.isArray | 用于判断一个对象是否为数组 |
isNaN | 用于判断一个值是否是NaN |
=== | 严格相等,类型与数值相等 |
Object.getPrototypeOf | 用于获取一个对象的原型 |
关于历史性遗留问题可以参考这里:
- typeof null为什么是object
- 为什么
typeof []
是一个object
JavaScript 中的数组实际上是对象,数组元素通过索引(数字键)访问。由于数组是基于对象的,因此它们的类型被视为
"object"
console.log(typeof []); // 输出 "object" console.log(Array.isArray([])); // 输出 true
所以在检测一个变量是否是数组,可以使用
Array.isArray()
方法,这是更可靠的
-
typeof
typeof 42 // "number" typeof undefined // "undefined" typeof null // "object" (注意:null被 typeof 识别为 "object",这是一个已知的历史 Bug) typeof {} // "object" typeof [] // "object" (数组在 JavaScript 中被 typeof 识别为 "object") typeof function() {} // "function"
-
instance
const arr = [] arr instanceof Array // true const obj = {} obj instanceof Object; // true const num = 42 num instanceof Number // false(因为 Number 是一个原始类型,而不是obj)
-
Object.prototype.toString.call
Object.prototype.toString.call(42) // "[object Number]" Object.prototype.toString.call("hello") // "[object String]" Object.prototype.toString.call(true) // "[object Boolean]" Object.prototype.toString.call(undefined) // "[object Undefined]" Object.prototype.toString.call(null) // "[object Null]" Object.prototype.toString.call({}) // "[object Object]" Object.prototype.toString.call([]) // "[object Array]" Object.prototype.toString.call(function() {}) // "[object Function]"
-
Array.isArray
Array.isArray([]) // true Array.isArray({}) // false
- 这里的Array是一个class,调用的
isArray
是一个static methods
- 这里的Array是一个class,调用的
-
isNaN
42 === 42 // true "hello" === "hello" // true true === true // true
-
Object.getPrototypeOf
Object.getPrototypeOf({}) === Object.prototype // true Object.getPrototypeOf([]) === Array.prototype // true
类型对比时的转换
string | number | boolean | undefined | null | |
---|---|---|---|---|---|
string | - | string => number | 非空字符串为 true 空字符串为 false | "undefined" | "null" |
number | number => string | - | 非0数字为 true 0为 false | "undefined" | "null" |
boolean | "true" / "false" | 1 / 0 | - | "undefined" | "null" |
undefined | "undefined" | NaN | false | - | "undefined" |
null | "null" | 0 | false | "undefined" | - |
- strong => number:使用
parseInt()
或parseFloat()
函数,或者通过 Number() 构造函数。 - number => string:使用 toString() 方法,或者通过 String() 构造函数。
- string => boolean:非空字符串被转换为 true,空字符串被转换为 false。
- boolean => number:true 被转换为 1,false 被转换为 0。
- number => bollean:非零数字被转换为 true,0 被转换为 false。
- undefined 被转换为字符串 "undefined"。
- null 被转换为字符串 "null"。
总结
- 类型判断有6种,需要根据合适的情况选择不同的类型判断方式
- 在不同类型数据进行判断的时候JS会自动转换合适类型再进行比较,而不是直接比较
typeof null
、typeof []
返回的都是一个obj,这是一个历史bug;而typeof undefined
也会是undefined
补充
parseInt()
parseInt()
方法用于将字符串转换为整数(十进制)。它会从字符串的开头开始解析,直到遇到非数字字符为止,然后返回已解析的整数部分。- 如果字符串以非数字字符开头,则返回 NaN(不是数字)。
- 如果字符串以 "0x" 开头,则被解析为十六进制数。
- 可以通过第二个参数指定进制,默认情况下为十进制。
- 如果字符串中包含小数点,则小数点后面的内容会被忽略。
parseInt('42'); // 42
parseInt('42px'); // 42
parseInt('3.14'); // 3
parseInt('0x10'); // 16
parseFloat()
parseInt()
方法用于将字符串转换为整数(十进制)。它会从字符串的开头开始解析,直到遇到非数字字符为止,然后返回已解析的整数部分。- 如果字符串以非数字字符开头,则返回 NaN(不是一个数字)。
- 如果字符串以 "0x" 开头,则被解析为十六进制数。
- 可以通过第二个参数指定进制,默认情况下为十进制。
- 如果字符串中包含小数点,则小数点后面的内容会被忽略。
parseFloat('3.14'); // 3.14
parseFloat('3.14px'); // 3.14
parseFloat('42'); // 42
parseFloat('42.5'); // 42.5
Number()
Number()
方法将给定的值转换为数字。如果是字符串,则会尝试将其解析为数字。- 如果是纯数字字符串(可能包含符号、小数点等),则转换为相应的数字。
- 如果是空字符串,则转换为 0。
- 如果是包含非数字字符的字符串,则转换为 NaN。
- 如果是布尔值,true 转换为 1,false 转换为 0。
- 如果是 null,则转换为 0。
- 如果是 undefined,则转换为 NaN。
Number('42'); // 42
Number('42px'); // NaN
Number('3.14'); // 3.14
Number('0x10'); // 16
总的来说,parseInt()
用于解析整数,parseFloat()
用于解析浮点数,而 Number()
则是一个更通用的方法,可以将不同类型的值转换为数字。