1. var a = [1,4,5,2,9];下面求a中最大值正确的是
Math.max(a)
Array.max(a)
Math.max.call(null,a)
Math.max.apply(null,a)
答案:1、Math.max.apply(null,a)
2、Math.max(...a)//展开运算符,ES6新语法
解析:
JavaScript核心技术解密
Math对象的max()方法,用于确认一组数值中的最大值,接收任意多个参数,不接受数组参数。
apply()有两个参数,第一个为this指向,将执行的环境切换到null(默认到全局环境中),把所有参数都纳入数组变成第二个参数。
call()有多个参数,第一个为this指向,将执行的环境切换到null(默认全局环境中),第二个参数开始,即为参数,
...a为展开运算符,是ES6的新语法,将数组一个个变成max的参数。
2. 下列代码,页面打开后能够弹出alert(1)的是?
<iframe src=”javascript: alert(1)”></iframe>
<img src=”” onerror=”alert(1)”/>
IE下<s style=”top:expression(alert(1))”></s>
<div onclick=”alert(1)”></div>
答案:
<iframe src=”javascript: alert(1)”></iframe>
<img src=”” onerror=”alert(1)”/>
IE下<s style=”top:expression(alert(1))”></s>
解析:
iframe中使用javascript使用js语句alert(1);
onerror:当图片不存在时触发函数;
expression:
css expression(css表达式)又称Dynamic properties(动态属性)是早期微软DHTML的产物,以其可以在Css中定义表达式(公式)来达到建立元素间属性之间的联系等作用,从IE5开始得到支持,后因标准、性能、安全性等问题,微软从IE8 beta2标准模式开始,取消对css expression的支持。
知道的人很少了、就是写兼容ie的页面也很少用到;
3.下哪些表达式的结果为true()
undefined == null
isNaN("100")
parseInt("1a") === 1
[] instanceof Array
答案:undefined==null、parseInt("1a")===1、 []instanceof Array
解析:
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()函数还有一个易考点,就是利用数组的下标,还记得parseInt()函数的第二个参数吗?
2.1 parseInt()函数的第二个参数指的就是进制,这个参数小于2或者大于36的时候,都会返回NaN
console.log(parseInt(1,1));//NaN ,因为第二个参数是1表示1进制<2,所以错误
console.log(parseInt(1,2));//1,因为表示二进制 =2,在范围内
2.2 我们一般都是省略这个参数的,这个时候就是默认为10进制
console.log(parseInt(99));//99
2.3 我们第二个参数使用0的时候也是使用十进制
console.log(parseInt(99,0));//99
2.4 如果第一个参数前缀使用0x/0X则表示使用16进制
console.log(parseInt(0x99));//153=16*9+9
console.log(parseInt(0x99,10));//如果第一个参数使用了0x表示十六进制,那么第二个参数设置了值也无效
本题中 1a在parseInt下只有1被识别,a丢弃,返回1。
3.instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。
4. 以下哪些操作会触发Reflow:()
var obj = document.getElementById(“test”);
A.alert(obj.className)
B.alert(obj.offsetHeight)
C.obj.style.height = “100px”
D.obj.style.color = “red”
答案:BC
解析:
reflow(回流)和repaint(重绘)
简要:整个在浏览器的渲染过程中(页面初始化,用户行为改变界面样式,动画改变界面样式等)reflow(回流)和repaint(重绘) 会大大影响web性能,尤其是手机页面。因此我们在页面设计的时候要尽量减少reflow和repaint。
什么是reflow和repaint
reflow:例如某个子元素样式发生改变,直接影响到了其父元素以及往上追溯很多祖先元素(包括兄弟元素),这个时候浏览器要重新去渲染这个子元素相关联的所有元素的过程称为回流。
reflow:几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显 示与隐藏)等,都将引起浏览器的 reflow。鼠标滑过、点击……只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲 染。通常我们都无法预估浏览器到底会 reflow 哪一部分的代码,它们都彼此相互影响着。
repaint:如果只是改变某个元素的背景色、文 字颜色、边框颜色等等不影响它周围或内部布局的属性,将只会引起浏览器 repaint(重绘)。repaint 的速度明显快于 reflow
下面情况会导致reflow发生
1:改变窗口大小
2:改变文字大小
3:内容的改变,如用户在输入框中敲字
4:激活伪类,如:hover
5:操作class属性
6:脚本操作DOM
7:计算offsetWidt和offsetHeight
8:设置style属性
D只会repaint而不会影响到reflow。
5.结果是?
var x = new Boolean(false);
if (x) {
alert('hi');
}
var y = Boolean(0);
if (y) {
alert('hello');
}
答案:hi
解析:此题考查的是 JS 的类型转换:
if(x) 这里期望 x 是一个布尔类型的原始值,而 x 是一个对象,任何对象转为布尔值,都为得到 true(切记!在 JS 中,只有 0,-0,NaN,"",null,undefined 这六个值转布尔值时,结果为 false)。
题目的第二部分,一定要注意 y = Boolean(0),而不是 y = new Boolean(0)。这两个有很大区别,用 new 调用构造函数会新建一个布尔对象,此处没有加 new,进行的是显示类型转换,正如上述第一条所说,0 转换布尔,结果为 false,所以此时 y 的值就是 false。如果加了 new,那么 y 就是一个 Boolean 类型的对象,执行 if(y) 时,对象转布尔,始终是 true,所以结果会与不加 new 的时候相反。
6.如何把 7.25 四舍五入为最接近的整数?
round(7.25)
rnd(7.25)
Math.rnd(7.25)
Math.round(7.25)
答案:Math.round(7.25)
◎Math.ceil()执行向上舍入,即它总是将数值向上舍入为最接近的整数;
◎Math.floor()执行向下舍入,即它总是将数值向下舍入为最接近的整数;
◎Math.round()执行标准舍入,即它总是将数值四舍五入为最接近的整数(这也是我们在数学课上学到的舍入规则)
7. 在 javascript 中,以下返回 false 的选项是
var test=1;typeof test=='number';
var test=1.2;typeof test=='float';
var test=undefined;typeof test=='undefined';
var test={};typeof test=='object';
var test='4399'-0;typeof test=='number';
var test=null;typeof test=='object';
答案:B var test=1.2;typeof test=='float';
解析:js只有number类型, float与整形都用number
typeof
undefined 值未定义
boolean 布尔值
string 字符串
number 数值(整形和浮点)
object 对象或null
function 函数
8.var obj = {};
obj.log = console.log;
obj.log.call(console,this);
该代码在浏览器中执行,输出的日志结果是什么?
undefined
window
console
obj
答案:window;
解析:
A.call(B,x,y)
1、改变函数A的this指向,使之指向B;
2、把A函数放到B中运行,x和y是A函数的参数。
这道题为陷阱题:
call将obj.log的this改为了console对象,这是对的,接而将全局的this(window)作为参数传递给console.log()方法,于是打印出来的值便为window。
9. 以下代码中,为class为test的div对象设置红色背景的正确js代码为( )
<div class="test"></div>
A、document.getElementsByClassName("test").style.backgroundColor="red";
B、document.getElementsByClassName("test")[0].style.backgroundColor="red";
C、document.getElementsByClassName("test")[0].style.background-color="red";
D、document.getElementsByClassName("test").style.background-color="red";
答案:B
解析:在js里面添加的属性名使用驼峰法,在css里面使用连接线 除了id和query 其他返回的都是节点列表
10. 其中 alert 两次输出结果为()
var foo='Hello';
(function(){
var bar='World';
alert(foo+bar);
})();
alert(foo+bar);
答案:hello world报错
解析:第一个alert中正常输出helloworld,最底部的alert由于bar是自执行方法内的变量,所以没有全局中没有bar变量,报错。
11. 面有关浏览器中使用js跨域获取数据的描述,说法错误的是?
域名、端口相同,协议不同,属于相同的域
js可以使用jsonp进行跨域
通过修改document.domain来跨子域
使用window.name来进行跨域
答案:A
解析:完全一致的意思是,域名要相同(www.example.com和example.com不同),协议要相同(http和https不同),端口号要相同(默认是:80端口,它和:8080就不同)。
1.CORS
CORS(Corss-Origin Resource Sharing,跨资源共享),基本思想是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应的成功或失败。即给请求附加一个额外的Origin头部,其中包含请求页面的源信息(协议、域名和端口),以便服务器根据这个头部决定是否给予响应。
2.document.domain
将页面的document.domain设置为相同的值,页面间可以互相访问对方的JavaScript对象。
注意:
不能将值设置为URL中不包含的域;
松散的域名不能再设置为紧绷的域名。
3.图像Ping
var img=new Image();
img.onload=img.onerror=function(){
... ...
}
img.src="url?name=value";
请求数据通过查询字符串的形式发送,响应可以是任意内容,通常是像素图或204响应。
图像Ping最常用于跟踪用户点击页面或动态广告曝光次数。
缺点:
只能发送GET请求;
无法访问服务器的响应文本,只能用于浏览器与服务器间的单向通信。
4.Jsonp
var script=document.createElement("script");
script.src="url?callback=handleResponse";
document.body.insertBefore(script,document.body.firstChild);
JSONP由两部分组成:回调函数和数据
回调函数是接收到响应时应该在页面中调用的函数,其名字一般在请求中指定。
数据是传入回调函数中的JSON数据。
优点:
能够直接访问响应文本,可用于浏览器与服务器间的双向通信。
缺点:
JSONP从其他域中加载代码执行,其他域可能不安全;
难以确定JSONP请求是否失败。
5.Comet
Comet可实现服务器向浏览器推送数据。
Comet是实现方式:长轮询和流
短轮询即浏览器定时向服务器发送请求,看有没有数据更新。
长轮询即浏览器向服务器发送一个请求,然后服务器一直保持连接打开,直到有数据可发送。发送完数据后,浏览器关闭连接,随即又向服务器发起一个新请求。其优点是所有浏览器都支持,使用XHR对象和setTimeout()即可实现。
流即浏览器向服务器发送一个请求,而服务器保持连接打开,然后周期性地向浏览器发送数据,页面的整个生命周期内只使用一个HTTP连接。
6.WebSocket
WebSocket可在一个单独的持久连接上提供全双工、双向通信。
WebSocket使用自定义协议,未加密的连接时ws://;加密的链接是wss://。
var webSocket=new WebSocket("ws://");
webSocket.send(message);
webSocket.onmessage=function(event){
var data=event.data;
... ....
}
注意:
必须给WebSocket构造函数传入绝对URL;
WebSocket可以打开任何站点的连接,是否会与某个域中的页面通信,完全取决于服务器;
WebSocket只能发送纯文本数据,对于复杂的数据结构,在发送之前必须进行序列化JSON.stringify(message))。
优点:
在客户端和服务器之间发送非常少的数据,减少字节开销。
12.以下代码执行时不会在控制台输出错误信息的是:
let a = decodeURIComponent('%');
var a;
a();
function a() {
console.log(a);
}
Promise.reject(123).finally(a => {
console.log(a);
});
var a = 1;
let a = 2;
console.log(a);
答案:B
解析:
A、decodeURIComponent解码函数,中间得是一个url字符串;不能包含%,会报错。
B、变量提升与函数提升。
C、reject触发的是回调函数,123会报错
D、变量都是var定义的,同名则覆盖,如果一个var 一个let会报重复定义。两个变量都是let定义的同样会报错。
13.
function checkState(){
alert("liyuming");
}
window.setTimeout(checkState(), 10000); //立即被调用
window.setTimeout(checkState, 10000); // 10s后被调用
window.setTimeout("checkState()", 10000); //10s后被调用 注意和第一个的区别 有引号