——記25道JS題目

1.下面在控制檯的輸出是什麼??數組

console.log( [typeof null , null instanceof Object] )
/* 咱們知道JS中變量類型分爲值類型和引用類型。typeof 能夠識別出
 undefined、string、number、boolean 四種值類型,{}、[]、null
都是返回 'object',函數則返回'function'。另外,symbol類型也能夠識別返回'symbol'。
A instanceof B方法則是判斷A的原型鏈上是否有B的原型。
好比 [] instanceof Array 返回 true, 明顯此處null instanceof Object返回false。 
 結果爲 ["object", false]  */

2.下面在控制檯的輸出是什麼??閉包

[]["map"]+[1,2]
// 空數組的"map"屬性是函數,'+'鏈接引用類型是字符串拼接。
// 因此 'function map(){...}1,2'
[]["a"]+[1,[2,3]] 
// 空數組的"a"屬性是undefined,與數組拼接,結果爲'undefined1,2,3'
[]['push'](1) 
// []['push'](1) => [].push(1),返回數組長度'1'
(![]+[])[+[]] 
// ![] => false,+[] => 0,false + [] => 'false',
// 空數組轉爲數字是0,'false'[0] 爲 'f'
(![]+[])[+!![]]
// ![]爲false,!![]則爲true,Number(true) => 1;('false')[1] => 'a'
++[[]][+[]] + [+[]] 
// ++[[]][0] + [0], 1 + [0] => '10'
[1 < 2 < 3, 3 < 2 < 1]
//  1 < 2 < 3 => false < 3 => 0 < 3 => true, 一樣[true, true]

3.閱讀如下代碼,下面的輸出是什麼??app

var a = 1,
    b = c = 0;
function add(n){
    return n=n+3;
}
y = add(a);
function add(n){
    return n=n*5;
}
z = add(a);
console.log(y,z);
// 變量提高, y = 5; z = 5 結果爲5 5

4.閱讀如下代碼,下面的輸出是什麼??函數

function showCase(value) {
    switch(value) {
    case 'A':
        console.log('Case A');
        break;
    case 'B':
        console.log('Case B');
        break;
    case undefined:
        console.log('undefined');
        break;
    case new String('A'):
        console.log( new String('A') );
        break;
    default:
        console.log('Do not know!');
    }
}
showCase(new String('A'));
// new String('A')是一個字符串對象,沒有選項與之全等,輸出'Do not know!'。

5.如下代碼在控制檯的輸出是什麼??this

parseInt(3, 8)
parseInt(3, 2)
parseInt(3, 0)
// 把八進制的3轉換爲十進制的3;二進制中沒有3爲NaN;
// 進制數的區間[2, 36],不在範圍內爲NaN,0默認是十進制,爲3。

6.如下代碼在控制檯的輸出是什麼??prototype

["1", "2", "3"].map(parseInt)
// parseInt('1', 0)  1
// parseInt('2', 1)  NaN
// parseInt('3', 2)  NaN
// ["1", "2", "3"].map(e => parseInt(e)) 若是指定參數則結果爲[1,2,3]

7.如下代碼在控制檯的輸出是什麼??code

function fn(ary) {
  ary[0] = ary[2];
}
function bar(a,b,c) {
  c = 10
  // 實參列表爲[1, 1, 10]
  fn(arguments);
  // [10, 1, 10]
  return a + b + c;
}
bar(1,1,1)
// 21

8.如下代碼在控制檯的輸出是什麼??對象

function fn(){}
console.log(  Array.isArray(Array.prototype) ,Object.getPrototypeOf(fn) )
// 函數的原型是函數,數組的原型是數組,對象的原型是對象;
// Array.isArray(Array.prototype) => true
// Object.getPrototypeOf(fn) => fn.__proto__ = Function.prototype即一個函數

9.下面的輸出是什麼??原型鏈

(function(){
  var x = y = 1;
})();
console.log(y);  // 1
console.log(x);  // 未定義報錯
// 預編譯函數做用域中定義x,執行時y在父級做用域(全局)爲1,x爲1。執行結束x銷燬。

10.下面的輸出是什麼??作用域

if(typeof c&&-true+ (+undefined)+''){
// 'undefined' && 'NaN'
    console.log('l am ok');
}
if(22+'33'*2==88){
// 88 == 88 true
    console.log('我還能作十道');
}
!!' '+!!'' -!!false||console.log('我選擇go die');
// true+false-false => 1

11.下面的輸出是什麼??

var length = 10;
function fn(){
    console.log(this.length);
}
var  obj = {
    length:5,
    method:function(){
        console.log(this.length);    //obj.length 5
        fn();            //window.length 10            
        arguments[0]();         //arguments長度爲2        
    }
}
obj.method(fn,1)

12.下面的代碼輸出是什麼??

var a = { n:1 };        
var b = a;    
// a.n 仍是指對象{n: 1} a是{m: 1}(運算符優先級)        
a.n = a = { m:1 };
console.log(a,b)
//a => {m: 1}  b => {n: {m: 1}}

13.下面的代碼輸出是什麼??

var x = 1
if(function fn(){}){
    x += typeof fn
}
//(function fn(){})
//!function fn(){}
//+function fn(){}
//-function fn(){}
//~function fn(){}
// 函數表達式沒有名字,fn未定義
console.log(x);
// '1undefined'

14.下面的代碼輸出是什麼??

