数据类型相关问题
Youky ... 2021-10-11 About 2 min
# 数据类型
# 变量提升
# 不同声明方式的区别
function
和var
会进行变量提升let
和const
不会进行变量提升
# 不同提升的区别
- function定义的函数,在定义前正常使用
fn('test') // test
function fn(data){
console.log(data);
}
1
2
3
4
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
2
3
4
5
6
7
8
# BigInt
一种新的数据类型,用于支持大整数
。只能和BigInt做运算,不能传入接收Number为参数的内置函数
- Number最大的安全值为
-(2^53-1)
,最小值为-(2^53-1)
- BigInt可以表示任意大的整数。使用方法是数字后跟一个n,如:
90n
# 对象到原始类型的转换
- 如果存在Symbol.toPrimitive,优先调用该方法。若返回值不是原始类型,会报错
- 如果是转Number类型,调用valueOf方法。若返回值不是原始类型,则再调用toString方法
- 如果是转String类型,调用toString方法。若返回值不是原始类型,会报错
# 数据类型检测
- typeof:
- 原始类型:null返回Object,其他都能正确检测
- null返回Object的原因:二进制前三位为0的系统会判断为Object,而null全为0
- 引用类型:函数返回function,其他都返回Object
- 原始类型:null返回Object,其他都能正确检测
- Object.prototype.toString.call
- instanceof:检查对象是否是另一个对象的实例,不能检测类(class)的继承
- 对于class:A.isPrototypeOf(B)检测A是否是B的父类
- 通过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
2
3
4
5
6
7
8
9
10
11