javacript容易遗漏,也容易被面试官为难的点

语法类

  • 用“var”声明的变量,会出现“变量提升”的现象。javascript引擎的工作方式,先解析代码,获取所有声明的变量,然后再一行行运行,所有声明的语句都会被提升到代码的头部。

    1
    2
    3
    console.log(b);
    var b="hi!";
    //运行后不会报错,打印出 "undefined"

    其实运行时是这样的:

    1
    2
    3
    var b;
    console.log(b);
    b="hi!";

    由于变量提升导致的,如果不用“var”的方式声明,则不会出现,且上诉编写的代码无法运行,会报错。

  • 区块不构成单独的作用域,与不使用区块的情况没有任何区别

    1
    2
    3
    4
    {
    b="hi!";//在区块内定义了一个变量
    }
    console.log(b);//hi 在外部也能将其打印出来

ps:但凡学过一种高级语言的的童鞋都知道,局部变量与全局变量的区别,在js中,区块是无法定义局部变量的,所以以后建议童鞋们,尽量避免相同名称的变量命名,会有意想不到的坑出现……

问题1:下面js代码运行时会不会报错?为什么?

1
2
3
4
if(true){
console.log(tmp);
}
var tmp="hello world!";

问题2:下面js代码运行后打印出了值,为什么?

1
2
3
4
5
if(true){
tmp="hello world!";
}
console.log(tmp);
//hello world!

数据类型类

  • javascript数据类型有六种:

    1. 数值(number) :整数小数 –>原始类型
    2. 布尔(boolean) : true false –>原始类型
    3. 字符串(string) :“Aasdasd” –>原始类型
    4. undefined :未定义 –>特殊值
    5. null :没有值 –>特殊值
    6. object :对象 –> 各种原始类型值组合起来的集合(合成类型)
  • 对象又分为三种:

    1
    2
    3
    var object = {}; var object = new Object(); //狭义的对象
    var arr = new Array(); //数组也是对象
    var handler = function(){} ; //函数也是对象

以上三种统称为广义的对象

  1. 狭义的对象与数组是两种不同的原始类型数据的组合方式,而函数则是处理数据的方法。
  2. Javascript把函数当成一种数据类型,可以像其他数据类型一样,进行赋值和传递,体现了Javascript的“函数式”语言的本质。
  • 布尔值

    除了以下六个值在自动转换为布尔值时,被认为是false,其他都视为true。

    1
    2
    3
    4
    5
    6
    7
    undefined  
    null
    ''
    ""
    NaN
    0
    false

问题1:以下代码输出结果是什么,为什么?

1
2
3
4
5
6
7
var a=3,b=2,c='',d=[];
if(c){
console.log("reslut1="+(a+b));
}
if(d){
console.log("reslut2="+(b-a));
}

数值

  • 在Javascript内部,所有数字都是以64位浮点数形式存储的,整数也是,所以1与1.0是同一个数,不仅仅是值相同。所有的数字,都是 浮点数,在底层就没有整数。要注意的是:由于浮点数不是精确的值,导致小数会出现各种问题,比如:

    1
    2
    3
    4
    console.log(0.3/0.1)
    //2.9999999999999996
    console.log(0.1+0.2===0.3)
    //false
  • 浮点数

    1. 组成:

    第1位:正负位,0表示正数,1表示负数。
    第2位到第12位:指数位,存储指数的部分。
    第13位到第64位:小数位,存储小数部分,即有效数字。

    1. 格式:
      (-1)^正负位 * 1.xxxxx (小数位) * 2^指数位