1、什么是变量提升?函数提升?
JS在执行代码前,会先进行“预编译”
“预编译”是指在执行脚本前,去先开辟出一个空白的空间,用来存储声明的变量和函数,存储之后,
在进行执行脚本,“预编译”就相当于将所有变量和函数都放在脚本前面,所以在执行脚本的时候,这个声明的变量和函数的值就是undefined
然后,执行脚本,在执行脚本的时候在赋值,这就是变量提升和函数提升;
栗子
//函数声明提升:
function foo1(){
foo();
function foo(){
num = 10;
console.log(num)
}
}
foo1();
//变量提升
// ----示例1:
console.log(a); //undefined
var a = 5;
// ----示例2:
num = 6;
++num;
var num;
console.log(num);//打印结果为7
在代码中我们并不体长变量提升的使用,但之所以要了解,是因为当我们足够了解运行相关机制的时候,可以避免很多问题,也可以解决很多问题,在实际过程中,我们需要按照正常的代码规范去构建我们的需求,以便我们的代码更加方便维护,也使我们的代码有更好的可读性。
2、isNaN 与 Number.isNaN的区别?
isNaN的直译并不是“是不是NaN”,而是通过Number将类型转换为Number,如果转换成功,则返回----false,否则返回---true
Number.isNaN判断是否为数字,相当于“===”,判断其传入的参数是否为数字,如果是返回---true,否则返回----false,
3、解决遍历对象时,把原型上的属性遍历出来了咋办?
首先问题是,在遍历一个对象的时候,将其属性一同都遍历了出来 首先用的是for..in,遍历的时候,会将遍历对象的原型链上的属性也遍历出来
let object = {name:"小明"};
object.property.age = 20; // 会将遍历对象的原型链上的属性也遍历出来
for(var a in object){
console.log(a); // 打印结果为name,age
};
//解决方案:
//1)使用obj.hasOwnProperty(k);
// hasOwnProperty表示是否有自己的属性,这个方法会查找在这个对象中是否有这个属性,但是不会找它的原型链上的属性
//2)或者不使用for...in ;使用for...of
let object = {name:"小明"};
for(var [k] of Object.entries(obj)){
console.log(k) // name
}
//Object.entries会传入一个对象,返回一个二维数组,而每一项就是这个对象的键值所组成的数组
4、valueOf 与 toString区别
首先两者的区别:
-
valueOf偏向于运算,toString()偏向于显示;
-
对象转换时,优先调用toString;
-
强转字符串的时候,优先调用toString();强转数字的情况下优先调用valueOf();
-
toString():返回的数据类型均是字符串类型,在非运算过程
中,通常优先调用toString(); -
在运算过程中优先调用valueOf(),如果valueOf运算失败或失效,依旧会优先调用toString()
调用valueOf()
| 对象 | 返回值 | 返回值类型 |
|---|---|---|
| Array | 数组本身 | Array |
| Boolean | Boolean值 | Boolean |
| Date | 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC | Number |
| Function | 函数本身 | Function |
| Number | 数字值 | Number |
| Object | 对象本身。这是默认情况 | Object |
| String | 字符串 | String |
调用toString()
| 对象 | 返回值 | 返回值类型 |
|---|---|---|
| Array | 数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起。其操作与 Array.toString 和 Array.join 方法相同 | String |
| Boolean | 字符串“true”,“false” | String |
| Date | 字符串日期,如"Fri Dec 23 2016 11:24:47 GMT+0800 (中国标准时间)" | String |
| Function | 函数字符串 | String |
| Number | 字符串形式值 | String |
| Object | "[object Object]" | String |
| String | 字符串 | String |
5、JavaScript变量在内存中具体存储形式?
数据类型分为基本类型和引用类型; 基本类型存储在栈内存中, 引用类型的指针存储在栈内存中,指针指向的是堆内存中的地址