本文会用各种刁钻的角度来问问题,不考虑实际价值与这样写对不对,只作为考察(我自己)是否吃透(或者是还记得)高程三,防止各种坑爹面试题。(小部分补充不属于高程三)
问题
1. 如何将字符串’’alert出来?
2. 请说出普通script标签和加了async属性、defer属性的标签的异同。
3. 外部JS文件可以使用哪些扩展名?
4. 如果标签中既包含嵌入代码,src属性又引入了外部JS文件,请问浏览器会怎么执行?
5. 哪些HTML元素支持跨域?
6. 包含在元素中的内容在什么情况下会显示出来?
7. typeOf是关键字或保留字吗?
8. ÆÆÆ可否作为一个标识符?
9. 混杂模式、标准模式、准标准模式在什么方面有差别?
10. JS代码的多行注释可以怎么写?
11. 如何开启严格模式?
12. alert(age)和alert(typeof age)分别会输出什么?
13. console.log(null == undefined)结果是啥?
14. var num = x;x是个数字,请问Boolean(num)在x为何值时返回true,何值时返回false?
15. console.log((076 + 078) * (0xA+ 0x1f) * .200E-9)
16. console.log(0.05 + 0.25 === 0.3, 0.05 - 0.02 === 0.03)
17. 如何确定一个变量x可否参与计算?
18. console.log([+null, +undefined, +'+11', + '011', 011, +'', parseInt(' +0099A'), parseInt(''), Number(''), parseInt('070'), parseInt(070), parseInt('AF',16), parseInt('AF'), parseFloat('0xAF')])
19. 如何获取字符串的字数?(有可能大于0xFFFF,比如 '𠮷𠮷𠮷')
20. 箭头函数中出现的this的指向
答案
1. 加上反斜杠,代码如下。原理:
‘因为按照解析嵌入式代码的规则,当浏览器遇到字符串’’时,就会认为那是结束的标签,而通过转义字符“\”解决这个问题’(高程三第11页)
<script>
alert('<\/script>')
</script>
2. (1)浏览器自上而下解析代码时,遇到普通script标签就会暂停页面渲染开始下载,下载完成后立即执行,多个普通script标签会按顺序执行。
(2)加了async属性和defer属性的script标签共同点在于他们在下载时都不会暂停页面渲染,且都只对外部脚本文件有效。(部分老版本浏览器支持嵌入代码的defer,如IE4-7)
(3)而加了async属性的script标签下载完立马执行,不考虑先后顺序,也不考虑在DOMContentLoaded事件之前还是之后,但会在页面的load事件前执行。而加了defer属性的script标签会在页面解析渲染完毕后按顺序执行,执行完毕后触发DOMContentLoaded事件。(这个网站说得更详细www.bbsmax.com/A/x9J2DPZNd…)
但是,需要注意的是
“在现实当中,延迟脚本并不一定会按照顺序执行,也不一定会在DOMContentLoaded事件触发前执行,因此最好只包含一个延迟脚本”(高程三第13页)
3. 任何扩展名,常见的有.js,.jsp等。原理:“浏览器不会检查包含JavaScript的文件的扩展名。这样一来,使用JSP、PHP或其他服务器端语言动态生成JavaScript代码也就成为了可能。但是,服务器通常还是需要看扩展名决定为响应应用哪种MIME类型。如果不使用.js扩展名,请确保服务器能返回正确的MIME类型。”(高程三第12页)
4. 只会下载并执行外部JS文件,嵌入的代码会被忽略。原理:“需要注意的是,带有src属性的标签之间再包含额外的JavaScript代码。如果包含了嵌入的代码,则只会下载并执行外部脚本文件,嵌入的代码会被忽略”(高程三第12页)
5. script、img、link、iframe(这意味着可以使用JSONP等跨域操作)
6. 1.浏览器不支持脚本 2.浏览器支持脚本,但脚本被禁用。(高程三第18页)
7. 不是,因为JS区分大小写。(高程三第19页)
8. 可以。“标识符中的字母也可以包含扩展的ASCII或Unicode字母字符(如À和Æ),但我们不推荐这样做。”“所谓标识符,就是变量、函数、属性的名字,或者函数的参数。”(高程三第19页)
9. CSS和JS。“虽然这两种模式(这里是说混杂和标准模式,准标准模式几乎和标准模式一样)主要影响CSS内容的呈现,但在某些情况下也会影响到JavaScript的解释执行。”(高程三第17页)
10. 如下(第二个注释的第二行和第三行的*只是为了提高可读性才加的)
// 多行
// 注释或者
/*
*多行
*注释
*/
(高程三第20页)
11. "严格模式"有两种调用方法,适用于不同的场合。
1 针对整个脚本文件
将"use strict"放在脚本文件的第一行,则整个脚本都将以"严格模式"运行。如果这行语句不在第一行,则无效,整个脚本以"正常模式"运行。如果不同模式的代码文件合并成一个文件,这一点需要特别注意。
(严格地说,只要前面不是产生实际运行结果的语句,"use strict"可以不在第一行,比如直接跟在一个空的分号后面。)
2 针对单个函数
将"use strict"放在函数体的第一行,则整个函数以"严格模式"运行。
因为第一种调用方法不利于文件合并,所以更好的做法是,借用第二种方法,将整个脚本文件放在一个立即执行的匿名函数之中。(引自阮一峰大佬《Javascript 严格模式详解》)
12. alert(age)会报错,因为没有声明。alert(typeof age)返回”undefined” “对于尚未声明过的变量,只能执行一项操作,即使用typeof操作符检测其数据类型(对于未经声明的变量调用delete不会导致错误,但这样做没什么实际意义,而且在严格模式下确实会导致错误)。”(高程三第25页)
13. true。“undefined值是派生自null值的,因此ECMA-262规定对他们的相等性测试要返回true”(高程三第26页)
14. 任何非零数字值(包括无穷大)可以转化为true,0和NaN则转化为false。(高程三第27页)
15. 0.000001148。
076 + 078的结果是140 。“八进制字面值的第一位必须是0,然后是八进制数字序列(0-7)。如果字面值中的数值超出了范围,那么前导零将被忽略,后面的数值将被当做十进制数值解析。”(注意:八进制字面量在严格模式下是无效的。)(高程三第27页)
0xA+ 0x1f的结果是41,十六进制字母可以大写也可以小写。
.200E-9是科学计数法,E可大写可小写,浮点数小数点前可以没有数字。
“在默认情况下,ECMAScript会将那些小数点后面带有6个零以上的浮点数值转换为以e表示法表示的数值”(高程三第28页)
16. true false。但因为精度问题,永远不要测试某个特定的浮点数值。
这是变通的方法,Number.EPSILON是最小精度值,只要偏差不大于它就行。
console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON);
17. !isNaN(x)&&isFinite(x)返回结果是true即可。如果必须是数字的话,那么答案是typeof x === "number" && !isNaN(x)&&isFinite(x)。
18. Array(14) [ 0, NaN, 11, 11, 9, 0, 99, NaN, 0, 70, 56, 175, NaN, 0]。parseFloat()只解析十进制值,它会始终忽略前导零,十六进制格式的字符串则始终会被转换成0,且没有第二个参数。
19. [...str].length //这是es6的一种解法,或许还有别的解法
20. 永远指向作用域链的上一级,因为箭头函数没有this,所以对于这个变量,浏览器会顺着作用域链向上找。