js很多人不知道小知识

try{}catch(){}中的return失效

1
2
3
4
5
6
7
try{
return 1
}catch(error){
return 2
} finally {
return 3
}

这个函数在 try/catch 语句的各个部分都只放了一个 return 语句。看起来该函数应该返回 1,
因为它在 try 块中,不会导致错误。但是, finally 块的存在导致 try 块中的 return 语句被忽略。因此,无论什么情况下调用该函数都会返回 3。如果去掉 finally 子句,该函数会返回 1。如果写出finally 子句, catch 块就成了可选的(它们两者中只有一个是必需的)。

注意 只要代码中包含了 finally 子句, try 块或 catch 块中的 return 语句就会被忽略,理解这一点很重要。在使用 finally 时一定要仔细确认代码的行为。

一行代码生成随机字符串

1
Math.random().toString(36).substring(2) // jumslim3x7

先是 Math.random() 生成 [0, 1) 的数,也就是 0.048734887099198376 之类的,然后调用 number 的 toString方法将其转换成36进制的,按照MDN的说法,36进制的转换应该是包含了 数字0-9 和 字母 a-z 的,因为这样生成的是 0.jumslim3x7 类似这样的小数点后面有11位,所以要截取一下小数部分,即从索引 2 开始截取就是我们想要的随机字符串了

Object(null) Object(undefined)

1
2
Object(null) // {}
Object(undefined) // {}

数字分隔

1
2
const num = 1_000_000
console.log(num) // 1000000

使用eval将json字符串转换为对象

使用JSON.parse转换对json格式有严格要求,一些情况下转换总是失败,
比如这种情况
SyntaxError: Unexpected token ] in JSON at position 205
这时可以试试使用eval来实现.

1
2
const data = canNotJsonParseData //
eval('('+ data +')') // 得到转换后的 对象

让 (a ==1 && a == 2 && a == 3) 返回true

原文:https://mp.weixin.qq.com/s/UqqB7eoiE0S9ANEJ63cljA

1
2
3
4
5
6
7
8
9
10
11
12
13
// 知识点:宽松相等、隐式转换
// 宽松判断前 会对 object 进行 valueOf 和 toString
const a = {
  i: 1,
  toString: function () {
    return a.i++
  },
// valueOf: function () {
//     return a.i++
//   },
}

console.log(a == 1 && a == 2 && a == 3) // true

让 (a ===1 && a === 2 && a === 3) 返回true

1
2
3
4
5
6
7
8
var i = 1

Object.defineProperty(window, 'a', {
get() {
return i++
}
})
console.log(a === 1 && a === 2 && a === 3)

持续补充中。。。