选择题刷题JS篇(持续更新)

55 阅读14分钟

image.png

解析: JavaScript是单线程的,浏览器实现了异步的操作,整个js程序是事件驱动的,每个事件都会绑定相应的回调函数。

image.png

image.png

解析: 1、定义 (l)表示第一个分组里有l \1表示所获取的第1个()匹配的引用 /g表示全局匹配 1表示第一个分组里的值l2、所以(l)\l表示匹配两个连续字符ll,即ll(l)\l/g 表示全局匹配两个连续字符llllllstr.replace(/(l)\1/g, 1表示第一个分组里的值l 2、所以 (l)\l 表示匹配两个连续字符ll,即ll (l)\l/g 表示全局匹配两个连续字符ll即llll str.replace(/(l)\1/g, '1') 表示将ll替换成l
3、最终 Hellllo =》 Hello

image.png

解析: Ajax技术核心就是XMLHttpRequest对象。

Ajax技术的工作原理:可以分成3步

1.创建Ajax对象:var xhr = new XMLHttpRequest();

2.xhr 发送请求:xhr.open('get','test.html','true');

                          xhr.send();

3.xhr获取响应:

                          xhr.onreadystatechange = function(){

                                   if(xhr.readystate == 4){//请求的状态码

                                                       /*

                                                                   0:请求还没有建立(open执行前)

                                                                   1:请求建立了还没发送(执行了open)

                                                                    2:请求正式发送(执行了send)

                                                                   3:请求已受理,有部分数据可以用,但还没有处理完成

                                                                 4:请求完全处理完成

                                                           */

                                         alert(xhr.responseText);//返回的数据

                                     }

                             }

可以看到,send()前是open()

image.png

解析: A  var a=b=3 时a是局部变量,而b是全局变量

image.png

image.png

解析: requestAnimationFrame虽然是异步函数,但是由于i是用let定义的,每一次都会生成一个块级作用域,来把当前值和requestAnimationFrame放在这个作用域中 (仅个人理解,如有错误,请不吝赐教~)

image.png

image.png

image.png

解析:

A.严格模式下不允许未声明赋值uname = 'window';,而且严格模式下的this在函数体内不会默认指向window,而是指向undefined, 当然报错❌

B.和A同理,指向undefined。undefined.uname 当然报错❌

C.严格模式下函数参数不能同名 报错❌

D.在严格模式下,构造函数中的this指向构造函数创建的对象实例,this指向person{},但是person对象没有uname这个属性,因此为undefined

image.png

image.png

解析:

  • 十六进制颜色值满足某些条件可以简写。
    color: #FF33AA;
    上述颜色值可以进行简写,因为每两位都是重复的,完全可以省略掉一半。
    color: #f3a;
    上面是十六进制颜色值推荐简写方式。

  • 所以一共有6位或者3位。

  • 而颜色的表达可以用大写字母或者小写字母或者数字表示。所以是A-Z,a-z,0-9。符合题意的只有B。

  1. 数字、大小写字母   =>  [0-9a-fA-F]
  2. 相同时可以简写 #11bbCC | #1bC  =>   {6} | {3}

image.png

解析:

image.png

image.png

解析:

image.png

image.png

image.png

解析:

image.png

image.png

解析:

简单概括下:

    typeof(arr) 返回的是 Object

    instanceof 在跨 frame 对象构建的场景下会失效

    arr.toString 没有这种用法,正确的用法是 arr.toString() 返回的是数组的内容

D选项,toString()方法就在Object的原型对象上,数组能够继承,还在这里改this指向

image.png

解析:

image.png

image.png

解析:

A:

就是在尝试加法 乘法 之类的 会转换成原值,转换成原始值,又有两种模式: 偏字符串(首先调用tostring 如果不是原始值 会调用valueof),偏数值(首先调用valueof 如果不是原始值接着调用tostring)

B:

forEach方法按升序为数组中含有效值的每一项执行一次 callback函数,那些未初始化的项将被跳过。

new Array(10)创建的数组默认值都是undefined,所以回调函数都会被跳过。

C: 

在没有指定基数的情况下,如果字符串以"0x"或者"0X"开头, 则基数是16 (16进制)。

相当于let i = parseInt('0xA',16)

D: 

i是形参,属于局部变量,不影响全局变量i的值

image.png

解析:

更应该注意var和let,换成let输出的就是b选项。var时是函数作用域,异步函数在for循环结束后还未执行,函数作用域的i变成了5。let执行时,因为块级作用域的缘故,每一次for循环都会产生一个块级作用域

image.png

解析:

A. parseInt转换为整数,默认为10进制,结果为10 B. floor向下取整,结果为10 C. ceil向上取整,结果为11 D. number中没有split方法,结果为TypeError

image.png

image.png

image.png

解析: commonJS四个重要环境变量:require、exports、module、global

image.png

解析:

image.png

image.png

解析:

页面的性能指标详解:

白屏时间(first Paint Time)——用户从打开页面开始到页面开始有东西呈现为止

首屏时间——用户浏览器首屏内所有内容都呈现出来所花费的时间

用户可操作时间(dom Interactive)——用户可以进行正常的点击、输入等操作,默认可以统计domready时间,因为通常会在这时候绑定事件操作

总下载时间——页面所有资源都加载完成并呈现出来所花的时间,即页面 onload 的时间

image.png

image.png

image.png

解析:

  • 一个promise可能有三种状态:等待(pending)、已完成(fulfilled)、已拒绝(rejected)

  • 一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换

  • promise必须实现then方法(可以说,then就是promise的核心),而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致

  • then方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用。同时,then可以接受另一个promise传入,也接受一个“类then”的对象或方法,即thenable对象。

image.png

image.png

image.png

解析: C:闭包可以访问其他函数内部变量的函数,而立即执行函数穿参,相当于父级变量;闭包需要手动执行,不能自主释放内存;而立即执行函数相当于做了一次函数执行,最后释放内存。逻辑上立即执行函数可以理解为:声明闭包函数-执行-释放内存

立即执行函数(IIFE)不是一种闭包,它只是函数的一种调用方式,和闭包没有必然的联系,两者经常结合着一起使用,但两者的本质并不同。

A 答案不严谨,闭包只会保存被子作用域使用到的变量,未被使用的变量仍会被回收

image.png

解析: JavaScript高级程序设计上面的原话:RegExp 对象的主要方法是 exec(),该方法是专门为捕获组而设计的。 exec()接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回 null。

image.png

image.png

解析:

image.png

image.png

解析:

一、try catch 还有finally的用法😊


1、try catch 还有finally的基本概念

1)try块一共有三个关键字try catch 还有finally;

