运行结果是[f(),f(),f()]
1
2
3
4
5
6
7
8
9
10
11function test (){
var num = []
var i
for (i = 0; i < 3; i++) {
num[i] = function () {
console.log(i)
}
}
return num
}
console.log(test())js和object-c是动态语言
call和apply(只是参数列表不一样,非严格模式下传递null则使用全局对象,this也叫上下文,apply可以将数组转换为参数列表集合)
window.open(“url”,name)可以打开新窗口
加减乘除和求余运算会将非number转换为number之后运算,’30’%8,但是加法运算会变成拼接
加减乘除运算,引用类型会调用toString方法之后运算,对象转换为[object Object],数组转换为’’ 基本类型除了字符串相加会调用Number转换数据true为1,”30”%9正常运算,null转换为0,undefined转换为NaN,因为字符串运算优先级高,所以和他运算的都会变成字符串
js定义变量可以用_和$
以下操作只会产生黑色,因为js线程和gui线程相互阻塞,js执行完微任务之后才渲染
1
2
3
4
5document.getElementById('btn').style = 'background: blue';
document.getElementById('btn').style = 'background: red';
Promise.resolve().then(() => {
document.getElementById('btn').style = 'background: black';
})字符串.search()返回第一个索引
函数提升优先级高于变量提升,且不会被同名变量声明覆盖,但是会被变量赋值后覆盖。在本题中,函数a和同名变量a会先进行提升,之后变量a又被赋值为10,再输出a的typeof值,此时a的值为10,类型为number,A选项正确。
这里考的是JS的运行机制! 事件(click,focus等等),定时器(setTimeout和setInterval),ajax,都是会触发异步,属于异步任务;js是单线程的,一个时间点只能做一件事,优先处理同步任务; 按照代码从上往下执行,遇到异步,就挂起,放到异步任务里,继续执行同步任务,只有同步任务执行完了,才去看看有没有异步任务,然后再按照顺序执行! 这里for循环是同步任务,onclick是异步任务,所以等for循环执行完了,i变成4了,注意:这里因为i是全局变量,最后一个i++,使得i为4(后面的onclick函数,最后在循环外面执行,不受i<length限制); 所以for循环每执行一次,onclick事件函数都会被挂起一次,共4次; for循环结束后,点击事件 触发了4个onclick函数,接着输出4个4! 对大家有用的话,希望点个赞👍!
1
2
3
4
5
6
7
8
9
10链接:https://www.nowcoder.com/questionTerminal/da4115e308c948169a9a73e50d09a3e7
来源:牛客网
var elements=document.getElementsByTagName('li');
var length=elements.length;
for(var i=0;i<length;i++){
elements[i].onclick=function() {
alert(i);
}
}iframe本质不是是动态语言的Incude机制和利用ajax动态填充内容,他根本不是动态语言,也没有加载和填充,就是一个标签引入别的框架和样式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18链接:https://www.nowcoder.com/questionTerminal/18eb5039ac4541d585f9f175574b3ab5
来源:牛客网
1、创建比一般的 DOM 元素慢了 1-2 个数量级
iframe 的创建比其它包括 scripts 和 css 的 DOM 元素的创建慢了 1-2 个数量级,使用 iframe 的页面一般不会包含太多 iframe,所以创建 DOM 节点所花费的时间不会占很大的比重。但带来一些其它的问题:onload 事件以及连接池(connection pool)
2、阻塞页面加载
及时触发 window 的 onload 事件是非常重要的。onload 事件触发使浏览器的 “忙” 指示器停止,告诉用户当前网页已经加载完毕。当 onload 事件加载延迟后,它给用户的感觉就是这个网页非常慢。
window 的 onload 事件需要在所有 iframe 加载完毕后(包含里面的元素)才会触发。在 Safari 和 Chrome 里,通过 JavaScript 动态设置 iframe 的 SRC 可以避免这种阻塞情况
3、唯一的连接池
浏览器只能开少量的连接到 web 服务器。比较老的浏览器,包含 Internet Explorer 6 & 7 和 Firefox 2,只能对一个域名(hostname)同时打开两个连接。这个数量的限制在新版本的浏览器中有所提高。Safari 3+ 和 Opera 9+ 可同时对一个域名打开 4 个连接,Chrome 1+, IE 8 以及 Firefox 3 可以同时打开 6 个
绝大部分浏览器,主页面和其中的 iframe 是共享这些连接的。这意味着 iframe 在加载资源时可能用光了所有的可用连接,从而阻塞了主页面资源的加载。如果 iframe 中的内容比主页面的内容更重要,这当然是很好的。但通常情况下,iframe 里的内容是没有主页面的内容重要的。这时 iframe 中用光了可用的连接就是不值得的了。一种解决办法是,在主页面上重要的元素加载完毕后,再动态设置 iframe 的 SRC。
4、不利于 SEO
搜索引擎的检索程序无法解读 iframe。另外,iframe 本身不是动态语言,样式和脚本都需要额外导入。综上,iframe 应谨慎使用。true && 1结果是1不是true
array. sort(sortFunction)是按照sortFunction结果大小排序。 一言不合先把比较的对象定义在数组上方,再手工分析 class Untitled { public static void main(String[] args) { //4 2 0 1 3 7 var array=[-1,1,3,4,6,10]; array.sort((a,b)=>Math.abs(a-3)-Math.abs(b-3)); System.out.println(array); } } 发现最小的是算好后的第三个数字,对应原数组原位置上面是,3。看看选项中只有一个是以3排在前面的数组。好了,后面的不用比了。就是C
加号优先级高于 三目运算。低于括号。 所以括号中无论真假 加上前边的字符串都为 TRUE 三目运算为TRUE是 输出 define
1
console.log('Value is ' + (val != '0') ? 'define' : 'undefine');
Object.prototype.toString.call([])可以判断数组类型
commonjs在变量的头尾穿插了很多内置变量
通过hasOwnProperty可判断一个对象以及其原型链上是否具有指定名称的属性
```js
链接:https://www.nowcoder.com/questionTerminal/cd2be232e64340adbacdca85410a2517
来源:牛客网以下关于JavaScript的描述中错误的是
在原型上扩展的可枚举方法,会被for in循环出来
使用object.defineProperty可向对象添加或者修改属性
每个对象都有prototype属性,返回对象类型原型的引用
通过hasOwnProperty可判断一个对象以及其原型链上是否具有指定名称的属性
原型链是JS实现继承的一种模型
For循环是按顺序的,for in 循环是不一定按顺序的B:使用object.defineProperty可向对象添加或者修改属性
这里是小写的object而非Object,所以错误。C: 每个对象都有prototype属性,返回对象类型原型的引用
var obj = Object.create(null)
console.log(obj)
如果使用 chrome 浏览器控制台输入上面代码,可以看到打印了一个空对象,展开看到No Properties,而随便自己用字面量声明一个对象,都能看到proto属性。所以,不是每个对象都有prototype属性。后面这句,严格来说是不是每个对象都会返回Object.prototype?,但实际应该是这个对象的原型的引用,加个“类型”是什么意思,所以这个选项考点到底是第一句话还是第二句话?
D: 通过hasOwnProperty可判断一个对象以及其原型链上是否具有指定名称的属性
1
2
3
4
5
6
7
8
920. amd和cmd是浏览器端的开发规范,目的是要解决模块加载时间过长会阻塞页面渲染和js执行,amd是异步模块加载规范,cmd是commonjs模式和amd的集合体是就近模块加载
21. onblur失去焦点,onkeydown是键盘按键,onfocus是聚焦,mousedown鼠标事件
22. ```js
for(var i=0;i<2;i++){
(function (i){setTimeout(function(){
console.log(i)
},0)})(i)
}
//闭包内部函数保存了外部函数的引用splice会修改原数组,concat,map,sort会返回原数组
window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行
```js
for(let i = 0; i < 5; i++){requestAnimationFrame(() => console.log(i));
}
// let使用块级作用域,会声明五个变量并保存在作用域中1
2
3
4
5
6
7
8
9
10
11
12
13
1426. 闭包,每次调用函数返回新函数都会开辟新的内存空间,变量彼此隔离
```js
function Foo() {
var i = 0;
return function() {
console.log(i++);
}
}
var f1 = Foo(),
var f2 = Foo();
f1();
f1();
f2();url如果有空格可能会产生数据丢失,所以用encodeURLComponent能将字符转义为16进制编码,decodeURLComponent会将编码后的结果解析成正常字符
```js
● 首先, js有变量提升和函数提升,指的是用 var声明变量 或用 function 函数名(){ } 声明的,会在 js预解析 阶段提升到顶端;(es6的let 和 const 不会提升)
● 其次,函数提升优先级 高于 变量提升
● 注意, 相同作用域时声明变量而不赋值则还是以前的值, 而子作用域声明不赋值则函数内该值为undefined,因为声明了私有变量var a;
a();
function a() {
console.log(a);
}1
2
3
4
529. 对于正则表达式 /(l)\1/g,其中(l)是第一个分组,\1指向第一个分组,即\1重复了第一个分组的内容,所以该正则表达式可以表示成/(ll)/g ,而对于第二个参数$1,表示用第一个分组的内容 l 对匹配到的部分进行替换(即 ll 替换成 l ),同时正则表达式有g表示全局匹配,所以4个ll被替换成2个ll。
```js
var str = "Hellllo world";
str = str.replace(/(l)\1/g, '$1');java前身是oak
class为es6关键字,在jsx中需要用className表示html中的class
当类中一个属性只有get()方法而无set()方法时,该属性是无法进行赋值的,连构造方法中的初始化都不行,因此,当对象的price属性在构造方法中进行初始化,会抛出异常。
1
2
3
4
5
6
7
8
9
10class Phone{
constructor(price){
this.price = price;
}
get price(){
return 999;
}
}
var p = new Phone(888);
console.log(p.price);```js
push,pop,shift,unshift,splice,sort,foreach这些功能专一的,使用时不需要返回值的会在原数据修改,而那些功能性函数filter,concat,slice,map不会改变原数组
会改变数组的方法:
push()
pop()
shift()
unshift()
splice()
sort()
reverse()
forEach()
不会改变数组的方法:
filter()
concat()
slice()
map()1
2
3
4
5
6
7
8
9
10
11
12
13
1434. 通过原生js document.getElementById("button1").setAttribute 属性设置禁用时,第二个参数不论设置什么样的值,都能进行禁用。应该js在检测标签时只要有disabled时,便设置为禁用。
35. ```js
链接:https://www.nowcoder.com/questionTerminal/ccb9a78b25d34629919ea53cc320c56f
来源:牛客网
<SCRIPT language="JavaScript">
javascript:window.history.forward(1);
</SCRIPT>
这 种方法是用于防止由下一个页面返回的。
简单的说,页面A(A中有这段代码)转向页面B,
这时,B向A转向是被禁止。
2.
有时候我们再做网页时不希望某个网页通过浏览器的前进后退按钮来后退或前进,可以通过简单的办法达到该效果
<body οnbefοreunlοad="history.go(0)">这样这个网页就会永远停留再这个页面,不能前进后退了。Object.is(NaN,NaN) 输出true,NaN == NaN 为false,-0 === +0 为true,Object.is(+0,-0)为false
加减乘除如果是引用类型就调用valueof方法,不然就是直接Number()
concat 也能用于字符串相加
由于存在变量提升,在if语句执行之前会先使用var声明变量a,并且声明时是在全局作用域下,因此变量a自动成为window对象的属性,故a in window的返回结果为true,使用“!”将条件取反后返回结果为false,所以不会执行if中的赋值语句,a值为undefined
1
2
3
4if(! "a" in window){
var a = 1;
}
alert(a);\w用于匹配数字、字母或者下划线,A选项错误;/a?/表示匹配0个或者1个a,B选项错误;i修饰符表示忽略大小写,C选项正确;表示对第一个捕获组的引用,应使用\1
xmlhttprequest 有open(get,url),onreadystatechange,end,首先open配置好请求,之后配置好statechange钩子,回调方法里可以获取readystate,最后会在xhr里放入结果,配置好后send
变量提升会提升到函数中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20var a = 1;
function test() {
console.log(a);
if(false) {
var a = 2;
}
}
test();
//其实代码执行过程如下:
var a ;
a = 1;
function test() { //函数会先去找自己内部的变量,内部有就不会往外面找,内部没有才去外面找
var a; //变量提升
console.log(a);
if(false) { //因为false没有满足if的条件,所以不能进入if语句里进行赋值
a = 2; //if语句的条件把false改成true,就可以进入if语句赋值
}
}
test();阻止默认事件会组织提交行为,不会阻止冒泡
1
2
3
4
5
6
7
8
9
10
11
12链接:https://www.nowcoder.com/questionTerminal/0f6cf1641d9941cab8671b9e45ac2fb2
来源:牛客网
几个常见的事件的方法
preventDefault() 取消事件默认行为,如阻止点击提交按钮时对表单的提交(本题中click并没有什么默认行为)
stopImmediatePropagation() 取消事件冒泡同时阻止当前节点上的事件处理程序被调用,影响当前的事件***
stopPropagation() 取消事件冒泡,不影响事件***
cancelBubbe() 取消事件冒泡
returnValue() 取消事件默认行为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 的回调执行。
```js
链接:https://www.nowcoder.com/questionTerminal/58616412d69e4991831bf12cafbf7948
来源:牛客网前提是myobj是一个对象,只是存在与不存在的问题,几种表示方法:
1、!obj
2、!window.obj
3、typeof myObj == “undefined(判断对象是否有定义,已定义未赋值,返回true)
4、myObj == undefined(已定义未赋值。返回true)
5、myObj === undefined (已定义未赋值,返回true)
6、!this.hasOwnProperty(‘myObj’))(判断是否为顶层对象的一个属性)
7、myobj == null(注意null与undefined的区别,ull指的是已经赋值为null的空对象,即这个对象实际上是有值的,而undefined指的是不存在或没有赋值的对象。)
以上几种都正确,但是我用的最多争议最少的是第三种1
2
3
4
5
6
7
8
9
10
11
12
1346. Math.max不能操作数组,Math.max.apply(Math,arr)可以
47. Navagator:提供有关浏览器的信息 Window:Window对象处于对象层次的最顶层,它提供了处理Navagator窗口的方法和属性 Location:提供了与当前打开的URL一起工作的方法和属性,是一个静态的对象 History:提供了与历史清单有关的信息 Document:包含与文档元素一起工作的对象,它将这些元素封装起来供编程人员使用
48. window对象中提供了两个属性来获取当前窗口距离屏幕左侧和顶部的距离,单位为像素。
* screenLeft:窗口距离屏幕左侧的距离
* screenTop:窗口距离屏幕顶部的距离
49. forEach方法按升序为数组中含有效值的每一项执行一次 callback函数,那些未初始化的项将被跳过。new Array(10)创建的数组默认值都是undefined,所以回调函数都会被跳过。
```js
let i = 0;
new Array(10).forEach(() => {
i++;
});链接:https://www.nowcoder.com/questionTerminal/733abe2a678f470aba56b94c5af2af8f 来源:牛客网 A选项:isIDCard=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/ C选项:isIDCard=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/ ^:起始符号,^x表示以x开头 $:结束符号,x$表示以x结尾 [n-m]:表示从n到m的数字 \d:表示数字,等同于[0-9] X{m}:表示由m个X字符构成,\d{4}表示4位数字 15位身份证的构成:六位出生地区码+六位出身日期码+三位顺序码 18位身份证的构成:六位出生地区码+八位出生日期码+三位顺序码+一位校验码 C选项的构成: [1-9]\d{5}:六位出生地区码,出生地区码没有以0开头,因此第一位为[1-9]。 [1-9]\d{3}:八位出生日期码的四位年份,同样年份没有以0开头。 ((0\d)|(1[0-2])):八位出生日期码的两位月份,| 表示或者,月份的形式为0\d或者是10、11、12。 (([0|1|2]\d)|3[0-1]):八位出生日期码的两位日期,日期由01至31。 \d{4}:三位顺序码+一位校验码,共四位。 A选项的构成: [1-9]\d{7}:六位出生地区码+两位出生日期码的年份,这里的年份指后两位,因此没有第一位不能为0的限制,所以合并了。 后面的与C选项类似了。 好吧其实我也是第一次知道身份证还有15位的。