文章目录
- Javascript对象的底层数据结构是什么?
- Symbol理解?
- 基本类型对应的内置对象之间的装箱拆箱操作?
- null和undefined的区别?
- 判断javascript数据类型的方式,以及他们的优缺点,如何准确的判断数组类型?
- 可能发生隐式类型转换的场景以及转换原则,应如何避免或巧妙应用?
- 出现小数精度丢失的原因,javascript可以存储的最大数字,最大安全数字,处理大数字的方法,避免精度丢失的方法?
- 理解原型设计模式以及javascript中的原型规则
- 理解javascript的作用域和作用域链
- 理解javascript的执行上下文栈
- this的原理以及几种不同的使用场景的取值
- instanceof的底层实现原理,手动实现一个instanceof
- 描述new 一个对象的详细过程,手动实现一个new操作符
- 闭包的实现原理和作用,可以列举几个开发中闭包的实际应用
- 理解堆栈溢出和内存泄漏的原理,如何防止
- 理解模块化解决实际问问题,列举几个模块化方案并理解其中原理
- 创建对象的方法有哪些
- 阐述js异步原理 eventLoop?Js事件流?如何处理循环的异步操作?
- es6新增了哪些方法,如何处理这些方法的兼容问题
- H5有哪些新特性
- localstorage、sessionStorage、cookie
- 如何跳出for循环
- ajax请求流程
- 深浅copy
- this指向及如何改变
- js的变量提升
- 事件委托
- Promise的实现原理
- 理解词法作用域和动态作用域
- 理解es6 class构造以及集成的底层实现原理
Javascript对象的底层数据结构是什么?
其他问法:
Javascript中的变量在内存中的具体存储形式?
理解值类型和引用类型?
Symbol理解?
声明一个唯一值
s instanceof Symbol // false
Symbol.for('name') // Symbol(name)
Symbol.keyFor(Symbol.for('name')) // name
给对象当做一个字段使用:Obj[Symbol(‘’)]
// 找不到symbol
Object.keys(obj)
For in
Obj.getOwnPropertyNames(obj)
基本类型对应的内置对象之间的装箱拆箱操作?
// 隐式装箱
let a = 'sum'
let b = a.indexof('s') // 0
// 进行隐式装箱
let a = new String('sum') // 创建string类型的一个实例
let b = a.indexof('s') // 在实例上调用指定的方法
a = null // 销毁这个实例
// 显式装箱:
let a = new String('sum') // 直接用new 声明字符串
// 拆箱:
let [name, age] = [new String('sum'), new Number(24)]
console.log(typeof name, typeof age) // object, object
// 拆箱操作 - 使用valueOf 或toString
console.log(typeof name.valueOf(), typeof age.valueOf()) // string, number
null和undefined的区别?
null表示空 undefined表示未定义
相等==, 不全等===
typeof结果不一样 [object, undefined]
+null +undefined结果不一样 [0, NaN]
判断javascript数据类型的方式,以及他们的优缺点,如何准确的判断数组类型?
typeof x // x = new String(‘1’)得出结果为object
x instanceof Array // 无法区分对象和数组
Object.prototype.toString.call(x) // 目前最好的判断形式
x.constructor // null undefined 没法使用
变量的内置属性方法:数组的length属性 // 字符串也有length属性
可能发生隐式类型转换的场景以及转换原则,应如何避免或巧妙应用?
+null // 0
+'' // 0
+'432' // 432
'1' == 1 // '1' == '1' 且使用==会触发toString valueOf可以return新值回去
出现小数精度丢失的原因,javascript可以存储的最大数字,最大安全数字,处理大数字的方法,避免精度丢失的方法?
小数进行算术运算时,实质上就是把十进制的浮点数转化为二进制
JS存储最大值:Number.Max_VALUE()
JS最大安全值:Number.Max_SAFE_INTERGER(),即2的53次方
避免精度丢失方法:toFixed()方法,先进行四舍五入取有效的小数位数,然后使用parseFloat()返回浮点数
理解原型设计模式以及javascript中的原型规则
理解javascript的作用域和作用域链
理解javascript的执行上下文栈
this的原理以及几种不同的使用场景的取值
this的值是在执行上下文的时候才能被确认
instanceof的底层实现原理,手动实现一个instanceof
function myInstanceof(obj, constructor) {
let implicitPrototype = obj?.__proto__; // obj的隐式原型
const displayPrototype = constructor.prototype; // 构造函数的原型
while (implicitPrototype) { // 遍历原型链
// 找到,返回true
if (implicitPrototype === displayPrototype) return true;
implicitPrototype = implicitPrototype.__proto__;
}
return false; // 遍历结束还没找到,返回false
}
描述new 一个对象的详细过程,手动实现一个new操作符
创建一个空对象
将函数内部的属性指向这个对象
将this指向这个对象
返回对象
function mynew(construtor, ...argus) {
var obj = Object.create(construtor.prototype)
var reslut = construtor.apply(obj, argus)
return reslut
}
闭包的实现原理和作用,可以列举几个开发中闭包的实际应用
概念:函数里面声明变量且再返回一个函数(可以访问变量的函数)
优点:变量私有化,避免全局污染
缺点:没有被销毁的变量会保留在内存,大量使用闭包造成内存泄漏,内存消耗过大
理解堆栈溢出和内存泄漏的原理,如何防止
function isEven(num ) {
if (num == 0) return true
if (num == 1) return false
return isEven(Math.abs(num) - 2)
}