2)finally 语句无论 try 和 catch 执行结果如何都会执行;(本题考到的知识点)

3)catch是捕获到 try语句块里的错误才会执行;

注意: catch 和 finally 语句都是可选的,但你在使用 try 语句时必须至少使用一个(也就是try必须搭配catch或者finally)。

2、try catch 还有finally代码块中 有return时 的执行情况(本题考到的知识点)

例一:

        如果try语句没有使用finally,则返回try语句中return的东西,

        函数try...catch语句之外的return 就不执行了

复制代码

1234567891011 ``function testFinally() {``     ``var num = 10;``     ``try {``         ``return num + 1;``//return这里的值11``     ``} ``catch (err) {``         ``console.log(err)``     ``}``     ``return num + 5; ``//无效,没执行到这,try...catch执行之后就跳出了``                     ``//除非try...catch...finaly语句中没有return`` ``}`` ``console.log(testFinally());``//11

例二:

        如果try语句后面有finally,try中的return不会跳出函数,因为一定要进入finally语句

        函数try...finally语句之外的return 就不执行了

function testFinally() {
    var num = 10;
    try {
        return num += 1//return右边的语句正常执行,计算得num=11
    } finally {        //有finally,try中的return不会跳出函数,因为一定要进入finally语句
        return num + 20//11+20=31
    }
    return num + 5//无效,没执行到这,try...finally执行之后就跳出了
}
console.log(testFinally());// 31

例三:(可看完后面的break知识点,再来看这个例子)
如果try语句后面有finally,try中就算有break用来跳出语句块,也不管用
只要有finally,不管try和catch语句中执行什么,一定会进入finally语句

function testFinally() {
    var num = 10;
    aaatry{
        break aaa; //有break按理说应该要跳出 try...finally... 这个语句块了
                   //但是不管用,因为后面有finally,一定要进入finally语句
    } finally {         
        return num + 20//10+20=30
    }
    return num;//失效,没执行到这
}
console.log(testFinally());// 30

重点记住:try...catch...finally语句中,只要有finally存在

二、break 的用法😄


1、break语句用于跳出 switch语句 或者 循环语句( for 、for..in、while、do...while) 

   语法:break;

1)当break语句用于switch语句时,会跳出switch代码块,终止执行switch代码。

2)当break语句用于循环语句时,会跳出整个循环,不再执行后续剩余的循环。

