前端面试之代码输出结果(二)

330 阅读2分钟

这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战

JS运算符

// 执行以下代码, 会输出什么结果
console.log(1 < 2 < 3);
console.log(3 > 2 > 1);

答案:true false

说明

  • 1<2为ture,在这里会隐式转换为1,1<3为true;
  • 3>2为true,在这里会隐式转换为1,1>1为false

JS对象循环引用

// 执行以下代码, 会输出什么结果
var obj1 = {
  a: 123
}
var obj2 = {
  b: 456
}
obj1.c = obj2;
obj2.c = obj1;
const jsonstr = JSON.stringify(obj1);
console.log(jsonstr)

答案:

// 会在 JSON.stringify 时候报错
Uncaught TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'Object'
    |     property 'c' -> object with constructor 'Object'
    --- property 'c' closes the circle
    at JSON.stringify (<anonymous>)
    at <anonymous>:9:22

说明

JSON.stringify 和 JSON.parse 无法序列化的循环引用的JSON对象

在MDN中提到

  • 当在循环引用时会抛出异常TypeError ("cyclic object value")(循环对象值)
  • 当尝试去转换 BigInt 类型的值会抛出TypeError ("BigInt value can't be serialized in JSON")(BigInt值不能JSON序列化).

JS的对象属性赋值操作

var obj = { a: 1 }
obj.b = obj = {
  a: 2
}
console.log(typeof obj.b);

答案:undefined

说明

    1. "." 符号优先级会高于 "=" 的优先级
    1. 先执行 obj.b 创建一个属性"b",值为 undefined
    1. obj 指向改变了,指向了 { a: 2 }
    1. obj.b 被赋值成 { a: 2 }
    1. 由于 obj 指向改变,不再指向原有对象,所以 obj.b 为undefind

JS的Generator

function* generator(a) {
  let length = a.length;
  for (let i = 0; i < length; i++) {
    let item = a[i];
    if (typeof item !== 'number') {
      yield* generator(item);
    } else {
      yield item;
    }
  }
}
const tasks = generator([[[4], 5, 6], [1], 0]);
let result;
while (result = tasks.next(), result.done !== true) {
  console.log(result.value)
}

答案:

4
5
6
1
0

说明

// 这是一个通过 Generator 来讲多维数组变成一维数组
// Generator 生成器,会返回生成器对象
// 生成器对象可以通过 .next 来进行访问下一步操作
function* generator(a) {
  let length = a.length;
  // 遍历多维数组
  for (let i = 0; i < length; i++) {
    let item = a[i];
    // 如果当前数组元素非数字,就是数组
    if (typeof item !== 'number') {
      // 进行递归本函数生成器进行迭代操作
      yield* generator(item);
    } else {
      // 如果是数字,直接返回数字
      console.log(item,'aaa')
      console.log(i,'i')
      yield item;
    }
  }
}


// 生成可迭代对象,可进行多次 tasks.next() 操作
// 读取迭代返回的数据
const tasks = generator([[[4], 5, 6], [1], 0]);
let result;
while (result = tasks.next(), result.done !== true) {
  // 按照迭代对象打印出应对返回数据
  console.log(result.value)
}