JavaScript 疑难、易错笔试选择题+分析

1.以下代码执行时不会在控制台输出错误信息的是:B

A. 		let a = decodeURIComponent('%');
B.
		var a;
		a();
		function a() {
    
    
		console.log(a);

C.

		Promise.reject(123).finally(a => {
    
    
		console.log(a);
			});
		}
D.
		var a = 1;
		let a = 2;
		console.log(a);

分析B:

  • js有变量提升和函数提升,指的是用 var声明变量 或用 function 函数名(){ } 声明的,会在 js预解析 阶段提升到顶端;(es6的let 和 const 不会提升)
  • 函数提升优先级 高于 变量提升
  • 相同作用域时声明变量而不赋值则还是以前的值, 而子作用域声明不赋值则函数内该值为undefined,因为声明了私有变量

2.下面的语言中哪些语言是动态语言( JavaScript )

解释:

在这里插入图片描述

3.下列函数哪些是JavaScript的全局函数?( A、B、D )

A.encodeURI
B.parseFloat
C. setTimeout
D.eval

分析:setTimeout()是宿主环境提供的

JS全局函数:

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

  • 编码相关:
    escape()、unescape()、encodeURI()、decodeURI()、
    encodeURIComponent()、decodeURIComponent()
  • 数据处理:
    Number()、String()
  • 数字相关:
    isFinite()、isNaN()、parseFloat()、parseInt()
  • 特殊:
    eval()

4.判断对象myObj是否存在的写法,下面说法错误的是( C)

A. typeof myObj == “undefined”
B. myObj === undefined
C. myObj === null
D.!this.hasOwnProperty(‘myObj’)

5.有var d = new Date(‘2018-05-09’),可以设置为6月份的操作是?(C、D)

  • d.setMonth(7);
  • d.setMonth(6);
  • d.setMonth(5);
  • d.setDate(40);

setDate()参数分析:

n表示一个月中的一天的一个数值(1 ~ 31):
0 为上一个月的最后一天
-1 为上一个月最后一天之前的一天
如果当月有 31 天:
32 为下个月的第一天
如果当月有 30 天:
32 为下一个月的第二天;
40 为下一个月的第9天;

6. JavaScript定义var a=“40”,var b=7,则执行a%b会得到(5)。

分析:使用-,/,*,% a都会隐式转换为数字类型。

注意:+号,数字隐式转换成字符串。其余的运算符号是字符串隐式转换成数字

7.关于 javascript 模块化,下列描述错误的是(B)。

  • AMD推崇依赖前置,CMD推崇依赖就近
  • Sea.js遵循AMD规范,RequireJS遵循CMD规范
  • 主流的模块化包括CommonJS,AMD,CMD等
  • 模块化有利于管理模块间的依赖,更依赖模块的维护

分析:AMD和CMD都是浏览器端的js模块化规范,分别由require.js和sea.js实现。 CommonJS是服务器端的js模块化规范,由NodeJS实现。

个人记忆法:

  • 看AMD、CMD的首字母,26位字母,A在C前面,所以AMD是依赖前置,CMD是依赖就近。
  • 同样require.js、sea.js,看首字母,r在s前面。所以require.js是AMD的实现方式。

首字母前的对应”前“

8. 以下结果里,返回true的是?

  • !![]
  • !!{}
  • []==0
  • null==undefined

9. 以下代码执行后,array的结果是?

var array=[-1,1,3,4,6,10];
array.sort((a,b)=>Math.abs(a-3)-Math.abs(b-3));

结果:[3,4,1,6,-1,10]

分析:
sort() 方法用于对数组的元素进行排序,参数决定排序的顺序。

  • 原数组var array=[-1,1,3,4,6,10];
  • 参数(a,b)=>Math.abs(a-3)-Math.abs(b-3):即数值减3的绝对值[4,2,0,1,3,7]作为参数决定排序。
  • 根据绝对值减3大小排列[0,1,2,3,4,7],对应的原数组排序后为[3,4,1,6,-1,10]

