这是我参与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
说明
-
- "." 符号优先级会高于 "=" 的优先级
-
- 先执行 obj.b 创建一个属性"b",值为 undefined
-
- obj 指向改变了,指向了 { a: 2 }
-
- obj.b 被赋值成 { a: 2 }
-
- 由于 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)
}