走入ES6
<head>
<script src="1.js" defer></script>
<script src="2.js" asnyc></script>
</head>
<body>
</body>
异步加载:**用defer和async的方式进行js的引进,都会让script标签进行异步的加载,不会被script标签阻塞,如果去掉defer和async的话是同步执行的,必须把js代码引进完毕才能执行后面的代码,但defer和async是有区别的,async是异步的引入js,然后继续执行body进行页面的渲染的,但是当async是当一旦下载完后会,渲染引擎会立即中断渲染,会立即执行脚本的内容(使用async会有可能导致访问依然找不到节点),而defer是等所有的dom即整个body都全部渲染完毕后,再将js代码执行,async执行的更靠前,defer执行的更靠后一些。**defer会更靠谱些。
-
es6模块化默认就支持异步加载,用法跟defer类似。
使用script标签会导致不是私密的,2.js可以访问1.js中的函数,也许1.js中的一个函数不允许外界访问,甚至两个js文件都有一个相同名字的函数,导致重名(此时,谁在下面谁被调用)同时如果有一个3.js文件需要同时用到1.js和2.js的函数时,必须把它放到两个1.js和2.js引进script标签的后面,不然会报错,这也是依赖的问题。
随着项目增大,使用script去加载一定会遇到上述问题,于是可以用es6模块化解决这些问题
<script src="1.js" type=“module”></script>
这种写法就可以支持模块化,支持异步加载了,同时保证了你在html中想访问1.js的方法是访问不到,做到了私密不漏。
在 ES6(ECMAScript 2015)以及后续的 JavaScript 版本中,并没有直接支持使用
??运算符。这个运算符似乎是一种打字错误或误解。然而,在 JavaScript 中有一个与??非常相似的运算符,它被称为 "空值合并运算符" 或 "空值合并操作符",用于处理变量或表达式可能为null或undefined时的情况。这个运算符是??,它的语法如下:
const result = a ?? b;
这里的 ?? 运算符的作用是,如果 a 的值不是 null 或 undefined,则返回 a 的值;否则,返回 b 的值。这个运算符非常有用,可以用来提供默认值或处理可能的空值情况。
const defaultValue = "Default Value";
const userInput = null;
const result = userInput ?? defaultValue;
console.log(result); // 输出 "Default Value",因为 userInput 为 null
在这个示例中,如果 userInput 不是 null 或 undefined,则 result 变量将采用 userInput 的值;否则,它将采用默认值 "Default Value"。
它是一种非常实用的工具,用于处理空值情况,提供更稳健的代码。
当你尝试使用对象的属性访问语法 role[key] 来访问对象中不存在的属性 key 时,JavaScript 不会引发错误,而是返回 undefined。这是 JavaScript 中的默认行为,用于处理不存在的属性访问。
例如,假设有一个名为 role 的对象,但该对象不包含属性 "key",那么尝试使用 role["key"] 访问它将返回 undefined,如下所示:
const role = {
name: "Admin",
permissions: "read, write",
};
const key = "nonExistentProperty";
const value = role[key];
console.log(value); // 输出 undefined
在上面的示例中,
role对象没有名为"nonExistentProperty"的属性,因此role["nonExistentProperty"]返回undefined。这是 JavaScript 中处理对象属性访问的一种行为,通常可以用于检查属性是否存在或处理不存在的属性的情况。