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; |
|