第一题:
9,下列输出结果是true的是()
A,console.log(isNaN(123)); //isNaN()是一个函数
B, console.log(null==undefined); //true
C, console.log(null===undefined); //false
D, console.log(NaN==NaN); //false
解析:D,是地址值的比较。
扩展:
空对象:
{}=={}, //false。
{}==!{}; // false。
空对象是true,非空对象是false,相当于true==false相比较,结果打印false。
如果对象做比较,会调用两个方法toString() valueOf()
先调用 valueOf(),如果返回的原始值不是一个字符串,会再调用toString() ,会再通过Boolean去转换一下。
[]==[]; //fasle,地址值的比较
[]==![];//true, 因为空数组是true,非空数组就是false。
相当于:
[]==0 //true
0==false //true
[]==false //true
第二:
console.log(({}+{}).length); 打印结果是30,一个空对象的length是15,两个是30。
{}对象, 在高程数规定了 先调用valueOf()
如果返回的不是一个简单数据类型 再调用 toString()
console.log(({}.toString()).length); 打印结果是15.
console.log({}.toString());
控制台打印输出: [object Object] 数一下加上空格
第三题:
10,console.log(true&&”abc”);
&&右边是abc字符串,左边是true布尔类型,结果打印abc。两者都为真时,结果返回&&后边的。
3&&4 //4 左边为真,返回最右。左边为假返回左边的假
0&&4 //0
第四题:
1,JavaScript事件的三个阶段都有什么?如何阻止事件冒泡?
事件捕获阶段
事件目标阶段
事件冒泡阶段
三个方法阻止事件冒泡:
event.stopPropgation();
兼容ie的:event.cancelBubble=true;
return false;
2,foo = foo || bar,这个代码是什么意思?为什么要这样写?
短路代码! 代码更加的简洁
3,请写出动态创建元素的方法(最少写出4种方法)
1)innerHTML
2)appendchild
3)createElement
4) document.write
4, for(var i=1;i<=3;i++){
setTimeout(function(){
console.log(i);
},0);
};
执行结果是:4 4 4
for循环执行了3次,
原因:js是单线程的 for循环和setTimeout定时器 都是window的顶级对象
for循环执行完后 再执行定时器
nodejs也是单线程的。
如果需要在setTimeout中打印1 2 3 ?
解决:用自执行函数,并且在setTimeout中传入参数
变形:
for(var i=1;i<=3;i++){
//这里写一个自执行函数
setTimeout( (function(b){
console.log(b);
})(i), 0);
};
for循环执行一次,自执行函数也执行一次。
5,var foo=1
function fn() {
foo=10;
return;
function foo(){
}
}
fn();
console.log(foo);
返回:1
讲解:提升
var foo;
function fn(){
function foo(){
}
foo=10;
return
}
foo=1;
fn()
console.log(foo)
解析:
var foo;
//全局
function fn(){
//相当于:var foo=function(){}
//局部的:function foo(){}
foo=10;
return
}
foo=1;
fn()
console.log(foo)
var foo=1
function fn() {
foo=10;
}
fn();
console.log(foo);
6,
function aa(){
return function(){
var aa=10;
var bb=20;
};
}
console.log(aa);
//输出function整个函数
function aa(){
return function(){
var aa=10;
var bb=20;
};
}
console.log(bb);
//报错,全局找不到。
7,分析下面的js代码段,输出结果是什么?并解释原因?
function Fn(){
return Fn
};
fn=new Fn()
console.log(fn instanceof Fn);
//打印结果是false。
//构造函数:考点:是看是不是实例! instanceof
解析:
fn=new Fn() new会在fn函数中创建一个this对象,
并返回this(相当于 return this)。
function Fn(){
var this={};
return Fn
return this
};
fn=new Fn()
console.log(fn instanceof Fn);
return Fn 了 return this 就不执行了。
Fn函数返回了整个函数体,
从而fn就是函数
而不是this指向的fn对象实例
那么fn和Fn是相同的函数
又因为函数不能是函数的实例。
所以返回false
补充:
var b=10;
setTimeout(function(){
alert(b);
var b=66;
},1000)
b=666;
alert(b);
结果: 666 undefined
var b
alert(b);
b=66;