17. 解释一下JS的展开操作符?

展开运算符在需要多个参数/变量/元素的位置展开表达式,它用三个点(…)。 如:

var mid = [3, 4];
var newarray = [1, 2, ...mid, 5, 6]; 
console.log(newarray); // [1, 2, 3, 4, 5, 6]

18. JS中的宿主对象与原生对象有何不同?

宿主对象象:这些是运行环境提供的对象。这意味着它们在不同的环境下是不同 的。例如,浏览器包含像windows这样的对象,但是Node.js环境提供像 Node List这样的对象。
原生对象:这些是JS中的内置对象。它们也被称为全局对象,因为如果使用JS, 内置对象不受是运行环境影响。

19. 解释JS中的高阶函数?

高阶函数是JS函数式编程的最佳特性。它是以函数为参数并返回函数作为结果 的函数。一些内置的高阶函数是map、filter、reduce 等等。

20. JS 中 == 和 === 区别是什么?

  1. 对于string,number等基础类型,== 和 ===有区别
    1)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等, ===如果类型不同,其结果就是不等。
    2)同类型比较,直接进行“值”比较,两者结果一样。
  2. 对于Array,Object等高级类型,== 和===没有区别进行“指针地址”比较。
  3. 基础类型与高级类型,=有区别
    1)对于==,将高级转化为基础类型,进行“值”比较。
    2)因为类型不同,===结果为false

21. JS中的匿名函数是什么?

匿名函数:就是没有函数名的函数,如:

(function(x, y){
		 alert(x + y); 
	})(2, 3);

这里创建了一个匿名函数(在第一个括号内),第二个括号用于调用该匿名函数, 并传入参数。

22. 是否可以在JS中执行301重定向?

JS完全运行在客户端上。301是服务器作为响应发送的响应代码。因此,在JS 中不可能执行301重定向。

23. 解释JS中的事件冒泡和事件捕获

事件捕获和冒泡: 在html DOM API中,有两种事件传播方法,它们决定了接收 事件的顺序。两种方法是事件冒泡和事件捕获。第一个方法事件冒泡将事件指向 其预期的目标,第二个方法称为事件捕获,其中事件向下到达元素。

事件捕获捕获过程很少被使用,但是当它被使用时,它被证明是非常有用的。这个过程也 称为滴流模式。在这个过程中,事件首先由最外层的元素捕获,然后传播到最内 部的元素。

例如:

<div> 
	<ul>
		<li></li>
	</ul> 
</div>

从上面的示例中,假设单击事件发生在li元素中,在这种情况下,捕获事件将首 先处理div,然后处理ul,最后命中目标元素li。

事件冒泡
冒泡的工作原理与冒泡类似,事件由最内部的元素处理,然后传播到外部元素。

<div> 
	<ul>
		<li></li>
	</ul> 
</div>

从上面的例子中,假设click事件确实发生在冒泡模型中的li元素中,该事件将首 先由li处理,然后由ul处理,最后由div元素处理。

23. 如何将文件的所有导出作为一个对象?

import * as objectname from ‘./file.js’用于将所有导出的成员导入为对 象。 可以使用对象的点(.)运算符来访问导出的变量或方法,如:

objectname.member1; 
objectname.member2;
 objectname.memberfunc();

24. 解释一下什么是箭头函数?

箭头函数是在es6或更高版本中编写函数表达式的简明方法。箭头函数不能用作 构造函数,也不支持this,arguments,super或new.target关键字,它最适 合非方法函数。 通常,箭头函数看起来像 const function_name =()=> {}。

const greet=()=>{console.log('hello');} greet();

25. 解释 JS 中的函数提升

JS允许将声明移动到顶部的默认行为称为提升。JS中创建函数的两种方法是函 数声明和函数表达式。
函数声明
具有特定参数的函数称为函数声明,在JS中创建变量称为声明。如:

hoisted(); // logs 
"foo" function hoisted()
 { console.log('foo'); 
 }

函数表达式
当使用表达式创建函数时,称为函数表达式。如:

notHoisted(); // TypeError: notHoisted is not a function
 var notHoisted = function() { console.log('bar'); };

26. module.exports 和 exports 之间有什么区别?

module和exports是Node.js给每个js文件内置的两个对象。可以通过 console.log(module)和console.log(exports)打印出来。如果你在main.js 中写入下面两行,然后运行$ node main.js:

console.log(exports);//输出:{} 
console.log(module);//输出:Module {..., exports: {}, ...} 
(注:...代表省略了其他一些属性)

从打印咱们可以看出,module.exports和exports一开始都是一个空对象{}, 实际上,这两个对象指向同一块内存。这也就是说module.exports和exports 是等价的(有个前提:不去改变它们指向的内存地址)。
例如:exports.age = 18和module.export.age = 18,这两种写法是一致的 (都相当于给最初的空对象{}添加了一个属性,通过require得到的就是{age: 18})

27. import 和 exports 是什么?

import和exports 帮助咱们编写模块化的JS代码。使用import和exports,咱 们可以将代码分割成多个文件。import只允许获取文件的某些特定变量或方 法。可以导入模块导出的方法或变量。

//index.js 
import name,age from './person';
 console.log(name); 
 console.log(age); 
 //person.js 
 let name ='Sharad', 
 occupation='developer', 
 age =26; export { name, age};

28. 列出一些单元测试框架

下面是一些最流行的JS单元测试框架:
Unit.js
Jasmine
Karma
Chai
AVA
Mocha
JSUnit
QUnit
Jest

29. JS中有哪些不同类型的弹出框可用

在JS中有三种类型的弹出框可用,分别是:
Alert
Confirm
Prompt

30. 如何将 JS 日期转换为ISO标准

**toISOString()**方法用于将js日期转换为ISO标准。 它使用ISO标准将js Date对象转换为字符串。如:

var date = new Date(); 
var n = date.toISOString();
 console.log(n);
  // YYYY­MM­DDTHH:mm:ss.sssZ

31. 如何在JS中克隆对象

Object.assign() 方法用于在JS中克隆对象。如:

var x = {myProp: "value"}; 
var y = Object.assign({}, x);

32. 如何在JS中编码和解码 URL

encodeURI() 函数用于在JS中对URL进行编码。它将url字符串作为参数并返 回编码的字符串。
注意: encodeURI()不会编码类似这样字符: / ? : @ & = + $ #,如果需 要编码这些字符,请使用encodeURIComponent()。

用法:

var uri = "my profile.php?name=sammer&occupation=pāntiNG"; 
var encoded_uri = encodeURI(uri);

decodeURI() 函数用于解码js中的URL。它将编码的url字符串作为参数并返 回已解码的字符串,用法:

var uri = "my profile.php?name=sammer&occupation=pāntiNG"; var encoded_uri = encodeURI(uri); decodeURI(encoded_uri);