var x = 10;
function a(){
    y = function(){
        x = 2;
    }
    console.log(this); // window調用,this指向window
    return function(){
        var x = 3;
        y();  // y函數與父級函數內都沒有x,將window的x賦爲2
        console.log(this.x); // 2
    }.apply(this)
}
a();
console.log(y); // y是window中的函數

15.下面的代碼輸出是什麼??

typeof undefined=== typeof Undefined
//兩邊都是"undefined"  true

16.下面的代碼輸出是什麼??

var a={},
b={key:'b'},
c={key:'c'};

a[b]=123; // a[object Object] = 123
a[c]=456; // a[object Object] = 456
// 對象和數組的鍵名都是字符串,b和c對象轉爲字符串都是"[object Object]"
console.log(a[b])

17.下面的代碼輸出是什麼??

var out = 25,
   inner = {
        out: 20,
        func: function () {
            var out = 30;
            return this.out;
        }
    };
console.log((inner.func, inner.func)());
// (inner.func, inner.func)獲得後面的結果,自執行函數指向window, 25
console.log(inner.func());
// inner調用函數,this指向inner對象爲 20
console.log((inner.func = inner.func)());
// 25 賦值後獲得函數,而後運行; 同一,至關於var fn = inner.func; fn()

18.下面的代碼輸出是什麼??

if (!("a" in window)) { // window中是否有a屬性
    var a = 1;  // 變量提高, window中a爲undefined;若是爲let,則a不存在報錯
}
alert(a); // 'undefined'

19.下面代碼的輸出是什麼??

var fn = function test(){
    console.log('代碼執行了')
}
test()
// 語法錯誤、引用錯誤、類型錯誤,此處是引用錯誤,test未定義。

20.下面的代碼輸出是什麼??

var str = typeof typeof {name:'heaven'};
// 兩個typeof 必定是'string',str = 'string'
if( str.length==6 ){
    str.prop = '這是一波字符串';
//包裝類執行完以後,當即銷燬,因此再打印是沒有結果的,'undefined'。
}
console.log(str.prop)

21.下面的代碼輸出是什麼??

function fun(n,o) {
    console.log(o);
    return {
        fn:function(m){
            return fun(m,n);
        }
    };
}

var a = fun(0);    
// a = { fn: function(){...} }
// 打印 undefined
a.fn(1); 
// 執行a.fn(1),n爲傳進來的實參1,o爲產生閉包時的賦值0。(fun(0)執行時的AO對象,o爲0)
// 打印 0
a.fn(2); 
// 一樣執行a.fn(2),m爲傳進來的實參2,o爲產生閉包時的賦值0。
// 打印 0
a.fn(3); 
// 一樣執行a.fn(3),m爲傳進來的實參3,o爲產生閉包時的賦值0。
// 打印 0
var b = fun(0).fn(1).fn(2).fn(3);
// fun(0)執行,並返回對象{ fn: function(){...} }。打印 undefined
// fn(1)執行,n爲傳進來的實參m:1,o爲產生閉包時的賦值0。打印 0 
// fn(2)執行,n爲傳進來的實參m:2,其做用域鏈有fn(1)執行時,o的賦值1。打印 1
// fn(3)執行,n爲傳進來的實參m:3,其做用域鏈有fn(2)執行時,o的賦值2。打印 2
var c = fun(0).fn(1); 
// fun(0)執行,並返回對象{ fn: function(){...} }。打印 undefined
// fn(1)執行,n爲傳進來的實參m:1,o爲產生閉包時的賦值0。打印 0 
c.fn(2);
// fn(2)執行,n爲傳進來的實參m:2,其做用域鏈有fn(1)執行時,o的賦值1。打印 1
c.fn(3);
// fn(3)執行,n爲傳進來的實參m:3,其做用域鏈有fn(1)執行時,o的賦值1。打印 1

22.下面的代碼輸出是什麼??

var a = 1;
var b = 2[a,b] = [b,a]
// b = 2[1, undefined] = [undefined, 1]
// b = undefined = [undefined, 1]
console.log(a,b)
// 1 [undefined, 1]

23.下面的代碼輸出是什麼??

var n = 10;
var obj = {
    n : 5,
    c : a()  //c是一個函數,此時obj調用時this指向obj。
};
function a(){
    var n = 7;
    var c = function(){
        var n = 3;
        console.log(this.n)
    }
    return c;
};
obj.c()     // 5        

/*********************/
function fn(a,b,c,d){}
fn.fn = function(){
    console.log(this.length)
}
fn.fn() //一個函數的length屬性是形參個數。

24.下面的代碼輸出是什麼??

var arr = [1,3,5,7,9];
function fn(){
    this.arr = [2,4,6,8,10];
    arr.forEach( function(){
        console.log(this.arr);
    } );
}
new fn()
// 回調函數中的this通常都指向全局,遍歷全局中的arr,並打印全局中的arr
// [1, 3, 5, 7, 9]
// [1, 3, 5, 7, 9]
// [1, 3, 5, 7, 9]
// [1, 3, 5, 7, 9]
// [1, 3, 5, 7, 9]

25.下面的代碼輸出是什麼??

function test (){
    var n = 4399;
    function add(){
        n ++;
        console.log(n)
    };
    return {
        n,
        add
    }
}
var result1 = test();
// { n: 4399, add: function(){...} }
var result2 = test();
// { n: 4399, add: function(){...} }
result1.add();
// 函數執行,打印出 4400
result1.add();
// 函數執行,打印出 4401
console.log(result1.n);
// 4399
result2.add();
// 4400 
// 分別產生兩個閉包,對閉包中的n進行n ++ 操做
相關文章
相關標籤/搜索