10. es6中的export、import用法

详细用法可看MDN:

11.this对象的理解正确的是 (A、B、D)

  • A.在不手动改变this指向的前提下,this总是指向函数的直接调用对象
  • B 如果有new关键字,this指向new出来的那个对象
  • C this总是指向函数的非间接调用者
  • D IE中attachEvent中的this总是指向全局对象window

12.JavaScript的typeof运算符的可能结果:(symbol、boolean、undefined、string)

13.以下表达式不会出现错误的有(B、C、D)

  • A、2.toString()
  • B、2…toString()
  • C、2 .toString()
  • D、(2).toString()

14.在很多时候,我们需要给网页中的一些元素不停的切换样式,那么要怎样实现给元素删除一个样式的同时,添加另外一个样式( A )

A:

$('#ele').removeClass('className');
$('#ele').addClass('ClassName');

B:

$('us').removeClass('className');
$('us').addClass('ClassName');

C:

$('.us').removeClass('className');
$('.us').addClass('ClassName');

D:

$('us').remove('className');
$('us').add('ClassName');

本题考察JQuery中选择器的知识。
常用有三种:
①元素选择器:$(“TagName”)
②ID 选择器: KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲ID") ③类选择器:(".className")

个人看法解析:
A:正确。
B:错误。选项使用元素选择器,但是 HTML 中没有 us 标签(不考虑自定义标签这种特殊情况)
C:错误。选项使用类选择器,看起来是正确的。但, 若删除类选择器 className 就是 .us,就无法再通过 $(’.us’).addClass(‘ClassName’) 给该元素添加样式了
D:错误。add() 方法:把元素添加到已存在的元素组合中。 remove() 方法:移除被选元素,包括所有的文本和子节点。

15.在jquery中,如果想要获取当前窗口的宽度值,下面哪个是实现该功能的?(width())

16.angularjs1中control间通信最好使用什么方式?( C )

  • A. 回调
  • B. 全局变量
  • C. 广播
  • D. 函数调用

17. angularjs1中使用指令,绑定监听是在什么时候?(B)

  • A. compiles时
  • B.link时
  • C.require时
  • D.生成DOM时

分析:

为了解决AngularJS性能问题,编译阶段应分为两个阶段:

  1. compile (绑定DOM,即compile是在生成DOM后扫描并生成时候运行)
  2. link(数据绑定)

18.JS里的function能访问它们的(A、B、C、D)

  • A.参数
  • B.局部变量或函数
  • C. 全局变量
  • D. 外部函数的变量或函数

19.下面匹配整数的正则表达式中,正确的是( A )

  • A:(-?[1-9]\d*)|0
  • B:[1-9]\d*
  • C:-[1-9]\d*
  • D:[1-9]\d*|0

分析:
A:整数 (包括0)
B:正整数
C:负整数
D:正整数(包括0)

正则相关知识:

  • ?:出现0次或1次(即A选项,有-表示是负数,没有就表示为正数)
  • \d:匹配数字字符
  • *:表示字符可出现0次或多次

20. 下面哪些执行结果为true(B、C、E)

  • A: ‘foo’ == new function(){ return String(‘foo’); };
  • B: ‘foo’ == new function(){ return new String(‘foo’); };
  • C: [] == 0
  • D: ![]
  • E: !0

重点区分:A 与 B

分析:A、B
构造函数(new function(){})始终会返回一个对象:
情况1:你写了return {a:xxx} 他就会返回你定义的这个对象
情况2:你没写return 或者你return a 一个基本类型 这两种情况(没写或者return基本类型)它都会默认返回一个空对象

  • a选项返回了一个String 所以构造函数会默认返回一个空对象
  • b选项返回一个String对象(因为有new 所以是字符串对象)所以构造函数就返回了这个String对象

21. void()该表达式的结果是:D

  • A. undefined
  • B. TypeErrot
  • C. null
  • D. SyntaxError

