课堂笔记(1)

145 阅读3分钟

JS中的数据类型

数据类型的分类

  1. 基本数据类型
    • number
    • string
    • boolean
    • null
    • undefined
    • symbol
    • bigint
  2. 引用数据类型
    • object
      • 普通对象
      • 数组对象
      • 正则对象
      • 日期对象
      • Math数学函数对象
      • ...
    • function

数据类型的检测

  • typeof 检测数据类型的逻辑运算符
  • instanceof 检测是否为某个类的实例
  • constructor 检测构造函数
  • Object.prototype.toString.call 检测数据类型的

检测特殊类型

  • typeof null ==> "object"
  • typeof undefined ==> "undefined"
  • typeof {} ==> "object"
  • typeof [] ==> "object"
  • typeof NaN ==> "Number"

把其它数据类型转换为数字的方法

  • 强转换(基于底层机制转换的) Number([value])
    • 一些隐式转换都是基于Number完成的
      • isNaN('12px') 先把其它类型值转换为数字在检测
      • 数学运算 '12px'-13
      • 字符串==数字 两个等于号比较很多时候也是要把其它值转换为数字
      • ...
  • 弱转换(基于一些额外的方法转换) parseInt([value])/parseFloat([value])

typeof检测的注意

typeof [value] 返回当前值的数据类型 "数据类型"

  • 返回的结果都是字符串
  • 局限性:
    • typeof null => "object"
    • typeof 不能细分对象类型(检测普通对象或者数组对象等都是"object")

typeof检测题目

 let a = typeof typeof typeof [12, 23];
	 console.log(a); //=>"string"
	/*
	*  typeof [12, 23] =>"object"
	*  typeof "object" =>"string"
	*  ...
	*/
if ("哈哈" == NaN) {
    // 条件是否成立?  NaN!=NaN  它和谁都不相等,包括和自己本身也不相等
} 
isNaN(值)  检测这个值是否为有效数字,如果不是有效数字返回TRUE,是有效数字返回FALSE
let res = parseFloat('left:200px'); //=>NaN
if (res === 200) {
    alert(200);
} else if (res === NaN) { //NaN!=NaN
    alert(NaN);
} else if (typeof res === 'number') { //=>typeof NaN => "number"
    alert('number');
} else {
    alert('Invalid Number');
}   

Number 直接调用浏览器最底层的数据类型检测机制来完成

特点:

  • true 1       false 0
  • null 0        undefined NaN
  • 字符串中必须保证都是有效数字才会转换为数字,否则都是NaN
parseInt("") //NaN
/*
 *parseInt 处理的值是字符串,从字符串的左侧开始查找有效数字字符(遇到非有效数字字符则停止查找) -> 如果处理的值不是字符串,需要先转换为字符串然后在开始查找接
*/
Number("") //0

isNaN("") //先把""转换为数字(隐式 Number)  isNaN(0)  false

parseInt(null) //parseInt('null')  NaN 

Number(null) //0

isNaN(null) // isNaN(0)  false

parseInt("12px") //12

Number("12px") //NaN

isNaN("12px") //isNaN(NaN) true

parseFloat("1.6px") + parseInt("1.2px") + typeof parseInt(null); 
//1.6 + 1 + typeof NaN  => 2.6 + 'number'  -> '2.6number'
//加号遇到字符串就会变成字符串拼接


isNaN(Number(!!Number(parseInt("0.8"))));
// isNaN(0) false 

typeof !parseInt(null) + !isNaN(null);
// 'booleantrue'

let result = 10 + false + undefined + [] + 'Tencent' + null + true + {};
	// console.log(result);
	// 10 + 0  10
	// 10 + undefined  NaN
	// NaN + []  'NaN'
	// 'NaN' + 'Tencent'   'NaNTencent'
	// 'NaNTencentnulltrue[object Object]'

1. 0 NaN null undefind 空字符串 转化为布尔值都是假 []==true 两个等号比较的时候,如果左边是对象,右边是布尔,都转换为数字 过程:1.空数组首先调用隐藏式类型转换 Number([])转化成空字符串Number('')==>0 2.true转化成数字也是1,所以结果是false 2. 在两边出现字符串(或者对象)的情况下,加号一定是字符串拼接 =>对象本身是要转换为数字进行运算的,只不过转换数字的过程中,需要先转换为字符串,才能转换为数字,而一旦转换为字符串,不好意思就变为字符串拼接了

等号的比较

  • "==" 在进行比较的时候,如果左右两边数据类型不一致,则需要先默认转换为一致的数据类型,然后在进行比较!

规则:

  1. 对象==字符串 对象转换为字符串 [10] == '10' true
  2. null == undefined (三个等号下不相等),但是和其它任何的值都不相等 0 == null false
  3. NaN和谁(包括自己)都不相等
  4. 剩下的情况都是转换为数字在做比较的
  • "===" 绝对相等,两边类型一致,值也一致才相等,类型不一样,直接不对等,不会转换