[TOC]

1. continue和 break有什么区别?

答案:
break和continue都是用来控制循环结构的。

  1. break:提前终止循环可以使用break来完成。break完全结束一个循环,跳出循环体执行循环后面的语句。
  2. continue:理解为continue是跳过当次循环中剩下的语句,执行下一次循环。
  3. 区别:continue只终止本次循环,break则完全终止循环

    2. i++和++i的区别?

    答案:
    i++ 理解为:先用i值后加1, 比如int j=i++; 如果i的初值是1,那么表达式i++的整体值就是1,然后,i的值就变成了2,最后执行赋值运算,将i++整体的值1,赋值给j,j为1。
    ++i 理解为:先加1后用i值,比如int j=++i;如果i的初值是1,首先i增加1为2,然后用i的值2最为++i整体表达式的值,最后进行赋值运算,将++i表达式的值2赋值给j,j为2。
    注意:这两个表达式在计算时,=号赋值计算,都是最后发生的,是非常常见的考点。

    3. JavaScript都有哪些数据类型?

    答案:
    原始类型:数值型/字符串型/布尔型/未定义型/null 引用类型:对象

    4. 自调用函数是什么?用于什么地方?

    答案:
    (function(){ })(); 创建一个局部作用域。

    5. slice和splice有什么区别?

    答案:
    slice是截取字符串,splice是切割字符串。

    6. typeof返回的类型有哪些?

    答案:
    Number string boolean undefined object。

    7. 取10-100之间的一个随机数?

    答案:
    Math.ceil(Math.random()*90+10)。

    8. 解释变量声明提升?

    答案:
    使用var关键字声明的变量,会将声明提升到所在作用域的最前边。。

    9. push、pop、shift和unshift 区别?

    答案:
    这两组同为对数组的操作,并且会改变数组的本身的长度及内容。
    不同的是 push()、pop() 是从数组的尾部进行增减,unshift()、shift() 是从数组的头部进行增减。。

    10. 例举4种强制类型转换和3种隐式类型转换?

    答案:
    强制转换:parseInt/parseFloat/Number/toString
    隐式转换:
    字符串+数值 数值转字符串
    数值+布尔型 布尔型中true转为1,false转为0
    字符串+布尔型 布尔型转为字符串。

    11. 函数声明与函数表达式的区别?

    答案:
    相同点:两者都可以创建函数。
    不同点:函数声明可以存在函数提升,函数表达式不存在函数提升。

    12. 请指出JavaScript宿主对象和原生对象的区别?

    答案:
    宿主对象:指JavaScript解释器提供的对象,由解释器厂家自定义并提供实现,故不同的解释器提供的扩展对象存在较大的差异。
    原生对象:JavaScript语言本身预定义的对象,在ECMAScript标准中定义,由所有的解释器厂家来提供具体实现。

4.下列JavaScript执行后,依次alert的结果是()
(function test(){
var a=b=5;
alert(typeof a); // ‘number’
alert(typeof b); //‘number’
})();
alert(typeof a); //‘undefined’
alert(typeof b); //‘number’

答案:’number’ ‘number’ ‘undefined’ ‘number’

5.以下代码输入的值
console.log(1);
setTimeout(function(){
console.log(2);
},10);
setTimeout(function(){
console.log(3);
},0); //html5中规定间隔的时候最小只能是4
console.log(4);
答案:1 4 3 2
6. 请说出以下代码执行结果
for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i);
}, 0);
console.log(i);
}

执行过程
var i=0;
setTimeout(function() {
console.log(i);
}, 0);
console.log(i); //0
i=1;
setTimeout(function() {
console.log(i);
}, 0);
console.log(i);//1
i=2;
setTimeout(function() {
console.log(i);
}, 0);
console.log(i);//2
i=3

function() {
console.log(i);//3
}

function() {
console.log(i);//3
}

function() {
console.log(i);//3
}

答案:0 1 2 3 3 3

8.express传参的方式有哪些
查询字符串 /detail?lid=5 req.query
路由传参 /detail/5 req.pramas
post传递,需要结合body-parser req.body

9.var,let,const有什么区别

const必须初始化,而且不能更改
var仅在function是局部变量,其余都为全局变量;
let一直充当局部变量,即便是在if中,外界也不能访问
函数变量提升,提升也就是把定义的放在一段代码的最开头
var 的声明,存在变量提升。let 的声明,不存在变量提升。const 的声明,不存在变量提升。
for循环中,var定义相当于在for这一片区是全局的,所以值是最后一个;let是每个独立分开的,所以值不同
var可以重复声明,let不可以

10.null和undefined的区别
在JavaScript中,null 和 undefined 几乎相同
null 和 undefined 基本同义,二者又有什么区别呢?

null表示没有对象
1) 作为函数的参数,表示该函数的参数不是对象
2) 作为对象原型链的终点

undefined表示缺少值
1)定义了形参,没有传实参,显示undefined
2)对象属性名不存在时,显示undefined
3)函数没有写返回值,即没有写return,拿到的是undefined
4)写了return,但没有赋值,拿到的是undefined

