天天看点

14万字 | 400多道JavaScript 面试题及详细答案10(建议收藏)

218.get 和defineProperty 有什么区别?

除非您使用类,否则两者都有相似的结果。如果您使用get该属性将在对象的原型上定义,而使用Object.defineProperty()该属性将在它应用到的实例上定义。

219.Getter 和 Setter 的优点是什么?

以下是 Getter 和 Setter 的好处列表,

1.它们提供更简单的语法

2.它们用于定义计算属性或 JS 中的访问器。

3.用于提供属性和方法之间的等价关系

4.他们可以提供更好的数据质量

5.对于使用封装的逻辑在幕后做事很有用。

220.我可以使用defineProperty方法添加 getter 和 setter 吗?

是的,您可以使用该Object.defineProperty()方法添加 Getter 和 Setter。例如,下面的计数器对象使用递增、递减、加减属性,

var obj = {counter : 0};
 // Define getters
 Object.defineProperty(obj, "increment", {
   get : function () {this.counter++;}
 });
 Object.defineProperty(obj, "decrement", {
   get : function () {this.counter--;}
 });
 // Define setters
 Object.defineProperty(obj, "add", {
   set : function (value) {this.counter += value;}
 });
 Object.defineProperty(obj, "subtract", {
   set : function (value) {this.counter -= value;}
 });
 obj.add = 10;
 obj.subtract = 5;
 console.log(obj.increment); //6
 console.log(obj.decrement); //5      

221.switch-case 的目的是什么?

JavaScript 中的 switch case 语句用于决策目的。在某些情况下,使用 switch case 语句会比 if-else 语句更方便。语法如下,

switch (expression)
 {
     case value1:
         statement1;
         break;
     case value2:
         statement2;
         break;
     .
     .
     case valueN:
         statementN;
         break;
     default:
         statementDefault;
 }      

上面的多路分支语句提供了一种简单的方法,可以根据表达式的值将执行分派到代码的不同部分。

222.使用 swtich case 需要遵循什么规定?

以下是应注意的规定列表,

1.表达式可以是数字或字符串类型。

2.表达式不允许重复值。

3.默认语句是可选的。如果传递给 switch 的表达式与任何 case 值都不匹配,则将执行 default case 中的语句。

4.break 语句在 switch 中用于终止语句序列。

5.break 语句是可选的。但如果省略,执行将继续到下一个案例。

223.什么是原始数据类型?

原始数据类型是具有原始值(没有属性或方法)的数据。有 7 种原始数据类型。

1.string

2.number

3.boolean

4.null

5.undefined

6.bigint

7.symbol

224.访问对象属性的不同方式有哪些?

有 3 种可能的方法来访问对象的属性。

点符号:它使用点来访问属性

objectName.property

1

方括号表示法:它使用方括号进行属性访问

objectName["property"]

表达式符号:它使用方括号中的表达式

objectName[expression]

225.什么是函数参数规则?

JavaScript 函数遵循以下参数规则,

1.函数定义不指定参数的数据类型。

2.不要对传递的参数执行类型检查。

3.不要检查收到的参数数量。即,以下函数遵循上述规则,

function functionName(parameter1, parameter2, parameter3) {

  console.log(parameter1); // 1

}

functionName(1);

226.什么是错误对象?

错误对象是一个内置的错误对象,它在发生错误时提供错误信息。它有两个属性:名称和消息。例如,以下函数记录错误详细信息,

