一、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";
}