分析:void是一元运算符,它出现在操作数之前,操作数可以是任意类型,操作数会照常计算,但忽略计算结果并返回undefined。(无论操作数是什么类型,都是只返回undefined)。

示例:

  • void(NaN)
  • void(1+9)
  • 都是返回undefined
  • 操作数不能为空,空了就语法报错

22.指令中哪种作用域可以继承父scope? (A)

  • A. scope:true
  • B. scope:{}
  • C. scope:parent
  • D. 默认就继承了父作用域

23. 以下哪些表达式的值为0?(A B C D)

  • A. (()=>{}).length
  • B. 1 & 2
  • C.+[]
  • D. [1,2,-3].reduce((a, b) => a - b, 0)

分析:

A : (()=>{}).length; 获取方法形参个数,形参为0
B :

按位与运算符(&)
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;

按位或运算符(|)
参加运算的两个对象,按二进制位进行“或”运算。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;

取反运算符(~)
参加运算的一个数据,按二进制位进行“取反”运算。
运算规则:~1=0; ~0=1;

异或运算符“^”
  用于比较两个二进制数的相应位。在执行按位异或运算时,如果两个二进制数的相应位都位1或两个二进制数的相应位都位0,则返回 0;如果两个二进制数的相应位其中一个为1,另一个为0,则返回 1;

24. 以下哪些事件会在页面加载完成(onload)之前触发?(A、D)

  • A. readystatechange
  • B. pageshow
  • C. beforeunload
  • D. DOMContentLoaded

25. 以下哪些代码执行后i的值为10:(A C)

A:

let i =1 + {
valueOf() { return 9; }
};

B:

let i = 0;
new Array(10).forEach(() => {
i++;
});

C:

let i = parseInt(‘0xA’);

D:

let i = 5;
function a(i) {
i *= 2;
}
a(i);

分析:

A:

如果在需要使用原始值的上下文中使用了对象,就会自动调用valueOf方法.这里重写了默认的valueOf 方法。

所以相当于 let i = 1+9

B:

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

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

C:

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

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

D:

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

26. 在浏览器控制台执行以下代码,输入的结果是(A)

在这里插入图片描述
A:4400 4401 4399 4400
B:4400 4401 4401 4402
C:4400 4400 4399 4400
D:4400 4401 4399 4402
E:4400 4401 4401 4400

注意:之所以第三个输出是4399,是因为在result.add()中,进行n++操作的n不是result.n,因为add内部使用的不是this.n,如果是this.n则操作的就是result.n。而result.add()操作的n是test、add函数形成的闭包中的n。

27. 解释型语言的特性有什么?

  • 非独立:JavaScript语言依赖执行环境,对于客户端来说是浏览器,对于服务端来说是Node
  • 效率低:执行前不需要编译,执行时编译,因此效率低。

28. 关于angularjs1说法,错误的是(B)

A:前端mvc,极大降低前端开发的耦合
B:极大的丰富了dom操作
C:实现了数据双向绑定
D:实现了依赖注入

注意:

  • Angular大大减少了对DOM的访问。
  • jQuery极大的丰富了DOM操作

29. ({} + ‘b’ > {} + ‘a’)返回值是(true)

分析:{}进行+法运算会自动转化为字符串"[object Object]",然后进行字符串拼接。

即:"[object Object]b">"[object Object]a",根据字典比较,比较到最后一位,b>a。

30.下面结果为不为真的表达式是:(B D)

A:null = = undefined Object.prototype;
B:[1,2,3].splice(1,1,1) = = [2]
C:let Mi = new Function();Mi._ _ proto _ . _ proto _ _ == Object.prototype;
D:‘1’ = = = true

注意B选项的splice()方法:

  • 参数一:index。必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
  • 参数二:number。必需。整数,要删除的项目数量。如果设置为0,则不会删除项目。
  • 后面任意多参数:可选,向数组添加新项目。(注意:不是在数组末尾追加新项目,取决于第一、第二个参数)
  • 返回值:所有删除项组成的数组