try {

  greeting("Welcome");

catch(err) {

  console.log(err.name + "<br>" + err.message);

227.当你收到语法错误时

如果您尝试评估具有语法错误的代码,则会引发 SyntaxError。例如,下面缺少的函数参数引用会引发语法错误

  eval("greeting('welcome)");   // Missing ' will produce an error

  console.log(err.name);

228.错误对象有哪些不同的错误名称?

错误对象返回了 6 种不同类型的错误名称,

错误名称 说明

EvalError eval() 函数发生错误

RangeError 数字“超出范围”发生错误

ReferenceError 由于非法引用而导致的错误

SyntaxError 语法错误导致的错误

TypeError 类型错误导致的错误

URIError  

229.错误处理中的各种语句是什么?

以下是错误处理中使用的语句列表,

1.try:该语句用于测试代码块是否有错误

2.catch:该语句用于处理错误

3.throw:此语句用于创建自定义错误。

4.finally:该语句用于在 try 和 catch 之后执行代码,而不管结果如何。

230.javascript中的两种类型的循环是什么?

1.进入Controlled Loops受控循环:在这种循环类型中,在进入循环体之前测试测试条件。例如,For 循环和 While 循环就属于这一类。

2.退出 Controlled Loops:在这种循环类型中,测试条件在循环体的末尾进行测试或评估。即,无论测试条件为真还是假,循环体都将至少执行一次。例如,do-while 循环就属于这一类。

231.什么是 nodejs?

Node.js 是一个基于 Chrome 的 JavaScript 运行时构建的服务器端平台,用于轻松构建快速且可扩展的网络应用程序。它是一个基于事件的、非阻塞的、异步的 I/O 运行时,使用谷歌的 V8 JavaScript 引擎和 libuv 库。

232.什么是 Intl 对象?

Intl 对象是 ECMAScript 国际化 API 的命名空间,它提供语言敏感的字符串比较、数字格式以及日期和时间格式。它提供对几个构造函数和语言敏感函数的访问。

233.你如何执行特定于语言的日期和时间格式化?

您可以使用Intl.DateTimeFormat对象,它是启用语言敏感日期和时间格式的对象的构造函数。让我们用一个例子来看看这个行为,

var date = new Date(Date.UTC(2019, 07, 07, 3, 0, 0));

console.log(new Intl.DateTimeFormat('en-GB').format(date)); // 07/08/2019

console.log(new Intl.DateTimeFormat('en-AU').format(date)); // 07/08/2019

234.什么是迭代器?

迭代器是一个对象,它在终止时定义一个序列和一个返回值。它使用一个next()方法实现迭代器协议,该方法返回一个具有两个属性的对象:(value序列中的下一个值)和done(如果序列中的最后一个值已被消耗,则为真)。

235.同步迭代是如何工作的?

ES6 中引入了同步迭代,它适用于以下组件集,

Iterable:它是一个可以通过其键为 Symbol.iterator 的方法迭代的对象。

迭代器:它是通过调用[Symbol.iterator]()可迭代对象返回的对象。这个迭代器对象将每个迭代的元素包装在一个对象中,并通过next()方法一一返回。

IteratorResult:next()方法返回的对象。该对象包含两个属性;该value属性包含一个迭代元素,该done属性确定该元素是否是最后一个元素。

让我们用下面的数组演示同步迭代,

const iterable = ['one', 'two', 'three'];
 const iterator = iterable[Symbol.iterator]();
 console.log(iterator.next());  // { value: 'one', done: false }
 console.log(iterator.next());  // { value: 'two', done: false }
 console.log(iterator.next());  // { value: 'three', done: false }
 console.log(iterator.next());  // { value: 'undefined, done: true }      

236.什么是事件循环?

事件循环是一个回调函数队列。当异步函数执行时,回调函数被推入队列。JavaScript 引擎在异步函数执行完代码之前不会开始处理事件循环。

注意:即使 JavaScript 是单线程的,它也允许 Node.js 执行非阻塞 I/O 操作。

237.什么是调用栈?

调用堆栈是 javascript 解释器的一种数据结构,用于跟踪程序中的函数调用。它有两个主要动作,

1.每当你调用一个函数来执行它时,你就是在将它压入堆栈。

2.每当执行完成时,函数就会从堆栈中弹出。

让我们举个例子,它是图表格式的状态表示

function hungry() {
    eatFruits();
 }
 function eatFruits() {
    return "I'm eating fruits";
 }
 // Invoke the `hungry` function
 hungry();      

上面的代码在调用堆栈中处理如下,

1.将hungry()函数添加到调用堆栈列表并执行代码。

2.将eatFruits()函数添加到调用堆栈列表并执行代码。

3.eatFruits()从我们的调用堆栈列表中删除该函数。

4.hungry()从调用堆栈列表中删除该函数,因为不再有项目。

238.什么是事件队列?

对消息或事件的发送与处理进行时间上的解耦。通俗地讲就是在队列中按先入先出的顺序存储一系列通知或请求。 发送通知时,将请求放入队列并返回。 处理请求的系统之后稍晚从队列中获取请求并处理。

返回顶部

回到第100题

回到第200题

239.什么是装饰器?

装饰器是一个表达式,其计算结果为函数,并将目标、名称和装饰器描述符作为参数。此外,它还可以选择返回一个装饰器描述符以安装在目标对象上。让我们在设计时为用户类定义管理装饰器,

function admin(isAdmin) {
    return function(target) {
        target.isAdmin = isAdmin;
    }
 }
 @admin(true)
 class User() {
 }
 console.log(User.isAdmin); //true
  @admin(false)
  class User() {
  }
  console.log(User.isAdmin); //false      

继续阅读