加载中...

JS面试

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所以被识别为一个对象

image-20240314100345143

面试3:0.1+0.2等于多少

0.1+0.2=0.3000000004

因为有些小数的二进制是无限循环的01串,所以在运算时会进行舍弃,所以精度会丢失,根据舍入的第一位决定最后一位是否需要进位(取舍规则是取16位,16位中且包括小数点)

image-20240315085014944

posted @ 2024-03-18 22:05  江寒雨  阅读(23)  评论(0)    收藏  举报