1. continue和 break有什么区别?
答案:
break和continue都是用来控制循环结构的。
- break:提前终止循环可以使用break来完成。break完全结束一个循环,跳出循环体执行循环后面的语句。
- continue:理解为continue是跳过当次循环中剩下的语句,执行下一次循环。
- 区别: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
- 构造函数一旦返回一个对象,就不再创建新对象
- m获得的是function(){ return this.age; }
- n=test(),this指向window。先将全局变量age变为50,又返回一个函数function(){ return this.age; }保存在变量n中
-
2. 判断以下程序的输出结果:
var name=”The Window”;
var obj={
name:”My obj”,
getName:function(){
return function(){
return this.name;
}
}
};
console.log(obj.getName()());
答案:
the window obj.getName() 返回一个函数对象function(){ return this.name; }
(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 2fn() this指向window,所以输出10
arguments0 属于特殊情况,this->arguments,相当于arguments.0(), 所以,this指向arguments。所以length输出的是obj.method()的参数个数,为2.
4. 统计一个字符串中出现次数最多的字符是? 共出现多少次
答案:
var dict={};
var c=””, max=1;
for(var i=0;ivar 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函数定义时,函数内容是不执行的,所以i还是i,不会变成0,1,2,3,4
- 定时器中的回调函数只能再主程序执行完才能开始执行
-
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 let相当于匿名函数自调,所以,let声明的变量,不会自动加入到window
剪头函数内外this通用,所以apply也无法替换sayColor函数内的this,所以this指向window,所以输出red
7. 判断以下程序的输出结果:
var c=1;
function c(c){
console.log(c);
var c=3;
}
c(2);
答案:
报错: TypeError: c不是一个函数function c(c){} 整体被声明提前,后又被c=1代替。所以,c最后不是一个函数,而是数字1
8. 判断以下程序的输出结果:
function change(){
alert(typeof fn)
function fn(){ alert(‘hello’) }
var fn;
}
change();
答案:
functionfunction fn(){…}被整体声明提前了
var fn发现已经有fn变量了,就不再重复创建,所以,var fn没作用。
9. 判断以下程序的输出结果:
a=3
a.prop=4; prop是从属性对象中取值
alert(a+a.prop)
答案:
NaNa.prop=4,等效于new Number(a).prop=4, 但是new Number(a),使用后自动释放,4也不存在了
- 再次使用a.prop,又等效于新的new Number(a),所以没有prop属性,值为undefined。
数字+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-
11. HTML事件的绑定方式有哪几种,如何绑定?
答案:
在DOM元素中直接绑定,
例如,鼠标单击事件 onclick ,鼠标双击事件 ondouble,鼠标移入事件 onmouseover,鼠标移出事件 onmouseout 等
- 在JavaScript代码中绑定
例如,elementObject.onXXX=function(){
// 事件处理代码
}
- 绑定事件监听函数
例如,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
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
}
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的核心则是动态添加