重学前端-查漏补缺

380 阅读2分钟

一、javascript不写分号需要注意的几种语句

参考极客时间重学前端

括号结尾的语句

这段代码看似两个独立执行的函数表达式,但是其实第三组括号被理解为第一个的传参,导致抛出错误。

(function(a){
    console.log(a);
})()/*这里没有被自动插入分号*/
(function(a){
    console.log(a);
})()

以数组开头的语句

这段代码本意是一个变量 a 赋值,然后对一个数组执行 forEach,但是因为没有自动插入分号,被理解为下标运算符和逗号表达式,我这个例子展示的情况,甚至不会抛出错误,这对于代码排查问题是个噩梦。

var a = [[]]/*这里没有被自动插入分号*/
[3, 2, 1, 0].forEach(e => console.log(e))

以正则表达式开头的语句

var x = 1, g = {test:()=>0}, b = 1/*这里没有被自动插入分号*//
(a)/g.test("abc")
console.log(RegExp.$1)

这段代码本意是声明三个变量,然后测试一个字符串中是否含有字母 a,但是因为没有自动插入分号,正则的第一个斜杠被理解成了除号,后面的意思就都变了。注意,我构造的这个例子跟上面的例子一样,同样不会抛错,凡是这一类情况,都非常致命。

以 Template 开头的语句

  • 从语法结构上,Template 是个整体,其中的${}是并列关系。但是实际上,在 JavaScript 词法中,包含${}Template,是被拆开分析的,如:
`a${b}c${d}e`
  • 它在 JavaScript 中被认为是:
`a${b}c${d}e`
  • 以 Template 开头的语句比较少见,但是跟正则配合时,仍然不是不可能出现:
var f = function(){ return "";}
var g = f/*这里没有被自动插入分号*/
`Template`.match(/(a)/);
console.log(RegExp.$1)

这段代码本意是声明函数 f,然后赋值给 g,再测试 Template 中是否含有字母 a。但是因为没有自动插入分号,函数 f 被认为跟 Template 一体的,进而被莫名其妙地执行了一次。

二、原生js判断操作系统

function getSystemName() {
  const sysUserAgent = navigator.userAgent;
  const sysUserPlatform = navigator.platform;
  const isAndroid = sysUserAgent.indexOf('Android') > -1 || sysUserAgent.indexOf('Adr') > -1; //android终端 
  if (isAndroid) return "Android";
  const isiOS = !!sysUserAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 
  if (isiOS) return "iOS";
  const isMac = ["Mac68K", "MacPPC", "Macintosh", "MacIntel"].includes(sysUserPlatform);
  if (isMac) return "Mac";
  const isUnix = (sysUserPlatform === "X11") && !isWin && !isMac;
  if (isUnix) return "Unix";
  const isLinux = (String(sysUserPlatform).indexOf("Linux") > -1);
  if (isLinux) return "Linux";
  const isWin = ["Win32", "Windows"].includes(sysUserPlatform);
  if (isWin) return "Windows";
    // windows具体操作系统判断
    // if (isWin) {
    //     var isWin2K = sUserAgent.indexOf("Windows NT 5.0") > -1 || sUserAgent.indexOf("Windows 2000") > -1;
    //     if (isWin2K) return "Win2000";
    //     var isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1 || sUserAgent.indexOf("Windows XP") > -1;
    //     if (isWinXP) return "WinXP";
    //     var isWin2003 = sUserAgent.indexOf("Windows NT 5.2") > -1 || sUserAgent.indexOf("Windows 2003") > -1;
    //     if (isWin2003) return "Win2003";
    //     var isWinVista= sUserAgent.indexOf("Windows NT 6.0") > -1 || sUserAgent.indexOf("Windows Vista") > -1;
    //     if (isWinVista) return "WinVista";
    //     var isWin7 = sUserAgent.indexOf("Windows NT 6.1") > -1 || sUserAgent.indexOf("Windows 7") > -1;
    //     if (isWin7) return "Win7";
    // }
    return "other";
}