3)注意break与continue的区别:continue会跳出本轮循环,继续执行后续剩余的循环

2、break语句也可用于标签引用,用于跳出标签指向的代码块。(本题考到的知识点)

   语法:break labelName;

例一:

        在标签引用中使用 break 语句,用于跳出标签代码块:

var cars = ["BMW""Volvo""Saab""Ford"];
var text = "";
list: { //list标签引用
    text += cars[0];
    text += cars[1];
    text += cars[2];
    break list; //在标签引用中使用 break 语句,用于跳出list代码块,不再执行list代码块里剩余的代码
    text += cars[3];
}
console.log(text);//BMW Volvo Saab

例二:

        在标签引用中使用 break 语句,用于跳出嵌套循环:

var text = "";
var i, j;
 
Loop1: for (i = 0; i < 3; i++) { // 第一个循环标签 "Loop1"
    Loop2: for (j = 10; j < 15; j++) {// 第二个循环标签 "Loop2"
        if (j == 12) {
            break Loop2;//跳出Loop2代码块
        }
        console.log(i, j)
    }
}
//i=0,j=10
//i=0,j=11
//i=1,j=10
//i=1,j=11
//1=2,j=10
//i=2,j=11

三、本题过程😁

var i = 100;
function foo() {     //bbb 是 try... finally...这个代码块
    bbbtry {        //break语句的标签引用,用于跳出 bbb标签 代码块
        console.log("position1");//打印position1
        return i++;  } //继续执行return右边的代码,此时i++为100,i为101
    finally {                //只要有finally,不管try语句里写啥(return,break之类的失效),都会执行finally语句
        break bbb;     //跳出bbb标签代码块
    }                   //跳出try...finally后,因为finally中没有return,故可执行后续代码
                           //如果finally中有return,则无法执行后续代码了
    console.log("position2");//打印position2
    return i;//返回i,i=101
}
foo();

image.png

解析: ①Js是单线程的,Settimeout是异步宏任务,所以代码执行遇到异步的,就放在事件队列中的,等线程中的任务执行完后才会执行事件队列中的任务。② let是es6中声明变量的方式,有自己的作用域块,可以放变量,所以let绑定for循环时,每个i都有自己的值. 在这个for循环中就是满足一次条件向事件队列中添加一个打印i的事件,且每个事件中的i有自己的值 ③Var没有作用域块,for循环的变量就会后一个覆盖前一个,当循环完毕时i就只有一个值,又因为for循环的判断条件是不满足跳出,所以i最后是2而不是1 ④这些完了后执行事件队列中的任务,就打印了0122

image.png

解析:

void是一元运算符,它出现在操作数之前,操作数可以是任意类型,操作数会照常计算,但忽略计算结果并返回undefined。由于void会忽略操作数的值,因此在操作数具有副作用的时候使用void来让程序更具语义

console.log(void 0); // undefined

console.log(void(0)); // undefined

常见的作用:

1.替代undefined

由于undefined并不是一个关键字,其在IE8-浏览器中会被重写,在高版本函数作用域中也会被重写;所以可以用void 0 来替换undefined

var undefined = 10;

console.log(undefined);//IE8-浏览器下为10,高版本浏览器下为undefined

function test(){

    var undefined = 10;

    console.log(undefined);

}