[1,2,3].splice(1,1,1)的返回值是[2],但原数组[1,2,3]执行完后变成了[1,1,3]

注意: 这里[2]!=[2],因为[1,2,3].splice(1,1,1)返回的[2]是新创建的数组,它们两者地址值是不同的,所以不等。

31. 某下对this对象的理解哪些是正确的 (A B D)

A: this总是指向函数的直接调用者(而非间接调用者);
B: 如果有new关键字,this指向new出来的那个对象;
C: 在事件中,this总是指向触发这个事件的对象;
D: this是函数运行时自动生成的一个内部对象,只能在函数内部使用;

注意:在事件中,this指向触发这个事件的对象, 特殊的是,IE中的attachEvent中的this总是指向全局对象Window;

32.以下哪些选项可以将集合A转化为数组?(A C)

A:Array.from(A)
B: [].slice.apply(A)
C:[…A]
D:[].map.call(A, o => o)

33.以下哪个表达式的值为true?(D)

A:‘1’ === 1
B:isNaN(1/0)
C:1 in [1]
D:1 && 2 > 1

重点分析:B、C

B:

  • 在JS中任何数除以0都不会导致错误而终止程序,而是会返回特殊值Infinity,而不会影响程序的执行。
  • 比0大的数除以0,则会得到无穷大,所以 js 用 Infinity 来显示出来。
  • 也就是1/0得到的是Infinity。isNaN(1/0)返回的是false。但是isNaN(0/0)返回的就是true

C:

  • in操作符,对于数组属性需要指定数字形式的索引值来表示数组的属性名称(固有属性除外,如length)。
  • 所以说在这里,1 in [1]并不是表示数字1在不在数组里。而是表示数组中含不含有1这个索引index值。数组长度为1,所以只含有的index值为0,这个表达式返回fasle。

34.如果不给cookie设置过期时间会怎么样?(在浏览器会话结束时过期)

34. 以下代码执行后,console 输出的信息是?

for(var i = 0; i < 5; i++){
    
    
	requestAnimationFrame(() => console.log(i));
}

输出:5 5 5 5 5

注意:requestAnimationFrame是个异步函数

35.NOSCRIPT标签是做什么用的?©

A:制止脚本的运行
B:防止区域脚本被js修改
(例如aDiv.innerHTML = ‘something’ 将会不起作用)
C:用来定义在脚本未被执行时的替代内容
D:NOSCRIPT 标签并不存在

分析:NOSCRIPT标签用来定义在脚本未被执行时的替代内容。也可以用在检测浏览器是否支持脚本,若不支持脚本则可以显示NOSCRIPT标签里的innerText

<body>  
...
  ...

  <script type="text/javascript">
    <!--
    document.write("Hello World!")
    //-->
  </script><noscript>Your browser does not support JavaScript!</noscript>...
  ...
</body> 

36.下面得到的结果分别是什么?(true true false)

console.log(([])?true:false); 
console.log(([]==false?true:false)); 
console.log(({
    
    }==false)?true:false) 

分析:此题考察类型转换,三元运算符先“分清是非”,再决定今后该走哪条路,“==”运算符比较“喜欢”Number类型

下面是题目的类型转换结果:

Boolean([]); //true
Number([]); //0
Number({
    
    }); // NaN
Number(false); //0

因此:

console.log(([])?true:fasle);// => console.log((true)?true:false);
console.log([]==false?true:false); // => console.log(0==0?true:false);
console.log(({
    
    }==false)?true:false); // => console.log((NaN==0)?true:false);

《JavaScript权威指南》的部分相关知识点

“==”运算符(两个操作数的类型不相同时,较喜欢“Number”类型)

  • 如果一个值是null,另一个值是undefined,则它们相等
  • 如果一个值是数字,另一个值是字符串,先将字符串转换为数学,然后使用转换后的值进行比较。
  • 如果其中一个值是true,则将其转换为1再进行比较。如果其中的一个值是false,则将其转换为0再进行比较。
  • 如果一个值是对象,另一个值是数字或字符串,则将对象转换为原始值,再进行比较。

