19个基本的JavaScript面试问题及答案(都是实用技巧)免费送
简介:
1.使用 typeof bar === \”object\” 来确定 bar 是否是对象的潜在陷阱是什么?如何避免这个陷阱?尽管 typeof bar === \”object\” 是检查 bar 是否对象的可靠方法,令人惊讶的是在JavaScript中 null 也被认为是对象!因此,令大多数开发人员惊讶的是,下面的代码将输出 true (而不是false) 到控制台:
只要清楚这一点,同时检查 bar 是否为 null,就可以很容易地避免问题:
要答全问题,还有其他两件事情值得注意:首先,上述解决方案将返回 false,当 bar 是一个函数的时候。在大多数情况下,这是期望行为,但当你也想对函数返回 true 的话,你可以修改上面的解决方案为:
第二,上述解决方案将返回 true,当 bar 是一个数组(例如,当 var bar = [];)的时候。在大多数情况下,这是期望行为,因为数组是真正的对象,但当你也想对数组返回 false 时,你可以修改上面的解决方案为:
或者,如果你使用jQuery的话:
2.下面的代码将输出什么到控制台,为什么?
由于 a 和 b 都定义在函数的封闭范围内,并且都始于 var关键字,大多数JavaScript开发人员期望 typeof a 和 typeof b 在上面的例子中都是undefined。然而,事实并非如此。这里的问题是,大多数开发人员将语句 var a = b = 3; 错误地理解为是以下声明的简写:
但事实上,var a = b = 3; 实际是以下声明的简写:
因此(如果你不使用严格模式的话),该代码段的输出是:
但是, b 如何才能被定义在封闭函数的范围之外呢?是的,既然语句 var a = b = 3; 是语句 b = 3; 和 var a = b;的简写, b 最终成为了一个全局变量(因为它没有前缀 var 关键字),因此仍然在范围内甚至封闭函数之外。需要注意的是,在严格模式下(即使用 use strict),语句var a = b = 3; 将生成ReferenceError: b is not defined的运行时错误,从而避免任何否则可能会导致的headfakes /bug。 (还是你为什么应该理所当然地在代码中使用 use strict 的最好例子!)3.下面的代码将输出什么到控制台,为什么?
上面的代码将输出以下内容到控制台:
在外部函数中, this 和self 两者都指向了 myObject,因此两者都可以正确地引用和访问 foo。在内部函数中, this 不再指向 myObject。其结果是,this.foo 没有在内部函数中被定义,相反,指向到本地的变量self 保持在范围内,并且可以访问。 (在ECMA 5之前,在内部函数中的this 将指向全局的 window 对象;反之,因为作为ECMA 5,内部函数中的功能this 是未定义的。)4.封装JavaScript源文件的全部内容到一个函数块有什么意义及理由?这是一个越来越普遍的做法,被许多流行的JavaScript库(jQuery,Node.js等)采用。这种技术创建了一个围绕文件全部内容的闭包,也许是最重要的是,创建了一个私有的命名空间,从而有助于避免不同JavaScript模块和库之间潜在的名称冲突。这种技术的另一个特点是,允许一个易于引用的(假设更短的)别名用于全局变量。这通常用于,例如,jQuery插件中。jQuery允许你使用jQuery.noConflict(),来禁用 $ 引用到jQuery命名空间。在完成这项工作之后,你的代码仍然可以使用$ 利用这种闭包技术,如下所示:
5.在JavaScript源文件的开头包含 use strict 有什么意义和好处?对于这个问题,既简要又最重要的答案是,use strict 是一种在JavaScript代码运行时自动实行更严格解析和错误处理的方法。那些被忽略或默默失败了的代码错误,会产生错误或抛出异常。通常而言,这是一个很好的做法。严格模式的一些主要优点包括:
- 使调试更加容易。那些被忽略或默默失败了的代码错误,会产生错误或抛出异常,因此尽早提醒你代码中的问题,你才能更快地指引到它们的源代码。
- 防止意外的全局变量。如果没有严格模式,将值分配给一个未声明的变量会自动创建该名称的全局变量。这是JavaScript中最常见的错误之一。在严格模式下,这样做的话会抛出错误。
- 消除 this 强制。如果没有严格模式,引用null或未定义的值到 this 值会自动强制到全局变量。这可能会导致许多令人头痛的问题和让人恨不得拔自己头发的bug。在严格模式下,引用 null或未定义的 this 值会抛出错误。
- 不允许重复的属性名称或参数值。当检测到对象(例如,var object = {foo: \”bar\”, foo: \”baz\”};)中重复命名的属性,或检测到函数中(例如,function foo(val1, val2, val1){})重复命名的参数时,严格模式会抛出错误,因此捕捉几乎可以肯定是代码中的bug可以避免浪费大量的跟踪时间。
- 使eval() 更安全。在严格模式和非严格模式下,eval() 的行为方式有所不同。最显而易见的是,在严格模式下,变量和声明在 eval() 语句内部的函数不会在包含范围内创建(它们会在非严格模式下的包含范围中被创建,这也是一个常见的问题源)。
- 在 delete使用无效时抛出错误。delete操作符(用于从对象中删除属性)不能用在对象不可配置的属性上。当试图删除一个不可配置的属性时,非严格代码将默默地失败,而严格模式将在这样的情况下抛出异常。
6.考虑以下两个函数。它们会返回相同的东西吗? 为什么相同或为什么不相同?
出人意料的是,这两个函数返回的内容并不相同。更确切地说是:
将产生:
这不仅是令人惊讶,而且特别让人困惑的是, foo2()返回undefined却没有任何错误抛出。原因与这样一个事实有关,即分号在JavaScript中是一个可选项(尽管省略它们通常是非常糟糕的形式)。其结果就是,当碰到 foo2()中包含 return语句的代码行(代码行上没有其他任何代码),分号会立即自动插入到返回语句之后。也不会抛出错误,因为代码的其余部分是完全有效的,即使它没有得到调用或做任何事情(相当于它就是是一个未使用的代码块,定义了等同于字符串 \”hello\”的属性 bar)。这种行为也支持放置左括号于JavaScript代码行的末尾,而不是新代码行开头的约定。正如这里所示,这不仅仅只是JavaScript中的一个风格偏好。7. NaN 是什么?它的类型是什么?你如何可靠地测试一个值是否等于 NaN ?NaN 属性代表一个“不是数字”的值。这个特殊的值是因为运算不能执行而导致的,不能执行的原因要么是因为其中的运算对象之一非数字(例如, \”abc\” / 4),要么是因为运算的结果非数字(例如,除数为零)。虽然这看上去很简单,但 NaN 有一些令人惊讶的特点,如果你不知道它们的话,可能会导致令人头痛的bug。首先,虽然 NaN 意味着“不是数字”,但是它的类型,不管你信不信,是 Number:
此外, NaN 和任何东西比较——甚至是它自己本身!——结果是false:
一种半可靠的方法来测试一个数字是否等于 NaN,是使用内置函数 isNaN(),但即使使用 isNaN() 依然并非是一个完美的解决方案。一个更好的解决办法是使用 value !== value,如果值等于NaN,只会产生true。另外,ES6提供了一个新的 Number.isNaN() 函数,这是一个不同的函数,并且比老的全局 isNaN() 函数更可靠。8.下列代码将输出什么?并解释原因。
一个稍微有点编程基础的回答是:“你不能确定。可能会输出“0.3”和“true”,也可能不会。JavaScript中的数字和浮点精度的处理相同,因此,可能不会总是产生预期的结果。“以上所提供的例子就是一个演示了这个问题的典型例子。但出人意料的是,它会输出:
9.讨论写函数 isInteger(x) 的可能方法,用于确定x是否是整数。这可能听起来是小菜一碟,但事实上,这很琐碎,因为ECMAScript 6引入了一个新的正以此为目的 Number.isInteger() 函数。然而,之前的ECMAScript 6,会更复杂一点,因为没有提供类似的 Number.isInteger() 方法。问题是,在ECMAScript规格说明中,整数只概念上存在:即,数字值总是存储为浮点值。考虑到这一点,最简单又最干净的ECMAScript6之前的解决方法(同时也非常稳健地返回 false ,即使一个非数字的值,如字符串或 null ,被传递给函数)如下:
下面的解决方法也是可行的,虽然不如上面那个方法优雅:
请注意 Math.ceil() 和 Math.floor() 在上面的实现中等同于 Math.round()。或:
相当普遍的一个不正确的解决方案是:
虽然这个以 parseInt函数为基础的方法在 x 取许多值时都能工作良好,但一旦 x 取值相当大的时候,就会无法正常工作。问题在于 parseInt() 在解析数字之前强制其第一个参数到字符串。因此,一旦数目变得足够大,它的字符串就会表达为指数形式(例如, 1e+21)。因此,parseInt() 函数就会去解析 1e+21,但当到达 e字符串的时候,就会停止解析,因此只会返回值 1。注意:
10.下列代码行1-4如何排序,使之能够在执行代码时输出到控制台? 为什么?
序号如下:
让我们先来解释比较明显而易见的那部分:
- 1 和 4之所以放在前面,是因为它们是通过简单调用 console.log() 而没有任何延迟输出的
- 2 之所以放在 3的后面,是因为 2 是延迟了1000毫秒(即,1秒)之后输出的,而 3 是延迟了0毫秒之后输出的。
好的。但是,既然 3 是0毫秒延迟之后输出的,那么是否意味着它是立即输出的呢?如果是的话,那么它是不是应该在 4 之前输出,既然 4 是在第二行输出的?要回答这个问题,你需要正确理解JavaScript的事件和时间设置。浏览器有一个事件循环,会检查事件队列和处理未完成的事件。例如,如果时间发生在后台(例如,脚本的 onload 事件)时,浏览器正忙(例如,处理一个 onclick),那么事件会添加到队列中。当onclick处理程序完成后,检查队列,然后处理该事件(例如,执行 onload 脚本)。同样的, setTimeout() 也会把其引用的函数的执行放到事件队列中,如果浏览器正忙的话。当setTimeout()的第二个参数为0的时候,它的意思是“尽快”执行指定的函数。具体而言,函数的执行会放置在事件队列的下一个计时器开始。但是请注意,这不是立即执行:函数不会被执行除非下一个计时器开始。这就是为什么在上述的例子中,调用 console.log(4) 发生在调用 console.log(3) 之前(因为调用 console.log(3) 是通过setTimeout被调用的,因此会稍微延迟)。11.写一个简单的函数(少于80个字符),要求返回一个布尔值指明字符串是否为回文结构。下面这个函数在 str 是回文结构的时候返回true,否则,返回false。
例如:
12.写一个 sum方法,在使用下面任一语法调用时,都可以正常工作。
(至少)有两种方法可以做到:方法1
在JavaScript中,函数可以提供到 arguments 对象的访问,arguments 对象提供传递到函数的实际参数的访问。这使我们能够使用 length 属性来确定在运行时传递给函数的参数数量。如果传递两个参数,那么只需加在一起,并返回。否则,我们假设它被以 sum(2)(3)这样的形式调用,所以我们返回一个匿名函数,这个匿名函数合并了传递到 sum()的参数和传递给匿名函数的参数。方法2
当调用一个函数的时候,JavaScript不要求参数的数目匹配函数定义中的参数数量。如果传递的参数数量大于函数定义中参数数量,那么多余参数将简单地被忽略。另一方面,如果传递的参数数量小于函数定义中的参数数量,那么缺少的参数在函数中被引用时将会给一个 undefined值。所以,在上面的例子中,简单地检查第2个参数是否未定义,就可以相应地确定函数被调用以及进行的方式。13.请看下面的代码片段:
(a)当用户点击“Button 4”的时候会输出什么到控制台,为什么?(b)提供一个或多个备用的可按预期工作的实现方案。(a)无论用户点击什么按钮,数字5将总会输出到控制台。这是因为,当 onclick 方法被调用(对于任何按钮)的时候, for 循环已经结束,变量 i 已经获得了5的值。(面试者如果能够谈一谈有关如何执行上下文,可变对象,激活对象和内部“范围”属性贡有助于闭包行为,则可以加分)。(b)要让代码工作的关键是,通过传递到一个新创建的函数对象,在每次传递通过 for 循环时,捕捉到 i 值。下面是三种可能实现的方法:
或者,你可以封装全部调用到在新匿名函数中的 btn.addEventListener :
也可以调用数组对象的本地 forEach 方法来替代 for 循环:
14.下面的代码将输出什么到控制台,为什么?
输出结果是:
arr1 和 arr2 在上述代码执行之后,两者相同了,原因是:
- 调用数组对象的 reverse() 方法并不只返回反顺序的阵列,它也反转了数组本身的顺序(即,在这种情况下,指的是 arr1)。
- reverse() 方法返回一个到数组本身的引用(在这种情况下即,arr1)。其结果为,arr2 仅仅是一个到 arr1的引用(而不是副本)。因此,当对 arr2做了任何事情(即当我们调用 arr2.push(arr3);)时,arr1 也会受到影响,因为 arr1 和 arr2 引用的是同一个对象。
这里有几个侧面点有时候会让你在回答这个问题时,阴沟里翻船:传递数组到另一个数组的 push() 方法会让整个数组作为单个元素映射到数组的末端。其结果是,语句 arr2.push(arr3); 在其整体中添加 arr3 作为一个单一的元素到 arr2 的末端(也就是说,它并没有连接两个数组,连接数组是 concat() 方法的目的)。和Python一样,JavaScript标榜数组方法调用中的负数下标,例如 slice() 可作为引用数组末尾元素的方法:例如,-1下标表示数组中的最后一个元素,等等。15.下面的代码将输出什么到控制台,为什么?
上面的代码将输出以下内容到控制台:
原因是…这里的根本问题是,JavaScript(ECMAScript)是一种弱类型语言,它可对值进行自动类型转换,以适应正在执行的操作。让我们通过上面的例子来说明这是如何做到的。例1:1 + \”2\” + \”2\” 输出:\”122\” 说明: 1 + \”2\” 是执行的第一个操作。由于其中一个运算对象(\”2\”)是字符串,JavaScript会假设它需要执行字符串连接,因此,会将 1 的类型转换为 \”1\”, 1 + \”2\”结果就是 \”12\”。然后, \”12\” + \”2\” 就是 \”122\”。例2: 1 + +\”2\” + \”2\” 输出: \”32\” 说明:根据运算的顺序,要执行的第一个运算是 +\”2\”(第一个 \”2\” 前面的额外 + 被视为一元运算符)。因此,JavaScript将 \”2\” 的类型转换为数字,然后应用一元 + 号(即,将其视为一个正数)。其结果是,接下来的运算就是 1 + 2 ,这当然是 3。然后我们需要在一个数字和一个字符串之间进行运算(即, 3 和 \”2\”),同样的,JavaScript会将数值类型转换为字符串,并执行字符串的连接,产生 \”32\”。例3: 1 + -\”1\” + \”2\” 输出: \”02\” 说明:这里的解释和前一个例子相同,除了此处的一元运算符是 – 而不是 +。先是 \”1\” 变为 1,然后当应用 – 时又变为了 -1 ,然后将其与 1相加,结果为 0,再将其转换为字符串,连接最后的 \”2\” 运算对象,得到 \”02\”。例4: +\”1\” + \”1\” + \”2\” 输出: \”112\” 说明:虽然第一个运算对象 \”1\”因为前缀的一元 + 运算符类型转换为数值,但又立即转换回字符串,当连接到第二个运算对象 \”1\” 的时候,然后又和最后的运算对象\”2\” 连接,产生了字符串 \”112\”。例5: \”A\” – \”B\” + \”2\” 输出: \”NaN2\” 说明:由于运算符 – 不能被应用于字符串,并且 \”A\” 和 \”B\” 都不能转换成数值,因此,\”A\” – \”B\”的结果是 NaN,然后再和字符串 \”2\” 连接,得到 \”NaN2\” 。例6: \”A\” – \”B\” + 2 输出: NaN 说明:参见前一个例子, \”A\” – \”B\” 结果为 NaN。但是,应用任何运算符到NaN与其他任何的数字运算对象,结果仍然是 NaN。16.下面的递归代码在数组列表偏大的情况下会导致堆栈溢出。在保留递归模式的基础上,你怎么解决这个问题?
潜在的堆栈溢出可以通过修改nextListItem 函数避免:
堆栈溢出之所以会被消除,是因为事件循环操纵了递归,而不是调用堆栈。当 nextListItem 运行时,如果 item不为空,timeout函数(nextListItem)就会被推到事件队列,该函数退出,因此就清空调用堆栈。当事件队列运行其timeout事件,且进行到下一个 item 时,定时器被设置为再次调用 nextListItem。因此,该方法从头到尾都没有直接的递归调用,所以无论迭代次数的多少,调用堆栈保持清空的状态。17.JavaScript中的“闭包”是什么?请举一个例子。闭包是一个可以访问外部(封闭)函数作用域链中的变量的内部函数。闭包可以访问三种范围中的变量:这三个范围具体为:(1)自己范围内的变量,(2)封闭函数范围内的变量,以及(3)全局变量。下面是一个简单的例子:
在上面的例子中,来自于 innerFunc, outerFunc和全局命名空间的变量都在 innerFunc的范围内。因此,上面的代码将输出如下:
18.下面的代码将输出什么:
解释你的答案。闭包在这里能起什么作用?上面的代码不会按预期显示值0,1,2,3,和4,而是会显示5,5,5,5,和5。原因是,在循环中执行的每个函数将整个循环完成之后被执行,因此,将会引用存储在 i中的最后一个值,那就是5。闭包可以通过为每次迭代创建一个唯一的范围,存储范围内变量的每个唯一的值,来防止这个问题,如下:
这就会按预期输出0,1,2,3,和4到控制台。19.以下代码行将输出什么到控制台?
并解释。该代码将输出:
在JavaScript中, || 和 &&都是逻辑运算符,用于在从左至右计算时,返回第一个可完全确定的“逻辑值”。或( || )运算符。在形如 X||Y的表达式中,首先计算X 并将其解释执行为一个布尔值。如果这个布尔值true,那么返回true(1),不再计算 Y,因为“或”的条件已经满足。如果这个布尔值为false,那么我们仍然不能知道 X||Y是真是假,直到我们计算 Y,并且也把它解释执行为一个布尔值。因此, 0 || 1 的计算结果为true(1),同理计算1 || 2。与( &&)运算符。在形如 X&&Y的表达式中,首先计算 X并将其解释执行为一个布尔值。如果这个布尔值为 false,那么返回 false(0),不再计算 Y,因为“与”的条件已经失败。如果这个布尔值为true,但是,我们仍然不知道 X&&Y 是真是假,直到我们去计算 Y,并且也把它解释执行为一个布尔值。不过,关于 &&运算符有趣的地方在于,当一个表达式计算为“true”的时候,那么就返回表达式本身。这很好,虽然它在逻辑表达式方面计算为“真”,但如果你希望的话也可用于返回该值。这就解释了为什么,有些令人奇怪的是, 1 && 2返回 2(而不是你以为的可能返回 true 或 1)。20.执行下面的代码时将输出什么?请解释。
代码将输出:
在JavaScript中,有两种等式运算符。三个等于运算符 === 的作用类似传统的等于运算符:如果两侧的表达式有着相同的类型和相同的值,那么计算结果为true。而双等于运算符,会只强制比较它们的值。因此,总体上而言,使用 ===而不是 ==的做法更好。 !==vs !=亦是同理
需要观看python? java? web 资料的:
老规矩:转发+关注,私信小编“资料”免费分享资料给你!
3 个高级 JavaScript 面试问题
在本篇文章中,我将分享 3 个高级 JavaScript 面试问题,这些是我在面试中经常问的问题。这类问题通常针对那些高级开发人员。
描述事件循环及其在 JavaScript 异步编程中的作用。
事件循环是 JavaScript 环境中不断检查栈中任务是否要执行的机制。当一个同步任务完成后,事件循环会检查调用栈。如果栈为空,它会检查事件队列中是否有待处理的异步操作(如回调函数或已解决的 Promise)。如果有,事件循环会将相应的函数推入调用栈并执行它。这个过程重复进行,创建了一个非阻塞的执行模型。
示例:
输出:
在以上示例中:
- \”Start\” 先被打印,因为它在主线程上执行。
- setTimeout 函数设置了一个 1 秒的计时器,并将回调函数交给事件循环处理。
- \”End\” 紧接着被打印,因为计时器尚未完成。
- 1 秒后,事件循环取回 setTimeout 的回调函数并执行,打印 \”Callback\”。
这种行为源于 JavaScript 的非阻塞、异步特性。事件循环允许主线程在等待异步操作完成时继续运行,避免了阻塞。
解释变量和函数的提升(Hoisting)机制。
提升是 JavaScript 中的一种行为,在编译阶段,变量和函数声明会被移到各自作用域的顶部(无论是函数作用域还是全局作用域),甚至在代码执行之前。这意味着你可以在声明之前使用变量和函数。
不过,变量的值在被赋值之前会被初始化为 undefined。
变量提升:
在以上示例中,x 的声明被提升到了顶部,但尚未初始化。因此,打印的结果是 undefined,而不是 15。
这是 JavaScript 在背后执行的代码机制。
函数提升:
函数声明也会被提升,但与 var 不同,它们在提升时会被完全初始化。这意味着你可以在函数声明之前调用它。
示例 1:
示例 2:
在这个例子中,函数表达式通过变量声明,因此不会完全被提升。
注意:使用 var 声明的变量会被提升,而 let 和 const 声明的变量不会被提升。
解释原型继承。
原型是 JavaScript 的核心概念,它允许任意对象从其他对象继承属性和方法。原型本质上是一个对象,作为新对象的模板。当我们创建一个对象时,它会从其原型对象(即 Object)继承属性和方法。
每个对象都有一个特殊属性 __proto__(内部为 [[Prototype]]),它指向另一个对象,从而形成一个原型链。这种机制帮助对象共享行为,而无需显式定义它们。
示例:
在此示例中,john 继承了 Person.prototype 中的 greet 方法。这个方法并没有直接定义在 john 对象上,但可以通过原型链访问。
这些高级 JavaScript 面试问题旨在评估候选人对 JavaScript 深层机制的理解,帮助我们识别那些能够有效参与现代 JavaScript 项目的开发人员。
这些面试问题仅涵盖了部分内容。在实际面试中,你可能会遇到更多问题,或者遇到不同的问题。
欢迎关注,感谢阅读!
Top 57个JavaScript面试题和答案大全
近年来,从事JavaScript的程序员越来越多,JavaScript的曝光率也越来越高,如果你想转行试试JavaScript,不妨收下这份面试题及答案,没准用得上。当然,如果针对这些问题,你有更棒的答案,欢迎移步至评论区。
1、什么是JavaScript?(这是基本题,对很多程序员来说也是送分题!)
JavaScript是客户端和服务器端脚本语言,可以插入到HTML页面中,并且是目前较热门的Web开发语言。同时,JavaScript也是面向对象编程语言。
类似的基本题目还包括:JavaScript都有哪些类型?JavaScript是谁发明的?……
2、列举Java和JavaScript之间的区别?
Java是一门十分完整、成熟的编程语言。相比之下,JavaScript是一个可以被引入HTML页面的编程语言。这两种语言并不完全相互依赖,而是针对不同的意图而设计的。 Java是一种面向对象编程(OOPS)或结构化编程语言,类似的如C ++或C,而JavaScript是客户端脚本语言,它被称为非结构化编程。
3. JavaScript和ASP脚本相比,哪个更快?
JavaScript更快。JavaScript是一种客户端语言,因此它不需要Web服务器的协助来执行。另一方面,ASP是服务器端语言,因此总是比JavaScript慢。值得注意的是,Javascript现在也可用于服务器端语言(nodejs)。
4、什么是负无穷大?
负无穷大是JavaScript中的一个数字,可以通过将负数除以零来得到。
5、如何将JavaScript代码分解成几行吗?
在字符串语句中可以通过在第一行末尾使用反斜杠“\\”来完成
例:document.write(\”This is \\a program\”);
如果不是在字符串语句中更改为新行,那么javaScript会忽略行中的断点。
例:
var x=1, y=2,
z=
x+y;
上面的代码是完美的,但并不建议这样做,因为阻碍了调试。
6、什么是未声明和未定义的变量?
未声明的变量是程序中不存在且未声明的变量。如果程序尝试读取未声明变量的值,则会遇到运行时错误。未定义的变量是在程序中声明但尚未给出任何值的变量。如果程序尝试读取未定义变量的值,则返回未定义的值。
7、如何编写可动态添加新元素的代码?
8、什么是全局变量?这些变量如何声明,使用全局变量有哪些问题?
全局变量是整个代码长度可用的变量,也就是说这些变量没有任何作用域。var关键字用于声明局部变量或对象。如果省略var关键字,则声明一个全局变量。
例:// Declare a global globalVariable = “Test”;
使用全局变量所面临的问题是本地和全局变量名称的冲突。此外,很难调试和测试依赖于全局变量的代码。
9、解释JavaScript中定时器的工作?如果有,也可以说明使用定时器的缺点?
定时器用于在设定的时间执行一段代码,或者在给定的时间间隔内重复该代码。这通过使用函数setTimeout,setInterval和clearInterval来完成。
-
setTimeout(function,delay)函数用于启动在所述延迟之后调用特定功能的定时器。
-
setInterval(function,delay)函数用于在提到的延迟中重复执行给定的功能,只有在取消时才停止。
-
clearInterval(id)函数指示定时器停止。
定时器在一个线程内运行,因此事件可能需要排队等待执行。
10、ViewState和SessionState有什么区别?
“ViewState”特定于会话中的页面。
“SessionState”特定于可在Web应用程序中的所有页面问的用户特定数据。
11、什么是===运算符?
===被称为严格等式运算符,当两个操作数具有相同的值而没有任何类型转换时,该运算符返回true。
12、说明如何使用JavaScript提交表单?
要使用JavaScript提交表单,请使用
document.form [0] .submit();
document.form [0] .submit()
13、元素的样式/类如何改变?
可以通过以下方式完成:
document.getElementById(“myText”).style.fontSize = “20?;
或
document.getElementById(“myText”).className = “anyclass”;
14、JavaScript中的循环结构都有什么?
For、While、do-while loops
15、如何在JavaScript中将base字符串转换为integer?
parseInt() 函数解析一个字符串参数,并返回一个指定基数的整数。parseInt()将要转换的字符串作为其第一个参数,第二个参数是给定字符串的基础。
为了将4F(基数16)转换为整数,所使用的代码是 :parseInt (\”4F\”, 16);
16、说明“==”和“===”之间的区别?
“==”仅检查值相等,而“===”是一个更严格的等式判定,如果两个变量的值或类型不同,则返回false。
17、3 + 2 +“7”的结果是什么?
由于3和2是整数,它们将直接相加。由于7是一个字符串,它将会被直接连接,所以结果将是57。
18、说明如何检测客户端机器上的操作系统?
为了检测客户端机器上的操作系统,应使用navigator.appVersion字符串(属性)。
19、Javascript中的NULL是什么意思?
NULL用于表示无值或无对象。它意味着没有对象或空字符串,没有有效的布尔值,没有数值和数组对象。
20、delete操作符的功能是什么?
delete操作符用于删除程序中的所有变量或对象,但不能删除使用VAR关键字声明的变量。
21、JavaScript中有哪些类型的弹出框?
Alert、Confirm and、Prompt
22、Void(0)怎么用?
-
Void(0)用于防止页面刷新,并在调用时传递参数“zero”。
-
Void(0)用于调用另一种方法而不刷新页面。
23、如何强制页面加载JavaScript中的其他页面?
必须插入以下代码才能达到预期效果:
24、escape字符是用来做什么的?
使用特殊字符(如单引号,双引号,撇号和&符号)时,将使用转义字符(反斜杠)。在字符前放置反斜杠,使其显示。
例:
25、什么是JavaScript Cookie?
Cookie是用来存储计算机中的小型测试文件,当用户访问网站以存储他们需要的信息时,它将被创建。
26、解释JavaScript中的pop()方法?
pop()方法与shift()方法类似,但不同之处在于Shift方法在数组的开头工作。此外,pop()方法将最后一个元素从给定的数组中取出并返回。然后改变被调用的数组。
例:
var cloths = [“Shirt”, “Pant”, “TShirt”];
cloths.pop();
//Now cloth becomes Shirt,Pant
27、在JavaScript中使用innerHTML的缺点是什么?
如果在JavaScript中使用innerHTML,缺点是:内容随处可见;不能像“追加到innerHTML”一样使用;即使你使用+ = like“innerHTML = innerHTML +\’html\’”旧的内容仍然会被html替换;整个innerHTML内容被重新解析并构建成元素,因此它的速度要慢得多;innerHTML不提供验证,因此我们可能会在文档中插入有效的和破坏性的HTML并将其中断。
28、break和continue语句的作用?
-
Break语句从当前循环中退出。
-
continue语句继续下一个循环语句。
29、在JavaScript中,dataypes的两个基本组是什么?
-
Primitive
-
Reference types
原始类型是数字和布尔数据类型。引用类型是更复杂的类型,如字符串和日期。
30、如何创建通用对象?
通用对象可以创建为:
var I = new object();
31、operator类型用来做什么?
\’Typeof\’是一个运算符,用于返回变量类型的字符串描述。
32、哪些关键字用于处理异常?
try… Catch-finally用于处理JavaScript中的异常。
33、JavaScript中不同类型的错误有几种?
有三种类型的错误:
-
Load time errors:该错误发生于加载网页时,例如出现语法错误等状况,称为加载时间错误,并且会动态生成错误。
-
Run time errors:由于在HTML语言中滥用命令而导致的错误。
-
Logical Errors:这是由于在具有不同操作的函数上执行了错误逻辑而发生的错误。
34、在JavaScript中使用的Push方法是什么?
push方法用于将一个或多个元素添加或附加到数组的末尾。使用这种方法,可以通过传递多个参数来附加多个元素。
35、什么是JavaScript中的unshift方法?
Unshift方法就像在数组开头工作的push方法。该方法用于将一个或多个元素添加到数组的开头。
36、对象属性如何分配?
属性按以下方式分配给对象:
obj[\”class\”] = 12;
或
obj.class = 12;
37、获得CheckBox状态的方式是什么?
alert(document.getElementById(\’checkbox1\’)。checked);
如果CheckBox被检查,此警报将返回TRUE。
38、解释window.onload和onDocumentReady?
在载入页面的所有信息之前,不运行onload函数。这导致在执行任何代码之前会出现延迟。
onDocumentReady在加载DOM之后加载代码。这允许早期的代码操纵。
39、你将如何解释JavaScript中的闭包? 什么时候使用?
Closure是与函数返回时保留在内存中的函数相关的本地声明变量。
例如:
40、一个值如何附加到数组?
可以以给定的方式将值附加到数组:
arr [arr.length] = value;
41、解释for-in循环?
for-in循环用于循环对象的属性。
for-in循环的语法是:
在每次循环中,来自对象的一个属性与变量名相关联,循环继续,直到对象的所有属性都被耗尽。
42、描述JavaScript中的匿名函数?
被声明为没有任何命名标识符的函数被称为匿名函数。一般来说,匿名函数在声明后无法访问。
匿名函数声明:
43、.call()和.apply()之间有什么区别?
函数.call()和.apply()在使用上非常相似,只是有一点区别。当程序员知道函数参数的编号时,使用.call(),因为它们必须在调用语句中被提及为参数。另一方面,当不知道数字时使用.apply(),函数.apply()期望参数为数组。
.call()和.apply()之间的基本区别在于将参数传递给函数。它们的用法可以通过给定的例子进行说明。
44、定义事件冒泡?
JavaScript允许DOM元素嵌套在一起。在这种情况下,如果单击子级的处理程序,父级的处理程序也将执行同样的工作。
45、什么样的布尔运算符可以在JavaScript中使用?
“And”运算符(&&),\’Or\’运算符(||)和\’Not\’运算符(!)可以在JavaScript中使用。
*运算符没有括号。
46、一个特定的框架如何使用JavaScript中的超链接定位?
可以通过使用“target”属性在超链接中包含所需帧的名称来实现。
<a href=”newpage.htm” target=”newframe”>>New Page</a>
47、在web-garden和web-farm之间有何不同?
web-garden和web-farm都是网络托管系统。唯一的区别是web-garden是在单个服务器中包含许多处理器的设置,而web-farm是使用多个服务器的较大设置。
48、如何分配对象属性?
将属性分配给对象的方式与赋值给变量值相同。例如,表单对象的操作值以下列方式分配为“‘submit”:Document.form.action =“submit”
49、在JavaScript中读取和写入文件的方法是什么?
可以通过使用JavaScript扩展(从JavaScript编辑器运行),打开文件的示例来完成:
fh = fopen(getScriptPath(), 0);
50、在JavaScript中如何使用DOM?
DOM代表文档对象模型,并且负责文档中各种对象的相互交互。DOM是开发网页所必需的,其中包括诸如段落,链接等对象。可以操作这些对象以包括添加或删除等操作,DOM还需要向网页添加额外的功能。除此之外,API的使用比其他更有优势。
51、JavaScript中如何使用事件处理程序?
事件是由用户生成活动(例如单击链接或填写表单)导致的操作。需要一个事件处理程序来管理所有这些事件的正确执行。事件处理程序是对象的额外属性。此属性包括事件的名称以及事件发生时采取的操作。
52、解释延迟脚本在JavaScript中的作用?
默认情况下,在页面加载期间,HTML代码的解析将暂停,直到脚本停止执行。这意味着,如果服务器速度较慢或者脚本特别沉重,则会导致网页延迟。在使用Deferred时,脚本会延迟执行直到HTML解析器运行。这减少了网页加载时间,并且它们的显示速度更快。
53、JavaScript中的各种功能组件是什么?
JavaScript中的不同功能组件是:
-
First-class函数:JavaScript中的函数被用作第一类对象。这通常意味着这些函数可以作为参数传递给其他函数,作为其他函数的值返回,分配给变量,也可以存储在数据结构中。
-
嵌套函数:在其他函数中定义的函数称为嵌套函数。
54、解释unshift()方法?
该方法在数组启动时起作用,与push()不同。 它将所需数量的元素添加到数组的顶部。例如:
输出如下所示:
[\” joseph \”,\” Jane \”, \” charlie \”, \” john \”]
55、decodeURI()和encodeURI()是什么?
EncodeURl()用于将URL转换为十六进制编码。而DecodeURI()用于将编码的URL转换回正常。
56、为什么不建议在JavaScript中使用innerHTML?
innerHTML内容每次刷新,因此很慢。 在innerHTML中没有验证的余地,因此,更容易在文档中插入错误代码,从而使网页不稳定。
57、如何在不支持JavaScript的旧浏览器中隐藏JavaScript代码?
-
在<script>标签之后的代码中添加“<! – ”,不带引号。
-
在<script>标签之前添加“// – >”代码中没有引号。
-
旧浏览器现在将JavaScript代码视为一个长的HTML注释。而支持JavaScript的浏览器则将“<! – ”和“// – >”作为一行注释。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。