null和undefined转换成number数据类型
null 默认转成 0
undefined 默认转成 NaN

在 if 语句中 null 和 undefined 都会转为false
两者用相等运算符比较也是相等
null==undefined //true

11.当前代码块输出结果是什么?

var z=10;
function foo(){
console.log(z); //10
}
(function(funArg){
var z=20;
funArg();//调用foo
})(foo); //传的是地址

答案: 10

12.fs模块
fs模块是Node.js的一个核心模块,专门用来操作系统中的文件,常用的操作方式是对文件的读取和写入
使用require(‘fs’)载入fs模块,模块中所有方法都有同步和异步两种形式。
异步是通过回调函数获取结果,同步是通过方法的返回值获取结果。

13.浏览器的内核有哪些
Trident-IE浏览器内核
blink谷歌浏览器
Gecko-火狐浏览器内核Mozilla
webkit-苹果浏览器内核
blink-Opera浏览器内核

14.数据类型有哪些
原始类型(单类型): String、Number、boolean、null、undefined。
引用类型:object。里面包含的 function、Array、Dat…
15.数组常用的方法
toString()/join()/concat()/slice/splice/reverse()/sort()/indexOf()/lastIndexOf()/includes/forEach/push()/pop()/unshift()/shift()/map()/filter()/map()/every()/some()/reduce

16.以下代码执行结果?
var uname = ‘jack’
function change() { 作用域链
//var uname=undefined;
alert(uname) // undefined
var uname = ‘lily’
alert(uname) //?
}
change()
答案:undefined lily

17. foo = foo||bar ,这行代码是什么意思?为什么要这样写?
答案:这种写法称之为短路表达式
相当于:

var foo;
if(foo){
foo=foo;
}else{
foo=bar;
}
常用于函数参数的空判断

JavaScript高级

1. 判断以下程序的输出结果:

var age=100;<br />    function test(){<br />      this.age=50;<br />      return function(){<br />        return this.age;<br />      }<br />    }<br />    var m=new test();<br />    alert(m()); <br />    var n=test();<br />    alert(n()); <br />**答案:**<br />100 50
  1. 构造函数一旦返回一个对象,就不再创建新对象
  2. m获得的是function(){ return this.age; }
  3. n=test(),this指向window。先将全局变量age变为50,又返回一个函数function(){ return this.age; }保存在变量n中
  4. 调用n时,this指向window。

    2. 判断以下程序的输出结果:

    var name=”The Window”;
    var obj={
    name:”My obj”,
    getName:function(){
    return function(){
    return this.name;
    }
    }
    };
    console.log(obj.getName()());
    答案:
    the window

  5. obj.getName() 返回一个函数对象function(){ return this.name; }

  6. (function(){ return this.name; }()) 相当于匿名函数自调,this指向window

    3. 判断以下程序的输出结果:

    var length=10;
    function fn(){
    console.log(this.length);
    }
    var obj={
    length:5,
    method:function(fn){
    fn();
    arguments0;
    }
    };
    obj.method(fn,1)
    答案:
    10 2

  7. fn() this指向window,所以输出10

  8. arguments0 属于特殊情况,this->arguments,相当于arguments.0(), 所以,this指向arguments。所以length输出的是obj.method()的参数个数,为2.

    4. 统计一个字符串中出现次数最多的字符是? 共出现多少次

    答案:
    var dict={};
    var c=””, max=1;
    for(var i=0;i var char=str[i];
    if(dict[char]===undefined)
    dict[char]=1;
    else{
    dict[char]+=1;
    if(dict[char]>max){
    max=dict[char];
    c=char;
    }
    }
    }
    console.log(c,max);

    5. 判断以下程序的输出结果:

    for(var i=0;i<5;i++){
    setTimeout(function(){
    console.log(i);
    },0)
    }
    console.log(i);
    答案:
    5 5 5 5 5

  9. 函数定义时,函数内容是不执行的,所以i还是i,不会变成0,1,2,3,4

  10. 定时器中的回调函数只能再主程序执行完才能开始执行
  11. 当主程序执行完,循环变量i,已经被改为5了。

    6. 判断以下程序的输出结果:

    window.color=”red”;
    let color=”green”;
    let obj={
    color:”blue”
    };
    let sayColor=()=>{
    return this.color;
    }
    console.log(sayColor.apply(obj));
    let a=10;
    console.log(window.a);
    答案:
    red undefined

  12. let相当于匿名函数自调,所以,let声明的变量,不会自动加入到window

  13. 剪头函数内外this通用,所以apply也无法替换sayColor函数内的this,所以this指向window,所以输出red

    7. 判断以下程序的输出结果:

    var c=1;
    function c(c){
    console.log(c);
    var c=3;
    }
    c(2);
    答案:
    报错: TypeError: c不是一个函数

  14. function c(c){} 整体被声明提前,后又被c=1代替。所以,c最后不是一个函数,而是数字1

    8. 判断以下程序的输出结果:

    function change(){
    alert(typeof fn)
    function fn(){ alert(‘hello’) }
    var fn;
    }
    change();
    答案:
    function

  15. function fn(){…}被整体声明提前了

  16. var fn发现已经有fn变量了,就不再重复创建,所以,var fn没作用。

    9. 判断以下程序的输出结果:

    a=3
    a.prop=4; prop是从属性对象中取值
    alert(a+a.prop)
    答案:
    NaN

  17. a.prop=4,等效于new Number(a).prop=4, 但是new Number(a),使用后自动释放,4也不存在了

  18. 再次使用a.prop,又等效于新的new Number(a),所以没有prop属性,值为undefined。
  19. 数字+undefined, undefined隐式转为数字NaN,导致计算结果为NaN

    10. 判断以下程序的输出结果:

    var o={
    a:10,
    b:{
    a:12,
    fn:function(){
    var a=13;
    console.log(this.a);
    }
    }
    }
    o.b.fn();
    答案:
    12

  20. this指.前的o.b对象,所以a为12

    11. HTML事件的绑定方式有哪几种,如何绑定?

    答案:

  21. 在DOM元素中直接绑定,