37.在文件/home/somebody/workspace/somemodule.js中第一行引用了一个模块:require(‘othermodule‘),请问required 的查找模块的顺序(C B A D)

A. /home/somebody/workspace/node_modules/othermodule/index.js
B. /home/somebody/workspace/node_modules/othermodule. Js
C.CORE MODULES named othermodule
D./home/somebody/node_modules/othermodule/index.js

分析:

  • 首先加载核心模块,不管有没有同名/同目录的情况下,核心模块优先加载.

  • 其次按照相对路径/绝对路径加载文件模块(加载顺序,首先试图按照路径查找 .js 扩展名的文件,如果没有,试图按照路径查找.json 扩展名的文件,如果还是没有,就按照路径查找.node 扩展名的c++模块了)

  • 最后搜索 node_modules目录下通过npm下载的第三方模块.

注意:首次加载这类模块最慢,因为执行文件所在目录的node_mondel 文件夹下找不到时,会去父级node_mondel 文件夹里查找,如果还是找不到会去父级的父级node_mondel 文件夹里查找…但是,只要首次加载成功后,node就会缓存起来,它缓存的是编译后的二进制模块,所以以后的加载速度和效率都的有保证的.

38.以下代码执行后,console 的输出是?(D)

function Foo(){
    
    
	'use strict'
	console.log(this.location);
}
Foo()

A. 当前窗口的 Location 对象
B. undefined
C. null
D. TypeError

分析:'use strict’是严格模式,严格模式下禁止this关键字指向全局对象。此时this为undefined。

39.下列说法正确的是(A B C D)

A:每个JS对象一定对应一个原型对象,并从原型对象继承属性和方法
B:对象的__proto__指向自己构造函数的prototype
C:Object.prototype. proto=== null,说明原型链到Object.prototype终止
D:表达式 Function.prototype.proto.proto === null 的运行结果为true

40.以下代码执行后,console 的输出是?(A)

let x = 10;
let foo = () => {
    
    
	console.log(x);
	let x = 20;
	x++;
}
foo();

A:抛出 ReferenceError
B:10
C:20
D:21

分析:暂时死区的问题,虽然let语句不像var语句会产生hoisting(变量提升),JavaScript引擎也会意识到在后边的let定义,只是不支持在let声明语句之前引用该变量而已。所以,只要在同一个block中,let是在后边定义的,就不能在之前引用该变量。与此同时,也不能再去取嵌套外层的值了(x=1)。

41.以下代码执行后,result 的值是:(B)

var result = Math.round(11.5) + Math.round(-11.5);

A:0
B:1
C:-1

分析:result = 12 - 11=1;

  • 如果参数的小数部分大于 0.5,则舍入到下一个绝对值更大的整数;
  • 如果参数的小数部分小于 0.5,则舍入到下一个绝对值更小的整数;
  • 如果参数的小数部分恰好等于0.5,则舍入到下一个在正无穷(+∞)方向上的整数

Math.round(-11.5)舍入到正无穷方向上的整数,即为-11比-12更靠近正无穷。
在这里插入图片描述

42. 请问 a 的结果是什么?(C)

if(! "a" in window){
    
    
    var a = 1;
}
alert(a);

if(! “a” in window)这句代码的意思是:判断全局对象window中是否有变量a。javascript只有函数作用域, 没有块作用域,所以在if 里面的var a =1会变量提升到if上面。所以window中有变量a,而不会进入if块作用域中,所以a还是声明没有初始化。

43. 以下代码执行后,a.x 和 b.x 的结果分别是? (C)

function A(x){
    
    
	this.x = x;
}
A.prototype.x = 1;

function B(x){
    
    
	this.x = x;
}
B.prototype = new A();
var a = new A(2), b = new B(3);
delete b.x;

A:2, 3
B:2, 1
C:2, undefined
D:其他几项都不对

分析:

