平时遇到的JS笔试题

1.下面代码的输出是什么?数组

for (var i = 0; i < 3; i++) {
        setTimeout(() => console.log(i), 1);
    }

    for (let i = 0; i < 3; i++) {
      setTimeout(() => console.log(i), 1);
    }
答案:
因为JavaScript中的事件执行机制,setTimeout函数真正被执行时,循环已经走完。
因为第一个循环中的变量i是使用var关键字声明的,所以该值是全局的。 在循环期间,咱们每次使用一元运算符++都会将i的值增长1。
所以在第一个例子中,当调用setTimeout函数时,i已经被赋值为3。
在第二个循环中,使用let关键字声明变量i:使用let(和const)关键字声明的变量是具备块做用域的(块是{}之间的任何东西)。
在每次迭代期间,i将被建立为一个新值,而且每一个值都会存在于循环内的块级做用域。

2.下面代码的输出是什么?函数

const shape = {
      radius: 10,
      diameter() {
        return this.radius * 2
     },
      perimeter: () => 2 * Math.PI * this.radius 
    };
    
    shape.diameter();
    shape.perimeter();
请注意,diameter是普通函数,而perimeter是箭头函数。
对于箭头函数,this关键字指向是它所在上下文(定义时的位置)的环境,与普通函数不一样!
这意味着当咱们调用perimeter时,它不是指向shape对象,而是指其定义时的环境(window)。没有值radius属性,返回undefined。

3.下面代码的输出是什么?this

+true;
    !"Lydia";
一元加号会尝试将boolean类型转换为数字类型。 true被转换为1,false被转换为0。

字符串'Lydia'是一个真值。 咱们实际上要问的是“这个真值是假的吗?”。 这会返回false。日志

4.下面代码的输出是什么?code

function checkAge(data) {
  if (data === { age: 18 }) {
    console.log("You are an adult!");
  } else if (data == { age: 18 }) {
    console.log("You are still an adult.");
  } else {
    console.log(`Hmm.. You don't have an age I guess`);
  }
}

checkAge({ age: 18 });
在比较相等性,原始类型经过它们的值进行比较,而对象经过它们的引用进行比较。JavaScript检查对象是否具备对内存中相同位置的引用。
咱们做为参数传递的对象和咱们用于检查相等性的对象在内存中位于不一样位置,因此它们的引用是不一样的。 这就是为何{ age: 18 } ===
{ age: 18 }和 { age: 18 } == { age: 18 } 返回 false的缘由。

5.下面代码的输出是什么?对象

function getAge(...args) {
  console.log(typeof args);
}

getAge(21);
扩展运算符(... args)返回一个带参数的数组。 数组是一个对象,所以typeof args返回object

6.下面代码的输出是什么?事件

const obj = { 1: "a", 2: "b", 3: "c" };
const set = new Set([1, 2, 3, 4, 5]);

obj.hasOwnProperty("1");
obj.hasOwnProperty(1);
set.has("1");
set.has(1);
全部对象键(不包括Symbols)都会被存储为字符串,即便你没有给定字符串类型的键。
这就是为何obj.hasOwnProperty('1')也返回true。 上面的说法不适用于Set。
在咱们的Set中没有“1”:set.has('1')返回false。 它有数字类型1,set.has(1)返回true。

7.下面代码的输出是什么?ip

for (let i = 1; i < 5; i++) {
  if (i === 3) continue;
  console.log(i);
}
若是某个条件返回true,则continue语句跳过迭代。

8.下面代码的输出是什么?内存

const a = {}; const b = { key: "b" }; const c = { key: "c" };
    
    a[b] = 123; a[c] = 456;
    
    console.log(a[b]);
对象键自动转换为字符串。咱们试图将一个对象设置为对象a的键,其值为123。 可是,当对象自动转换为字符串化时,它变成了[Object
object]。 因此咱们在这里说的是a["Object object"] = 123。 而后,咱们能够尝试再次作一样的事情。
c对象一样会发生隐式类型转换。那么,a["Object object"] = 456。 而后,咱们打印a[b],它其实是a["Object
object"]。 咱们将其设置为456,所以返回456。

9.下面代码的输出是什么?作用域

<div onclick="console.log('div')">
      <p onclick="console.log('p')">
        Click here!
      </p>
    </div>
若是咱们单击p,咱们会看到两个日志:p和div。在事件传播期间,有三个阶段:捕获,目标和冒泡。
默认状况下,事件处理程序在冒泡阶段执行(除非您将useCapture设置为true)。 它从最深的嵌套元素向外延伸。

10.下面这些值哪些是假值?

0;
new Number(0);
("");
(" ");
new Boolean(false);
undefined;
JavaScript中只有6个假值:

undefined null NaN 0 '' (empty string) false
函数构造函数,如new Number和new
Boolean都是真值。

11.下面代码的输出是什么?

(() => {
      let x, y;
      try {
        throw new Error();
      } catch (x) {
        (x = 1), (y = 2);
        console.log(x);
      }
      console.log(x);
      console.log(y);
    })();
catch块接收参数x。当咱们传递参数时,这与变量的x不一样。这个变量x是属于catch做用域的。
以后,咱们将这个块级做用域的变量设置为1,并设置变量y的值。 如今,咱们打印块级做用域的变量x,它等于1。
在catch块以外,x仍然是undefined,而y是2。
当咱们想在catch块以外的console.log(x)时,它返回undefined,而y返回2。

12.setInterval方法的返回值什么?

setInterval(() => console.log("Hi"), 1000);
它返回一个惟一的id。 此id可用于使用clearInterval()函数清除该定时器

13.下面代码的输出是什么?

[..."Lydia"];
字符串是可迭代的。 扩展运算符将迭代的每一个字符映射到一个元素。 ["L", "y", "d", "i", "a"]
相关文章
相关标签/搜索