例如,鼠标单击事件 onclick ,鼠标双击事件 ondouble,鼠标移入事件 onmouseover,鼠标移出事件 onmouseout 等

  1. 在JavaScript代码中绑定

例如,elementObject.onXXX=function(){
// 事件处理代码
}

  1. 绑定事件监听函数

例如,onreadystatechange=function(){
//事件处理代码
}

12. 实现数组去重(元素js)?

答案:
实现思路:双层循环,外循环表示从0到arr.length,内循环表示从i+1到arr.length
将没重复的右边值放入新数组。(检测到有重复值时终止当前循环同时进入外层循环的下一轮判断)
function unique4(arr){
var hash=[];
for (var i = 0; i < arr.length; i++) {
for (var j = i+1; j < arr.length; j++) {
if(arr[i]===arr[j]){ ++i;
}
}
hash.push(arr[i]);
}
return hash;
}

13.平时用过ES6哪些特性,体验如何,与ES5有什么不同?

答案:Let和const关键字,变量的解构赋值,字符串、数值的扩展,数组、对象的扩展,函数的扩展,for…of
与ES5的区别:
1、定义变量
ES5中用:var / function
ES6中用:let / const / class / import …
没有变量提升
同一个作用域中不可重复声明
不会给window增加全局属性
会形成块级作用域
const设置的变量值是不可修改的(理解为常量)
2、解构赋值
构建一个和变量值相同结构的结构,快速获取对象或者数组中的某一部分内容
3、箭头函数
4、对象和数组中新增加一些属性和方法(正则和字符串中也新增很多)
dir(Array);//=>Array.xxx()
dir(Array.prototype);//=>给实例用的 [].xxx()
dir(Object);//=>Object.xxx()
dir(Object.prototype);//=>({}).xxx()
5、模板字符串 xxx${JS CODE}...
6、class / extends

14. 闭包是什么,有什么特性,对页面有什么影响?

答案:
闭包:既重用变量,又保护变量不被污染的一种机制。
特性:闭包是用外层函数包裹受保护的变量和内层函数对象,外层函数将内层函数对象返回到外部,使用者调用外层函数,获得返回的内层函数
影响:由于闭包时,变量的值都保存到内存中,会导致页面加载时内存消耗很大

15.js的原型链和继承?

答案:
原型链: 由多级父元素,逐级继承,形成的链式结构。
继承:父对象的属性和方法,子对象无需重复创建就可直接使用。

16.使用javascript打印出1-10000之间的所有对称数(例如121,1331等)

答案:
function isSymmetryNum(start,end){
for(var i=start;i var iNumber=+(i.toString().split(“”).reverse().join(“”));

if(iNumber===i&&i>10){
console.log(i);
}
}
}
isSymmetryNum(1,10000);

17.已知有字符串msg=”get-element-by-id”,写一个function将其转化成驼峰表示法,“getElementById”。

答案:
combo(“get-element-by-id”);
function combo(msg){
var arr=msg.split(“-“);
for(var i=1;i arr[i]=arr[i].charAt(0).toUpperCase() + arr[i].substr(1,arr[i].length);
}
console.log(arr);
msg=arr.join(“”);
console.log(msg);
}

18.解释 jsonp 的原理,以及为什么不是真正的 ajax

答案:
动态创建script标签,利用script标签的src属性可以获取任何域下的js脚本,通过这个特性,服务器端不在返回json格式,而是返回一段调用,某个函数的js代码,在src中进行了调用,这样实现了跨域。
Ajax与JSONP这两种技术看起来很像,目的也一样,都是请求一个url,然后把服务器返回的数据进行处理,实际上Ajax与JSONP有着本质上的不同。Ajax的核心是通过XMLHttpRequest获取数据,而JSONP的核心则是动态添加