function A(x){
    
    
this.x = x;
}
A.prototype.x = 1;

function B(x){
    
    
this.x = x;
}
B.prototype = new A();
var a = new A(2), //a.x首先要在自己的构造函数中查找,没有采取原型上找,这里有this.x = x.所以a.x = 2;
b = new B(3);//B.prototype = new A();形成原型链
delete b.x;//但是delete只能删除自己的x不能删除父级的x.   
//b.x通过原型链找到构造函数A里面的this.x=x但是没有赋值,所以undefined

总结:先在构造函数中查找,没有则再到原型上查找

44. 运行以下程序,y和z的最终结果为:(B)

<script> 
    var m= 1, j = k = 0; 
    function add(n) {
    
     
        return n = n+1; 
  } 
    y = add(m); 
    function add(n) {
    
     
        return n = n + 3; 
    } 
z = add(m); 
</script> 

A:2,4
B:4,4
C:2,2
D:报异常

分析:js里面没有函数重载的概念,在其他语言中(如java)java中,可以存在同名函数,只要传入的参数数量或者类型不同即可。在js中,定义了两个同名函数后,后面的函数会覆盖前面定义的函数。结合这道题来说,由于函数声明提升,所以函数声明会提前,由于存在同名函数,后面的add函数将覆盖第一个add函数,所以两次调用add()返回的值是相同的。也就是y,z都为4.

45. 上面的输出结果:(D)

(function() {
    
    
      var a = b = 5;
  })();   
console.log(b);
console.log(a);

A:5,5
B:undefined,undefined
C:5,undefined
D:5,Uncaught ReferenceError: a is not defined

分析:考点在于var a=b=5相当于拆解成var a=b; b=5; 然后,b=5前面没有var,相当于声明为全局变量。

46.angularjs1中的服务实质上是(单例对象)

47.下列代码,页面打开后能够弹出alert(1)的是?(A B C)

A:< iframe src=”javascript: alert(1)” >< /iframe >
B:< img src=”” οnerrοr=”alert(1)”/ >
C:IE下< s style=”top:expression(alert(1))” >< /s >
D:< div οnclick=”alert(1)” >< /div >

分析:

C:在ie 7下会连续弹出, IE5及其以后版本支持在CSS中使用expression,用来把CSS属性和Javascript表达式关联起来,这里的CSS属性可以是元素固有的属性,也可以是自定义属性。就是说CSS属性后面可以是一段Javascript表达式,CSS属性的值等于Javascript表达式计算的结果。 在表达式中可以直接引用元素自身的属性和方法,也可以使用其他浏览器对象。这个表达式就好像是在这个元素的一个成员函数中一样。

48.关于这段代码正确的结论是:(A)

var F=function(){
    
    };
Object.prototype.a=function(){
    
    };
Function.prototype .b=function(){
    
    };
var f=new F();

A:f能取到a,但取不到b
B:f能取到a,b
C:F能取到b,不能取到a
D:F能取到a,不能取到b

另一道例题:

网上有一道美团外卖的面试题是这样的:  Function.prototype.a = 'a';
Object.prototype.b = 'b';
function Person(){
    
    };
var p = new Person();
console.log('p.a: '+ p.a); // p.a: undefined
console.log('p.b: '+ p.b); // p.b: b  问为什么?

有不少同学第一眼看上去就觉得很疑惑,p不是应该继承了Function原型里面的属性吗,为什么p.a返回值是undefined呢?
其实,只要仔细想一想就很容易明白了,Person函数才是Function对象的一个实例,所以通过Person.a可以访问到Function
原型里面的属性,但是new Person()返回来的是一个对象,它是Object的一个实例,是没有继承Function的,所以无法访问
Function原型里面的属性。但是,由于在js里面所有对象都是Object的实例,所以,Person函数可以访问到Object原型里面的
属性,Person.b => 'b' 

分析:F能取到a和b

49.关于绑定变量,最正确的做法是(D)

