JS基础题每日五道

117 阅读3分钟

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区别

首先两者的区别:

  1. valueOf偏向于运算,toString()偏向于显示;

  2. 对象转换时,优先调用toString;

  3. 强转字符串的时候,优先调用toString();强转数字的情况下优先调用valueOf();

  4. toString():返回的数据类型均是字符串类型,在非运算过程
    中,通常优先调用toString();

  5. 在运算过程中优先调用valueOf(),如果valueOf运算失败或失效,依旧会优先调用toString()

调用valueOf()

对象返回值返回值类型
Array数组本身Array
BooleanBoolean值Boolean
Date存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTCNumber
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变量在内存中具体存储形式?

数据类型分为基本类型和引用类型; 基本类型存储在栈内存中, 引用类型的指针存储在栈内存中,指针指向的是堆内存中的地址