1.数据类型

339 阅读4分钟

基本数据类型(值类型):Number,String,Boolean,Null,Undefined

引用数据类型:Object类型:( {} , [] , /^$/ , Date , Math )、Function类型

ES6新增:Symbol唯一值、bigint

数据类型检测

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

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

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

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

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

其中console.log(NaN) => "Number",代表不是一个有效数字,但是属于Number类型 NaN == NaN也是不相等的,它和谁都不相等,所以检测是否为有效数字用“isNaN” console.log(isNaN(10)) //false

console.log(isNaN("10")) //false

console.log(isNaN("A")) // true

运算时需要注意的事项:

1. false,null在参与运算时都会先转换为number类型(除了"+"运算符的另一边为字符串或对象),**转换完就为0**,
而**undefined为NAN**
    "+"为什么这么特殊,对象又为啥不一样?
    在"+"两边出现字符串(或者对象)的情况下,加号一定是字符串拼接,而对象本身是要转换为数字进行运算的,
    只不过转换数字的过程中,需要先转换为字符串,才能转换为数字,而一旦转换为字符串,不好意思,就变为字符串拼接了
        []+0  //"0"
    对象转换为字符串,先调用valueOf,获取原始值(一般都是基本类型值),则继续调用toString()
        [10]+0  //[10] -> '10'+0 = "100"
    
    但是Object情况有点特殊:{}+0
        这种Object在加号左边时,会被认为Object为一个代码块,那就会和+0区分开来,认为这是两个语句,那+0就是0了
        如果硬要变成一个语句,那就再外面加层(),({}+0)或者({})+0
        0+{}:而在右边时,就会认为是一个语句,那这时就变成了字符串拼接了"0[object Object]"
        特殊情况也会被认为是一个语句:{}+0+{}
        
    如果"+"只有一边有值,那么这个操作就是数学运算(不论加谁),++值,值++ 也是一样
    总结:
        1. 大括号在运算符前面,在没有使用小括号处理优先级的情况下,不认为是数学运算,加小括号才算
        2. 出现在运算符的后面  认为是数学运算
2. 而0、NAN、null、undefined、""在转换为boolean类型时都为**假**

3. ==  在进行比较的时候,如果左右两边数据类型不一致,则需要先默认转换为一致的数据类型,然后在进行比较
   === 绝对相等,两边类型一致,值也一致才相等,类型不一样,直接不对等,不会转换

规则:
    ⑴. 对象==字符串   对象转换为字符串
        [10] == '10'    true
    ⑵ null == undefined  (三个等号下不相等),但是和其它任何的值都不相等
        0 == null   false
    ⑶ NaN和谁(包括自己)都不相等
    ⑷ 剩下的情况都是转换为数字在做比较的
    例1:
        []==false   都转换为数字
        []先转换为''(toString)  在转换为数字0(Number)
        false 变为数字0
        所以为true
    例2:
        ![]==false
        运算符优先级   ![]   再算比较
        ![]  转换为布尔值进行取反(把其它类型转换为布尔类型遵循的规律: 只有 0/NaN/null/undefined/'' 五个值是false,其余的都是true)  => false
        
        所以false == false    true

在JS中对象的属性名是什么格式的?

普通对象的属性名只能是“字符串”(普通对象的属性名可以是基本数据类型值)

Map 这种数据结构支持 对象作为属性名

Object:对象的键值对中,键可以为基本数据类型中的任意一种,输出时可以用Obj[0]、Obj[true], 也可以用Obj["0"]、Obj["true"]

let obj = {
    0:100,
    true:"哈哈",
    null:"呵呵"
}
obj[0],obj[true] // 100,"哈哈"
obj["0"],obj["true"] //100,"哈哈"

但键不可以为引用数据类型值,默认会把引用数据类型值转化为字符串

let a = {x:100};
let b = function (){
    let test = 123
}
obj[a] = 1000;
obj[b] = 2000;
输出时为:[object Object]: 1000
        "function (){↵ let test = 123↵ }": 2000
如果加一个let c = {y:200};
obj[c] = 3000;
输出时为:[object Object]: 3000 //因为都被转化成了[object Object],所以把obj[a] = 1000覆盖了
        "function (){↵ let test = 123↵ }": 2000