1.
var s = 'hello';
s.pro = 'world';
console.log(s.pro+s);
答案是: undefinedhello(这儿主要是考察了js的基本功,也就是对象的赋值;很明显第一行声明了变量s只是一个字符串。所以s.pro是不成立的。)
2.
var n = 10;
n.pro = 10;
console.log(n.pro+n);
答案是NaN(这道题与上面一道是差不多的,不同的是数值加上一个undefined等于NaN)
3.
var length = 10;
function fn(){
console.log(this.length);
}
var obj = {
length: 5,
method: function(){
fn();
arguments[0]();
console.log(this.length);
}
}
obj.method(fn,1);
答案是10和2,5
解析:这道题主要考查的是对js中this指向的认识,(js中this的值取决于调用的模式),如题目 中所涉及到的方法调用模式,即当一个函数被保存为对象的一个属性时,我们称它为一个方法,当一个方法被调用时,this指向了该对象,如:
var obj = {
value: 1,
getvalue: function(){
console.log(this.value);
}
}
obj.getvalue(); //结果输出1,此时的this指向obj;
注意: 该模式中,this对象的绑定发生在方法被调用的时候。
所以,题目中fn()其实指向的是全局即window,而arguments[0]()指向的是arguments本身,这儿因为传入了两个参数,所以输出为2;
4.
if('a' in window){
var a = 10;
}
console.log(a);
答案是: 10
解析: 这道题主要考查的是声明提升(主要包括函数声明提升、变量声明提升)如上面题目所示,其实相当于
var a;
if('a' in window){
a = 10;
}
附加: 函数声明提升
say();
function say(){
console.log('hi');
}
尽管函数是在say()后面定义的但是仍然能够执行。
5. var s = ‘aaabcdddddcccbbbba’; 编写一个函数,列出s中出现的每一个字符串以及其出现的次数;
var obj = {};
var letter;
var key,num;
for(var i = 0; i < s.length; i++){
letter = s[i];
if(!obj[letter]){
obj[letter] = 1;
}else{
obj[letter] ++;
}
}
for(k in obj){
num = obj[k];
key = k;
console.log(key+'出现了'+num+'次');
}
解析: 上边也只是列举出了其中的一个解法,思路就是,遍历s字符串,通过letter变量将字符串中的每一项存放到obj对象中,如果已经存放有该变量,则将属性值加1,否则的话就给obj增加该属性名,并且赋值为1;
6. 现有一个<div><a href="#"></a><a href="#"></a><a href="#"></a><a href="#"></a><a href="#"></a></div>
输出点击的a对应的索引值。
// 方法一:
var as = document.getElementsByTagName("a");
for(var i = 0; i < as.length; i++){
as[i].idx = i;
as[i].onclick = function(){
console.log("所点击的a标签对应的索引值为:"+this.idx);
}
}
// 方法二:
function addBtn(){
for(var i = 0; i < as.length; i++){
as[i].onclick = (function(j){
return function(){
alert(j);
}
})(i)
}
}
addBtn();