十道js基础题(附带解析)

72 阅读5分钟

10道JS题目

1.下列结果正确的是 ["1", "2", "3"].map(parseInt)( )

A. ["1", "2", "3"] B. [1, 2, 3] C. [0, 1, 2] D. 都不对

分析:D

Map的作用是对数组内的每个元素分别执行所给函数,并返回一个新数组,Map内部执行回调函数,该回调函数存在三个参数,即:item(当前元素),idx(当前下标),arr(数组本身); parseInt是将一个字符串类型的数字(可转换部分)转换为数字类型,该方法有两个参数 1.需要被转换的值;2.需要转换的数制 当parseInt作为回调函数不传参直接使用的时候,默认将map的前两个参数进行传递,即item和idx,所以该式子就变成了如下形式

["1", "2", "3"].map(parseInt(item,idx))
["1", "2", "3"].map(parseInt("1",0)); //1。当第二项参数为0时,默认转换为undefined即无参,就会按照parseInt的默认十进制进行转换。
["1", "2", "3"].map(parseInt("2",1)); //NaN 没有一进制的存在。
["1", "2", "3"].map(parseInt("3",2)); //NAN 二进制内不包含3。

2.下列结果正确的是[typeof null, null instanceof Object]()

A. ["object", false] B. [null, false] C. ["object", true]; D. other

分析:A

typeof是一种比较弱的检测数据类型的方式,他会检测内存中前四位地址,由于Object和Array和null的前四位都为0000,所以在typeof中,他们都显示为object类型

instanceof作为一种强数据类型检测,就不会出现 null为object的情况

typeof数据类型可能出现的情况:

typeof1// String;
typeof 1 // Number;
typeof [] //object;
typeof {} // object;
typeof null // object;
typeof undefined //undefined;

3.以下代码块结果是什么? ( )

var name = 'World!';
(function () {
    if (typeof name === 'undefined') {
        var name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
})();

A. Goodbye Jack B. Hello Jack C. Hello undefined D. Hello World

分析:A

function是一个iife,且内部声明的name为局部变量,函数会优先调用内部声明的变量,在使用var声明符时会进行变量提升,作用域内执行顺序如下:

var name = 'World!';
(function () {
    var name
    if (typeof name === 'undefined') {
        name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
})();

由于name变量生命被提升到了函数最顶层,且暂时还未被赋值,所以此时的name值为undefined,触发了if判断条件,name被赋值为Jack。

4.这个表达式的结果是什么?()

var arr= [0,1,2];
arr[10] = 10;
arr.filter(function(x) { return x === undefined;});

A. [undefined × 7] B. [0, 1, 2, 10] C. [] D. [undefined]

分析:C

filter是数组的方法,作用是过滤满足条件的元素,并返回。那么这句话的意思就是,将数组内值为undefined的进行过滤并返回。

arr[10]将数组内的第10位赋值位10,如果长度不足时,则对数组进行填充,但这里要注意了,填充的值为empty而不是undefined,所以这道题选C

5.[]==[]结果为?() A.trueB.falseC.errorD.other

分析:B

引用类型以地址的形式存放在栈内存中,该地址指向一个堆内存,虽然表面上看着两个引用类型是内容是一致的,但他们所存放的地址不一样,所以引用类型不相等

6.[1 < 2 < 3, 3 < 2 < 1] 的结果为? ( )

A. [true, true]

B. [true, false]

C. error

D. other

分析:A

这里考察的是隐式转换,表达式在没有括号包裹的情况下,默认从左往右依次执行,分析如下:

[1 < 2 < 3] // 先计算1 < 2 为true
[true < 3] // true隐式转换为1, 1 < 3 所以输出为true
​
[3 < 2 < 1] //先计算 3 < 2 为false
[false < 1] //false隐式转换为0,0 < 1 所以输出为true

7.以下代码运行结果是?( )

var obj={
    num:3,
    add:function(){
        this.num++;
        (function(){
            console.log(this.num);
            this.num = 5;
        })();
        this.num = 6;
    }
  };
obj.add();

A. 4 B. 5 C. 6 D. undefined

分析:D

这里考察的是this的指向,谁调用this就指向谁

var obj={
    num:3,
    add:function(){
        this.num++;
        (function(){
            console.log(this.num);
            this.num = 5;
        })();
        this.num = 6;
    }
  };
obj.add(); 
//obj调用了add方法,那么此时add内部的this指向了obj,即this.num++这句话的this指向了obj的num就是3;
//但是add内部存在一个iife,iife调用的时候没有明确指向,那么此时的this指向了window对象。
//又因为window对象上没有名叫num的变量,所以此时的num为undefined,console的结果是undefined

8.[!!Array.hasOwnProperty , Array.hasOwnProperty(toString),[1,2,3] instanceof Object, typeof [1,2,3] === Array] 以下结果正确的是?( )

A. [true,true,false,false] B. [true,false,true,false] C. [false,true,false,true] D. [true,false,false,true]

分析:B

hasOwnProperty是检测属性是否为对象的自有属性,Array是构造函数但它也是一个对象,所以结果为true,两次取反结果仍为true。

Array.hasOwnProperty // ƒ hasOwnProperty() { [native code] }

toString方法是Object的方法,所以该条语句为false。

数组既是数组也是对象 所以该条语句为true

[1,2,3] instanceof Object // true;
[1,2,3] instanceof Array // true

tyoepf的结果只有 undefined,String,Number,Object. 所以该条语句为false

9.[Function.prototype === Object.__proto__ ,Object.prototype.isPrototypeOf(Function)] 以下结果正确的是?( )

A. [true,true] B. [true,false] C. [false,true] D. [false,false]

分析:A

所有的构造函数都是Function的实例化

Object是Function的实例化,所以原型指向Function

所有的prototype都是对象,都是Object的实例

10.以下代码运行结果是?()

(function(){
      var x = y = 1;
})();
console.log(y);
console.log(x);

A. 1 , 1 B. 1, undefined C. undefined , 1 D. 1, error

分析:D

这里考察隐式声明和作用域,function是一个iife,其内部解析如下:

//赋值操作是右查询,从右往左执行。
var y;
(function(){
      var x ;
      y = 1;
      x = y;
})();
//首先y在函数内部没有被声明,那么y就会在函数外部全局隐式声明一个y
console.log(y);  //由于y在全局进行了隐式声明并赋值为1,所以这里输出1
console.log(x); //由于x是在函数内部被声明,作为私有变量无法被外部访问,并且全局上没有变量X的声明,所以这里会报错