console.log(test());//所有浏览器下都是10

2.客户端URL

这个运算符最常用在客户端URL——javascript:URL中,在URL中可以写带有副作用的表达式,而void则让浏览器不必显示这个表达式的计算结果。例如,经常在HTML代码中的标签里使用void运算符

<a href="javascript:void window.open();">打开一个新窗口</a>

3.阻止默认事件 

阻止默认事件的方式是给事件置返回值false

//一般写法

<a href="example.com" onclick="f();return false;">文字</a>

使用void运算符可以取代上面写法

<a href="javascript:void(f())">文字</a>

所以答案是A。

image.png

解析: 个人记忆方法:6(编码相关)+ 2(数据处理)+ 4(数字相关)+ 1(特殊)

编码相关:     escape()、unescape()、encodeURI()、decodeURI()、     encodeURIComponent()、decodeURIComponent()

数据处理:     Number()、String()

数字相关:     isFinite()、isNaN()、parseFloat()、parseInt()

特殊:     eval()

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

解析: Node 中的“微任务(microtasks)其实是一个统称,包含了两部分:

  • process.nextTick() 注册的回调 (nextTick task queue)
  • promise.then() 注册的回调 (promise task queue)

Node 在执行微任务时, 会优先执行 nextTick task queue 中的任务,执行完之后会接着执行 promise task queue 中的任务。所以如果 process.nextTick 的回调与 promise.then 的回调都处于主线程或事件循环中的同一阶段, process.nextTick 的回调要优先于 promise.then 的回调执行。

image.png

解析:getElementsByClassName

image.png

解析:

image.png

image.png

image.png

解析:

// 1. isNaN()函数用来判断一个数是否是NaN;
// 只有一个值是NaN或者能被转换为NaN的时候才返回true 
console.log(isNaN('e'));//true,因为e可以被转换为NaN 
console.log(isNaN('11'));//false,因为字符串可以被转换为数字,不能被转为NaN 
console.log(isNaN(null));//false,因为null可以被转换为0,不能被转为NaN 
console.log(isNaN(NaN));// true,NaN返回true

// 2. parseInt(string,raix)函数有两个参数
// 2.1 注意:string字符串只会被解析从第一个字符开始直到不是数字的字符部分
console.log(parseInt('223'));//223
// 2.2 当字符串中间存在非数字,那么就只解析前面是数字的部分字符
console.log(parseInt('22e3'));//22
// 2.3 如果字符串中第一个字符就不是数字,那么返回NaN 
console.log(parseInt('e21'));//NaN

// 对于parseInt()函数还有一个易考点,就是利用数组的下标,还记得parseInt()函数的第二个参数吗?
// 2.4 parseInt()函数的第二个参数指的就是进制,这个参数小于2或者大于36的时候,都会返回NaN 
console.log(parseInt(1,1));//NaN ,因为第二个参数是1表示1进制<2,所以错误
console.log(parseInt(1,2));//1,因为表示二进制 =2,在范围内
// 2.5 我们一般都是省略这个参数的,这个时候就是默认为10进制
console.log(parseInt(99));//99
// 2.6 我们第二个参数使用0的时候也是使用十进制
console.log(parseInt(99,0));//99
// 2.7 如果第一个参数前缀使用0x/0X则表示使用16进制
console.log(parseInt(0x99));//153=169+9
console.log(parseInt(0x99,10));//如果第一个参数使用了0x表示十六进制,那么第二个参数设置了值也无效

// 2.8 看一个实例,对于数组
var arr=[1,2,3,2,5];
console.log(arr.map(parseInt));//[1, NaN, NaN, 2, NaN]
// arr.map方法就是对于数组arr里面的每一项都去使用方法里面的函数,最后返回新数组
// 因为map方
**有索引,所以实际上就是 
parseInt(1,0);//1,因为0表示十进制
parseInt(2,1);//1进制<2,所以错啦!
parseInt(3,2);// 2进制,但是3不在0——2范围内(3应该改为11),所以不符合2进制要求
parseInt(2,3);//符合,因为三进制是0-3,而2在范围内
parseInt(5,4);//4进制不包括5,所以NaN