A: < div >{ {value}}< /div >
B:< div ng-bind=“value”>< /div >
C:< div ng-model=“value”>< /div >
D:< div ng-bind=“obj.value”>< /div >

分析:

A:当angular还没加载时,可以将{ {value}}显示出来,用户体验不好
C:ng-model用于将输入框的输入值和变量绑定起来,无法用在div上
剩下的B和D都实现了变量绑定,但是D的实现更好。D的做法将变量绑定在$scope对象的属性上,这样的做法是angularjs 的最佳实践

50.下列代码存在几个变量没有被回收?( D)

A:0个
B:1个
C:2个
D:3个

分析:

1:全局变量i不会被回收

2:全局变量add不会被回收

3:闭包引用的局部变量i不会被回收

51.以下对闭包(closure)理解正确的有 (A B C D)

A: 闭包是指有权访问另一个函数作用域中变量的函数;
B: 函数内再嵌套函数;
C: 内部函数可以引用外层的参数和变量
D: 参数和变量不会被垃圾回收机制回收

52. 以下哪些操作会触发Reflow:(B C)

var obj = document.getElementById(“test”);

A:alert(obj.className)
B:alert(obj.offsetHeight)
C:obj.style.height = “100px”
D:obj.style.color = “red”

下面情况会导致reflow发生

1:改变窗口大小

2:改变文字大小

3:内容的改变,如用户在输入框中敲字

4:激活伪类,如:hover

5:操作class属性

6:脚本操作DOM

7:计算offsetWidth和offsetHeight:只要读取offsetWidth、offsetHeight

8:设置style属性

53. 以下哪些语句触发了隐式的类型转换?(A B D)

A:parseInt(12.34, 10)
B:0 ? 1 : 2
C:2e1 * 0xaa
D:1 + ‘1’

分析:
A选项:parseInt() 函数可解析一个字符串,并返回一个整数。所以说,number类型的12.34发生隐式转换为string。
B选项:三元运算符,会判断?前的表达式为true或者false。所以number类型的0发生了隐式转换为boolean。
+运算发生了字符串的隐式转化。原本number类型的1,和string类型的’1’进行了+运算,连接了字符串。返回’11’。
C选项:e是js里面指数的一种表示形式。也就是10的多少次方。

2e1 等价于 2 *(10^1) = 20
2e2 等价于 2 (10^2)= 200
0xaa是16进制的表示方法。相当于十进制的170。
这里都是number类型,发生了数字的乘法运算:20
170,没有发生类型转换。

54. 内置的可迭代对象?

  • String
  • Array
  • TypedArray
  • Map
  • Set
  • arguments对象

55. 当用户打开一个网页时,想一直停留在当前打开的页面,禁止页面前进和后退,以下正确的是( A D )

A: window.history.forward(1);
B: window.history.back(1);
C: window.history.go(-1);
D: window.history.forward(-1);

56. 将函数参数arguments伪数组转化为真数组的方法:

  1. Array.from(arguments)
  2. Array.prototype.slice.call(arguments)
  3. [...arguments]
  4. Array.prototype.concat.apply([],arguments)

57. 请写出下面ES6代码编译后所生成的ES5代码;

class Person {
    
    
     constructor (name) {
    
    
          this.name = name;
     }
     greet () {
    
    
          console.log(`Hi, my name is ${
      
      this.name}`);
     }
     greetDelay (time) {
    
    
          setTimeout(() => {
    
    
               console.log(`Hi, my name is ${
      
      this.name}`);
          }, time);
     }
}

编译ES5:

 var Person = (function () {
    
    
     function Person (name) {
    
    
          this._name = name;
     }
     Person.prototype.greet = function () {
    
    
          console.log(“Hi, my name is “ + this._name);
     }
     Person.prototype.greetDelay = function (time) {
    
    
          var _this = this;
          setTimeout(function () {
    
    
               console.log(“Hi, my name is “ + _this.name);
          }, time);
     }
})();

猜你喜欢

转载自blog.csdn.net/weixin_43334673/article/details/111569740