JS面试
数据类型
基本数据类型
boolean
null
undefined
number
string
bigint
symbol
{
symbol:唯一值,类似数据库中的id永远
一般用于定义唯一不重复值的字段
声明Symbol:let id = Symbol(arg)
arg参数是对该Symbol的描述,用于区分不同的Symbol对象
Symbol.description 可以调用descripton方法,返回值为该symbol对象的描述
Symbol.for(arg) 方法也可以生成一个Symbol对象,arg是对他的描述,只要描述一致,就可以创建完全相同的Symbol对象
let id1 = Symbol("描述")
let id2 = Symbol("描述")
console.log(id1===id2) //输出false
此时的俩个symbol是不同的
但是使用Symbol.for()方法,可以获得相同描述的Symbol对象
let id1 = Symbol.for("描述")
let id2 = Symbol.for("描述")
console.log(id1===id2) 输出true
可以看到是俩个相同的Symbol对象
Symbol原型.keyFor(Symbol实例),也可以获得Symbol对象的描述,但是只能获得由Symbol.for创建的symbol对象的描述
例如,console.log(Symbol.keyFor(id1))
//输出 描述
Symbol的实际应用场景:{
1.解决id重复问题
let person1 = {
key: Symbol(),
name: "张三"
}
let person2 = {
key: Symbol(),
name: "张三"
}
let sa = {
[person1.key]: 3000,
[person2.key]: 12000
}
console.log(sa[person2.key]); //输出12000
2.隐藏对象属性
class Person{
constructor(name){
let id = Symbol()
this.name = name
this[id] = 666
}
}
p = new Person()
for(let key in p){
console.log(key); //只输出name
}
let id = Symbol()
//隐藏属性使用get方法
class Person{
constructor(name){
this.name = name
this[id] = 666
}
getId(){
return this[id]
}
}
p = new Person()
console.log(p.getId());
//如果在此结果上还想要遍历
//可以调用getOwnPropertySymbols获得对象上挂载的Symbol对象
for(const value of Object.getOwnPropertySymbols(p)){
console.log(value);
}
//获取对象上包括Symbol的所有属性,通过Reflect反射获取
for(const value of Reflect.ownKeys(p)){
console.log(value)
}
}
}
引用数据类型
对象(object)
数组(Array)
函数(Function)
日期(Date表示日期和时间)
正则表达式(RegExp)
Map(键值对集合)
Set(一种不重复值集合)
面试1:判断数据为数组还是对象
使用Object.prototyoe.toString.call() 来判断对象和数组
对于数组返回"[object Array]"
对于对象返回"[object Object]"
let arr = [1,2]
let obj = {}
// 我的判断方法
console.log(arr instanceof Array)
console.log(obj instanceof Array)
//判断方法1
console.log(Object.prototype.toString.call(arr)==="[object Array]");
//true
console.log(Object.prototype.toString.call(obj)==="[object Object]");
//true
//判断方法2
Array.isArray([]) 使用Array对象中的isArray判断,返回boolean
//true
Array.isArray({})
//false
面试2:null是不是对象类型?
null实际上不是一个对象,他是七大基本类型中的一种
早期的js设计遗留问题,js底层实现中使用了一种称为标签来存储不同类型的值,对于对象类型,其标签值的二进制表示的低三位都是0,null在内存中表示全0,因此低三位为0所以被识别为一个对象
面试3:0.1+0.2等于多少
0.1+0.2=0.3000000004
因为有些小数的二进制是无限循环的01串,所以在运算时会进行舍弃,所以精度会丢失,根据舍入的第一位决定最后一位是否需要进位(取舍规则是取16位,16位中且包括小数点)