image.png

image.png

image.png

image.png

解析: 不支持冒泡:妈(mouseenter)妈(mouseleave)不(blur)放(focus)心你(load,unload,resize) 妈(mouseenter)妈(mouseleave)不(blur)(unload)让(resize)浪(load)费(focus)

image.png

解析: 链接:www.nowcoder.com/questionTer…
来源:牛客网

1.instanceof运算符希望左操作数是一个对象,右操作数表示对象的类(初始化对象的构造函数)。如果左侧的对象是右侧对象的实例,返回true,否则返回false。

例如:计算o instanceof f  

首先计算f.prototype,然后在原型链中查找o,找到返回true

2.===严格相等运算符:首先计算其操作数的值,然后比较这两个值,比较过程中没有任何类型转换

3.==相等运算符:如果两个操作数不是同一类型,那么会尝试进行一些类型转换,然后进行比较

(1)尽管null和undefined是不同的,但它们都表示“值的空缺”,两者往往可以互换,因此==运算符认为两者是相等的

(2)NaN表示非数字值,特殊之处:它和任何值都不相等,包括自身。判断NaN的方法:x!=x返回true

image.png

解析:

image.png

image.png

解析:

^ 匹配输入字符串的开始位置。在这里也就是要求1开始。 [0-9]{10}+ [0-9]匹配0~9之间的数字,{10}重复10次。
$  匹配输入字符串的结尾位置。

image.png

解析:

首先,前面+是一元运算符,相当于我们说的正负,无运算效果,但是可以将字符串等转为number类型。  

 此题中017其实是八进制,故而是是Array(15)。  

这里相当于对于一个未赋值但是长度为15的数组进行number类型转化,其结果为NaN

image.png

image.png

解析: ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)。

原生具备 Iterator 接口的数据结构如下。

  • Array
  • Map
  • Set
  • String
  • TypedArray
  • 函数的 arguments 对象
  • NodeList 对象

image.png

解析:

isNaN(NaN); // true---------->Number(NaN)--> NaN
isNaN("abc") // true---------->Number("abc")--> NaN
isNaN("123") // false--------->Number("123")--> 123
isNaN(true) // false----------->Number(true)-->1
isNaN(false) // false---------->Number(false)-->0

eval:返回字符串表达式中的值

unEscape:返回字符串ASCI码

escape:返回字符的编码

parseFloat:返回实数

image.png

解析:eval 将会返回对最后一个表达式的求值结果。

image.png

解析:

image.png

链接:<https://www.nowcoder.com/questionTerminal/dd2855b9d3ff4e19aa688ad7d0bcf23f>  

来源:牛客网

知识点扩展:

**for ...in ...可以把原型对象身上的属性遍历出来
**

Object.keys()不能把原型对象身上的属性遍历出来

**
**

**
**

1)属性描述对象

JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。

这个内部数据结构称为“属性描述对象”(attributes object)

2)属性描述对象的6个元属性:

  • value:设置该属性的属性值,默认值为undefined
  • writable:表示能否修改属性的值,也就是说该属性是可写的还是只读的,默认为true(可写)
  • enumerable:表示改属性是否可遍历,默认为true(可遍历)
  • configurable:表示能否通过 delete 删除属性、能否修改属性的特性,或者将属性修改为访问器属性,默认为true(可配置)
  • get:get是一个函数,表示该属性的取值函数(getter),默认为undefined
  • set:get是一个函数,表示该属性的存值函数(setter),默认为undefined

configurable  如果设为false,将阻止某些操作改写该属性,比如无法删除该属性,也不得改变该属性的属性描述对象(value属性除外

image.png

解析:

image.png

image.png

image.png

解析: match() 方法将检索字符串 stringObject,以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。

如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性。index 属性声明的是匹配文本的起始字符在 stringObject 中的位置,input 属性声明的是对 stringObject 的引用。

如果 regexp 具有标志 g,则 match() 方法将执行全局检索

  • 号是零次或多次 ,会出现["", "", "b", "", "", "", "bb", "", "", "", "bbb", "", "", "", "bbbb", "", "", "", ""]

image.png