解析: JavaScript是单线程的,浏览器实现了异步的操作,整个js程序是事件驱动的,每个事件都会绑定相应的回调函数。
解析:
1、定义
(l)表示第一个分组里有l
\1表示所获取的第1个()匹配的引用
/g表示全局匹配
1') 表示将ll替换成l
3、最终
Hellllo =》 Hello
解析: 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()
解析: A var a=b=3 时a是局部变量,而b是全局变量
解析: requestAnimationFrame虽然是异步函数,但是由于i是用let定义的,每一次都会生成一个块级作用域,来把当前值和requestAnimationFrame放在这个作用域中 (仅个人理解,如有错误,请不吝赐教~)
解析:
A.严格模式下不允许未声明赋值uname = 'window';
,而且严格模式下的this在函数体内不会默认指向window,而是指向undefined, 当然报错❌
B.和A同理,指向undefined。undefined.uname 当然报错❌
C.严格模式下函数参数不能同名 报错❌
D.在严格模式下,构造函数中的this指向构造函数创建的对象实例,this指向person{},但是person对象没有uname这个属性,因此为undefined
解析:
-
十六进制颜色值满足某些条件可以简写。
color: #FF33AA;
上述颜色值可以进行简写,因为每两位都是重复的,完全可以省略掉一半。
color: #f3a;
上面是十六进制颜色值推荐简写方式。 -
所以一共有6位或者3位。
-
而颜色的表达可以用大写字母或者小写字母或者数字表示。所以是A-Z,a-z,0-9。符合题意的只有B。
- 数字、大小写字母 => [0-9a-fA-F]
- 相同时可以简写 #11bbCC | #1bC => {6} | {3}
解析:
解析:
解析:
解析:
简单概括下:
typeof(arr) 返回的是 Object
instanceof 在跨 frame 对象构建的场景下会失效
arr.toString 没有这种用法,正确的用法是 arr.toString() 返回的是数组的内容
D选项,toString()方法就在Object的原型对象上,数组能够继承,还在这里改this指向
解析:
解析:
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的值
解析:
更应该注意var和let,换成let输出的就是b选项。var时是函数作用域,异步函数在for循环结束后还未执行,函数作用域的i变成了5。let执行时,因为块级作用域的缘故,每一次for循环都会产生一个块级作用域
解析:
A. parseInt转换为整数,默认为10进制,结果为10 B. floor向下取整,结果为10 C. ceil向上取整,结果为11 D. number中没有split方法,结果为TypeError
解析: commonJS四个重要环境变量:require、exports、module、global
解析:
解析:
页面的性能指标详解:
白屏时间(first Paint Time)——用户从打开页面开始到页面开始有东西呈现为止
首屏时间——用户浏览器首屏内所有内容都呈现出来所花费的时间
用户可操作时间(dom Interactive)——用户可以进行正常的点击、输入等操作,默认可以统计domready时间,因为通常会在这时候绑定事件操作
总下载时间——页面所有资源都加载完成并呈现出来所花的时间,即页面 onload 的时间
解析:
-
一个promise可能有三种状态:等待(pending)、已完成(fulfilled)、已拒绝(rejected)
-
一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换
-
promise必须实现then方法(可以说,then就是promise的核心),而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致
-
then方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用。同时,then可以接受另一个promise传入,也接受一个“类then”的对象或方法,即thenable对象。
解析: C:闭包可以访问其他函数内部变量的函数,而立即执行函数穿参,相当于父级变量;闭包需要手动执行,不能自主释放内存;而立即执行函数相当于做了一次函数执行,最后释放内存。逻辑上立即执行函数可以理解为:声明闭包函数-执行-释放内存
立即执行函数(IIFE)不是一种闭包,它只是函数的一种调用方式,和闭包没有必然的联系,两者经常结合着一起使用,但两者的本质并不同。
A 答案不严谨,闭包只会保存被子作用域使用到的变量,未被使用的变量仍会被回收
解析: JavaScript高级程序设计上面的原话:RegExp 对象的主要方法是 exec(),该方法是专门为捕获组而设计的。 exec()接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回 null。
解析:
解析:
一、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;
aaa: try{
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...这个代码块
bbb: try { //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();
解析: ①Js是单线程的,Settimeout是异步宏任务,所以代码执行遇到异步的,就放在事件队列中的,等线程中的任务执行完后才会执行事件队列中的任务。② let是es6中声明变量的方式,有自己的作用域块,可以放变量,所以let绑定for循环时,每个i都有自己的值. 在这个for循环中就是满足一次条件向事件队列中添加一个打印i的事件,且每个事件中的i有自己的值 ③Var没有作用域块,for循环的变量就会后一个覆盖前一个,当循环完毕时i就只有一个值,又因为for循环的判断条件是不满足跳出,所以i最后是2而不是1 ④这些完了后执行事件队列中的任务,就打印了0122
解析:
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。
解析: 个人记忆方法:6(编码相关)+ 2(数据处理)+ 4(数字相关)+ 1(特殊)
编码相关: escape()、unescape()、encodeURI()、decodeURI()、 encodeURIComponent()、decodeURIComponent()
数据处理: Number()、String()
数字相关: isFinite()、isNaN()、parseFloat()、parseInt()
特殊: eval()
解析: 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 的回调执行。
解析:getElementsByClassName
解析:
解析:
// 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
解析: 不支持冒泡:妈(mouseenter)妈(mouseleave)不(blur)放(focus)心你(load,unload,resize) 妈(mouseenter)妈(mouseleave)不(blur)(unload)让(resize)浪(load)费(focus)
解析:
链接: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
解析:
解析:
^ 匹配输入字符串的开始位置。在这里也就是要求1开始。
[0-9]{10}+ [0-9]匹配0~9之间的数字,{10}重复10次。
$ 匹配输入字符串的结尾位置。
解析:
首先,前面+是一元运算符,相当于我们说的正负,无运算效果,但是可以将字符串等转为number类型。
此题中017其实是八进制,故而是是Array(15)。
这里相当于对于一个未赋值但是长度为15的数组进行number类型转化,其结果为NaN
解析: ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)。
原生具备 Iterator 接口的数据结构如下。
- Array
- Map
- Set
- String
- TypedArray
- 函数的 arguments 对象
- NodeList 对象
解析:
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:返回实数
解析:eval 将会返回对最后一个表达式的求值结果。
解析:
链接:<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属性除外
解析:
解析: match() 方法将检索字符串 stringObject,以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。
如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性。index 属性声明的是匹配文本的起始字符在 stringObject 中的位置,input 属性声明的是对 stringObject 的引用。
如果 regexp 具有标志 g,则 match() 方法将执行全局检索
-
号是零次或多次 ,会出现["", "", "b", "", "", "", "bb", "", "", "", "bbb", "", "", "", "bbbb", "", "", "", ""]