数据类型相关问题

Youky ... 2021-10-11 前端
  • JS
About 2 min

# 数据类型

# 变量提升

# 不同声明方式的区别

  • functionvar会进行变量提升
  • letconst不会进行变量提升

# 不同提升的区别

  • function定义的函数,在定义前正常使用
fn('test') // test
function fn(data){
    console.log(data);
}
1
2
3
4
  • var定义的变量(包括用var定义函数),只会提升声明,不会提升赋值。因此,可以先赋值后声明
console.log(typeof fn) // undefined
var fn = function(d){
    console.log(d);
}

x = 10;
console.log(x) // 10
var x;
1
2
3
4
5
6
7
8

# BigInt

一种新的数据类型,用于支持大整数。只能和BigInt做运算,不能传入接收Number为参数的内置函数

  • Number最大的安全值为-(2^53-1),最小值为-(2^53-1)
  • BigInt可以表示任意大的整数。使用方法是数字后跟一个n,如:90n

# 对象到原始类型的转换

  1. 如果存在Symbol.toPrimitive,优先调用该方法。若返回值不是原始类型,会报错
  2. 如果是转Number类型,调用valueOf方法。若返回值不是原始类型,则再调用toString方法
  3. 如果是转String类型,调用toString方法。若返回值不是原始类型,会报错

# 数据类型检测

  1. typeof:
    • 原始类型:null返回Object,其他都能正确检测
      • null返回Object的原因:二进制前三位为0的系统会判断为Object,而null全为0
    • 引用类型:函数返回function,其他都返回Object
  2. Object.prototype.toString.call
  3. instanceof:检查对象是否是另一个对象的实例,不能检测类(class)的继承
  4. 对于class:A.isPrototypeOf(B)检测A是否是B的父类
  5. 通过xxx.constructor.name检测其构造函数

# 遍历对象的方法,有什么区别

遍历方法 继承属性 不可枚举属性 Symbol类型属性名
for...in X X
Object.keys
Object.values
X X X
Object.getOwnPropertyNames X X
Reflect.ownKeys X

# 属性检测

# in运算符

自己的属性,以及从原型链上继承的属性,都会检测为true

# hasOwnProperty

只检测自身的属性,从原型链上继承的属性会返回false

function fn(name){
    this.name = name;
}
fn.prototype.age = 21;

let a = new fn('jake');

console.log('name' in a) // true
console.log('age' in a) // true

console.log(a.hasOwnproperty('age')) // false
1
2
3
4
5
6
7
8
9
10
11
Last update: November 27, 2021 21:16
Contributors: youky7