第一题
以下Js程序的输出是什么
<SCRIPT LANGUAGE="JavaScript">
var a="undefined";
var b="false";
var c="";
function assert(aVar){
if(aVar)
alert(true);
else
alert(false);
}
assert(a );
assert(b );
assert(c );
</SCRIPT>
true,true,false
变量abc都是字符串型的变量,而不是真正的undefined和false,在判断里都会被认为是真值,显示true,只有空串为false
第二题
假设 a 是一个由线程 1 和线程 2 共享的初始值为 0 的全局变量,则线程 1 和线程 2 同时执行下面的代码,最终 a 的结果不可能是()
boolean isOdd = false;
for(int i=1;i<=2;++i)
{
if(i%2==1)isOdd = true;
else isOdd = false;
a+=i*(isOdd?1:-1);
}
不可能为1,可能为-2,-1, 0
1.AB不并发:此时相当于两个方法顺序执行。A执行完后a=-1,B使用-1作为a的初值,B执行完后a=-2
2.AB完全并发:此时读写冲突,相当于只有一个线程对a的读写最终生效。相同于方法只执行了一次。此时a=-1
3.AB部分并发:假设A先进行第一次读写,得到a=1;之后A的读写被B覆盖了。B使用用1作为a的初值,B执行完后a=0
第三题
下面代码执行后,foo.x的值是 ?
var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};
foo指向对象{n:1}
bar指向对象{n:1}
首先foo断开原来的指向,指向{n:2},
然后foo.x将找不到,所以为undefined
第四题
以下代码的执行后将输出()
var a = 0;
var obj = {
a:'obj',
b:function(a){
setTimeout(function(){
console.log(this.a);
},1000)
}
}
obj.b(1);
setTimeout函数中的this指向是window对象,window对象中的a为0。
第五题
以下输出结果为true的有
A
’ ’==false
B
’ ‘==0
C
’ ’==[ ]
D
’ ’=={ }
A选项,B选项,C选项,JavaScript在做==运算时会将操作数转换为Number类型之后再操作,而’ ',false,0和[]都可以转换为number类型。所以A,B,C正确。
D选项,{}转换为number类型是NaN。
第六题
以下运算结果不是number类型的是
A
"a"-1
B
1/0
C
0 && "a"
D
new Number(1)
A;‘a’-1为NaN 数据类型为number
B:1/0为infinity 0/0返回NaN,正数/0返回infinity,负数/0返回-infinity 数据类型为number
C:0 && “a" 为0,&&为短路操作,且如果有一个操作数不是布尔值,则结果就不一定返回布尔值。 a && b,如果a能转换成false,则返回a。数据类型为number
D项创建的是基本包装类型的对象。
第七题
使用了"use strict"后,以下哪些描述错误
A
"use strict"; var x = 17; with (obj) { x; } //会报obj未定义的错误
B
"use strict"; var x; delete x; //运行正常
C
function f(a){ "use strict"; a = 42; return a==arguments[0]; } f(5); //运行结果为true
D
function f(str){ "use strict"; return eval(str); } f(‘alert(1)’); //运行正常,弹窗1的对话框
A:严格模式下禁止使用with语句,因为with语句无法在编译时就确定属性到底归属哪个对象。A对
B:严格模式下无法删除变量。只有configurable设置为true的对象属性,才能被删除。B对
C:严格模式下arguments不再追踪参数的变化,在函数内部,参数a被重新赋值为42,但arguments[0]仍然为5。C对
D:严格模式下,在作用域eval()创建的变量不能被调用。D错