零碎的前端八股文(一)

1.js中的数据类型

  • 简单类型(值类型):number string undefined null boolean Symbol;
  • 复杂类型(引用类型):Object(包含Array和Function)
  • 前者存储在栈上, 后者存储在堆上

2.typeof和instanceof的区别

typeof最适合判断js的简单类型。typeof判断不出来 数组 对象 null。

typeof ""; //string
typeof 13;//number

typeof []; //object
typeof {}; //object
typeof null; //object。   null被认为是一个对空对象的引用。null值便是一个空对象的指针
typeof undefined; // undefined

为了解决这个问题,出现了instanceof,这个是判断

检测对象A是不是另一个对象B的实例的原理是:查看对象B的prototype属性指向的原型对象是否在对象A的原型链上,若在则返回true,若不在则返回false

console.log(person instanceof Object); // 变量 person 是 Object 吗?
console.log(colors instanceof Array); // 变量 colors 是 Array 吗?
console.log(pattern instanceof RegExp); // 变量 pattern 是 RegExp 吗?

任何元素和Object使用instance都会返回true。

3.Number和new Number()的区别

Number是转型函数,new Number()是构造函数

let value = "25"; 
let number = Number(value); // 转型函数
console.log(typeof number); // "number" 
let obj = new Number(value); // 构造函数
console.log(typeof obj); // "object" 

4.if(XXX){}语句中的花括号,和 const obj = {},这两个花括号是如何区分的?

      if语句中,if关键词,就告诉了这个花括号,你出现在了 语句上下文,左花括号表示一个语句块的开始;

      创建对象时,“=”赋值操作符表示告诉了这个花括号,你出现了在了 表达式上下文中,你期待的是一个值,左花括号表示一个表达式的开始。

5.使用delete删除object属性时有什么诟病?

      因为它会导致对象的属性变得稀疏,从而降低了对象的性能。(内存地址不连续,访问对象需要更长的时间,并且在垃圾回收的时候,遍历的时候访问到空隙,就会跳过,增长了时间)

     此外,使用 delete 删除属性还会导致垃圾收集器的启动,从而进一步降低了性能。(被删除时,被删除的值引用会被标记为垃圾)

     为了避免这种情况,可以使用 Object.defineProperty() 方法来定义一个属性,并将其设置为不可枚举(enumerable设置为false 描述属性是否会出现在for in 或者 Object.keys()的遍历中)。这样,虽然该属性仍然存在于对象中,但它不会被 for...in 循环遍历,也不会被 JSON.stringify() 方法序列化,从而避免了稀疏数组和垃圾收集的问题。

     另外,如果需要删除一个对象的属性,最好使用赋值操作符将其设置为 undefined 或 null,而不是使用 delete。这样做不仅可以避免稀疏数组和垃圾收集的问题,还可以更好地保护属性的访问权限。(伪删除)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值