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。这样做不仅可以避免稀疏数组和垃圾收集的问题,还可以更好地保护属性的访问权限。(伪删除)