关于JS中的判断

100 阅读4分钟

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用于获取一个对象的原型

关于历史性遗留问题可以参考这里:

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 // trueconst obj = {}
    obj instanceof Object; // trueconst 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
  • isNaN

    42 === 42 // true
    "hello" === "hello" // true
    true === true // true
    
  • Object.getPrototypeOf

    Object.getPrototypeOf({}) === Object.prototype // true
    Object.getPrototypeOf([]) === Array.prototype // true
    

类型对比时的转换

stringnumberbooleanundefinednull
string-string => number非空字符串为 true 空字符串为 false"undefined""null"
numbernumber => string-非0数字为 true 0为 false"undefined""null"
boolean"true" / "false"1 / 0-"undefined""null"
undefined"undefined"NaNfalse-"undefined"
null"null"0false"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 nulltypeof []返回的都是一个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() 则是一个更通用的方法,可以将不同类型的值转换为数字。