本来打算这篇把301-424题更完,但是字数超太多了,一万九左右到上限了,更完至少还需要两万三的字,所以就只能等下一篇完结了,请大家见谅。

| 编号 | 问题 | 
|---|---|
| 1 | 在 JavaScript 中创建对象的可行方法有哪些? | 
| 2 | 什么是原型链? | 
| 3 | call、apply、bind有什么区别? | 
| 4 | 什么是 JSON 及其常见操作? | 
| 5 | 数组slice()方法的目的是什么? | 
| 6 | 数组splice()方法的目的是什么? | 
| 7 | slice()和splice()有什么区别? | 
| 8 | 你如何比较 Object 和 Map | 
| 9 | == 和 === 运算符有什么区别? | 
| 10 | 什么是 lambda 或 箭头函数? | 
| 11 | 什么是头等函数? | 
| 12 | 什么是一阶函数? | 
| 13 | 什么是高阶函数? | 
| 14 | 什么是一元函数? | 
| 15 | 什么是柯里化函数? | 
| 16 | 什么是纯函数? | 
| 17 | let 关键字的用途是什么? | 
| 18 | let 和 var 有什么区别? | 
| 19 | 为什么选择 let 这个名字作为关键字? | 
| 20 | 你如何在没有错误的情况下重新声明 switch 块中的变量? | 
| 21 | 什么是暂时性死区? | 
| 22 | 什么是IIFE(立即执行函数表达式)? | 
| 23 | 使用模块有什么好处? | 
| 24 | 什么是memoization(记忆)? | 
| 25 | 什么是Hoisting(变量提升)? | 
| 26 | ES6 中的类是什么? | 
| 27 | 什么是closures(闭包)? | 
| 28 | 什么是modules(模块)? | 
| 29 | 为什么需要模块? | 
| 30 | javascript中的作用域是什么? | 
| 31 | 什么是Service Worker? | 
| 32 | 如何使用 Service Worker 操作 DOM? | 
| 33 | 你如何在 Service Worker 重新启动时重用信息? | 
| 34 | 什么是 IndexedDB? | 
| 35 | 什么是 web storage? | 
| 36 | 什么是 post message? | 
| 37 | 什么是 Cookie ? | 
| 38 | 为什么需要 Cookie ? | 
| 39 | cookie 中有哪些选项 ? | 
| 40 | 你如何删除cookie ? | 
| 41 | cookie、本地存储和会话存储有什么区别 ? | 
| 42 | localStorage 和 sessionStorage 的主要区别是什么? | 
| 43 | 你如何访问web 存储? | 
| 44 | 会话存储有哪些可用的方法? | 
| 45 | 什么是存储事件及其事件处理程序? | 
| 46 | 为什么需要web 存储? | 
| 47 | 你如何检查 Web 存储浏览器支持? | 
| 48 | 你如何检查web workers浏览器支持? | 
| 49 | 举个 web worker 的例子 | 
| 50 | web worker 对 DOM 的限制是什么? | 
| 51 | 什么是promise? | 
| 52 | 为什么需要promise? | 
| 53 | promise的三种状态是什么? | 
| 54 | 什么是回调函数? | 
| 55 | 为什么我们需要回调? | 
| 56 | 什么是回调地狱? | 
| 57 | 什么是服务器发送事件? | 
| 58 | 你如何接收服务器发送的事件通知? | 
| 59 | 你如何检查浏览器对服务器发送事件的支持? | 
| 60 | 服务器发送的事件有哪些可用的事件? | 
| 61 | promise的主要规则是什么? | 
| 62 | 回调中的回调是什么? | 
| 63 | 什么是promise chaining? | 
| 64 | 什么是 promise.all? | 
| 65 | promise中race方法的目的是什么? | 
| 66 | 什么是javascript中的严格模式? | 
| 67 | 为什么需要严格模式? | 
| 68 | 你如何声明严格模式? | 
| 69 | 双感叹号的目的是什么? | 
| 70 | 删除运算符的目的是什么? | 
| 71 | 什么是typeof运算符? | 
| 72 | 什么是未定义属性? | 
| 73 | 什么是空值? | 
| 74 | null 和 undefined 有什么区别? | 
| 75 | 什么是eval? | 
| 76 | Window和Document有什么区别? | 
| 77 | 你如何在 javascript 中访问历史记录? | 
| 78 | 你如何检测大写锁定键是否打开? | 
| 79 | 什么是isNaN? | 
| 80 | 未声明变量和未定义变量有什么区别? | 
| 81 | 什么是全局变量? | 
| 82 | 全局变量有什么问题? | 
| 83 | 什么是 NaN 属性? | 
| 84 | isFinite 函数的目的是什么? | 
| 85 | 什么是event flow(事件流)? | 
| 86 | 什么是event bubbling(事件冒泡)? | 
| 87 | 什么是event capturing(事件捕获)? | 
| 88 | 你如何使用 JavaScript 提交表单? | 
| 89 | 你如何找到操作系统详细信息? | 
| 90 | document load 和 DOMContentLoaded 事件有什么区别? | 
| 91 | Native 、Host 和User objects之间有什么区别? | 
| 92 | 用于调试 JavaScript 代码的工具或技术有哪些? | 
| 93 | promises相对于回调的优缺点是什么? | 
| 94 | attribute 和 property有什么区别? | 
| 95 | 什么是 same-origin policy(同源策略)? | 
| 96 | void 0的目的是什么? | 
| 97 | JavaScript 是编译型语言还是解释型语言? | 
| 98 | JavaScript 是区分大小写的语言吗? | 
| 99 | Java 和 JavaScript 之间有什么关系吗? | 
| 100 | 什么是event? | 
| 101 | 谁创造了 JavaScript ? | 
| 102 | preventDefault 方法有什么用? | 
| 103 | stopPropagation方法有什么用? | 
| 104 | return false 涉及哪些步骤? | 
| 105 | 什么是BOM(浏览器对象模型)? | 
| 106 | setTimeout有什么用? | 
| 107 | setInterval有什么用? | 
| 108 | 为什么 JavaScript 被视为单线程? | 
| 109 | 什么是event delegation(事件委托)? | 
| 110 | 什么是 ECMAScript? | 
| 111 | 什么是 JSON? | 
| 112 | JSON的语法规则是什么? | 
| 113 | JSON 字符串化的目的是什么? | 
| 114 | 你如何解析 JSON 字符串? | 
| 115 | 为什么需要 JSON? | 
| 116 | 什么是 PWA? | 
| 117 | clearTimeout 方法的目的是什么? | 
| 118 | clearInterval 方法的目的是什么? | 
| 119 | 你如何在javascript中重定向新页面? | 
| 120 | 你如何检查一个字符串是否包含一个子字符串? | 
| 121 | 你如何在 javascript 中验证电子邮件? | 
| 122 | 你如何使用 javascript 获取当前 url? | 
| 123 | location对象的各种url属性是什么? | 
| 124 | 如何在javascript中获取查询字符串值? | 
| 125 | 如何检查对象中是否存在键? | 
| 126 | 你如何循环或枚举 javascript 对象? | 
| 127 | 你如何测试一个空对象? | 
| 128 | 什么是参数对象? | 
| 129 | 你如何使字符串的第一个字母大写? | 
| 130 | for循环的优缺点是什么? | 
| 131 | 你如何在javascript中显示当前日期? | 
| 132 | 你如何比较两个日期对象? | 
| 133 | 你如何检查一个字符串是否以另一个字符串开头? | 
| 134 | 你如何在javascript中修剪字符串? | 
| 135 | 你如何在javascript中添加一个键值对? | 
| 136 | ‘!–’ 符号是否表示一个特殊运算符? | 
| 137 | 你如何为变量分配默认值? | 
| 138 | 你如何定义多行字符串? | 
| 139 | 什么是app shell model? | 
| 140 | 我们可以为函数定义属性吗? | 
| 141 | 找到函数期望的参数数量的方法是什么? | 
| 142 | 什么是 polyfill? | 
| 143 | 什么是 break 和 continue 语句? | 
| 144 | 什么是js标签? | 
| 145 | 将声明放在首位有什么好处? | 
| 146 | 初始化变量有什么好处? | 
| 147 | 创建新对象的建议是什么? | 
| 148 | 你如何定义 JSON 数组? | 
| 149 | 你如何生成随机整数? | 
| 150 | 你能写一个随机整数函数来打印范围内的整数吗? | 
| 151 | 什么是tree shaking(摇树)? | 
| 152 | tree shaking(摇树)需要什么? | 
| 153 | 是否推荐使用 eval? | 
| 154 | 什么是正则表达式? | 
| 155 | 正则表达式中可用的字符串方法有哪些? | 
| 156 | 正则表达式中的修饰符是什么? | 
| 157 | 什么是正则表达式模式? | 
| 158 | 什么是 RegExp 对象? | 
| 159 | 如何在字符串中搜索模式? | 
| 160 | exec方法的目的是什么? | 
| 161 | 如何更改 HTML 元素的样式? | 
| 162 | 1+2+'3' 的结果是什么? | 
| 163 | 什么是调试器语句? | 
| 164 | 调试中断点的目的是什么? | 
| 165 | 我可以使用保留字作为标识符吗? | 
| 166 | 你如何检测移动浏览器? | 
| 167 | 如何在没有正则表达式的情况下检测移动浏览器? | 
| 168 | 你如何使用JS获取图像的宽度和高度? | 
| 169 | 如何进行同步 HTTP 请求? | 
| 170 | 如何进行异步 HTTP 请求? | 
| 171 | 你如何在javascript中将日期转换为另一个时区? | 
| 172 | 用于获取窗口大小的属性是什么? | 
| 173 | 什么是javascript中的条件运算符? | 
| 174 | 你能在条件运算符上应用chaining吗? | 
| 175 | 页面加载后执行javascript的方式有哪些? | 
| 176 | proto 和 prototype有什么区别? | 
| 177 | 举个例子你真的需要分号 | 
| 178 | 什么是freeze 方法? | 
| 179 | freeze 方法的目的是什么? | 
| 180 | 为什么我需要使用freeze 方法? | 
| 181 | 你如何检测浏览器语言首选项? | 
| 182 | 如何使用javascript将字符串转换为标题大小写? | 
| 183 | 你如何检测页面中禁用的javascript? | 
| 184 | javascript支持的各种运算符有哪些? | 
| 185 | 什么是rest 参数? | 
| 186 | 如果不使用 rest 参数作为最后一个参数会发生什么? | 
| 187 | 什么是 JavaScript 中可用的按位运算符? | 
| 188 | 什么是spread operator(展开运算符)? | 
| 189 | 你如何确定对象是否被冻结? | 
| 190 | 你如何确定两个值相同或不使用对象? | 
| 191 | 使用Object 的 is方法的目的是什么? | 
| 192 | 如何将属性从一个对象复制到另一个对象? | 
| 193 | 赋值方法有哪些应用? | 
| 194 | 什么是Proxy(代理)对象? | 
| 195 | seal 方法的目的是什么? | 
| 196 | seal 方法的应用有哪些? | 
| 197 | freeze 和 seal 方法有什么区别? | 
| 198 | 如何判断物体是否 seal? | 
| 199 | 如何获得可枚举的键值对? | 
| 200 | Object.values 和 Object.entries 方法的主要区别是什么? | 
| 201 | 如何获取任何对象的键列表? | 
| 202 | 你如何用 prototype 创建一个对象? | 
| 203 | 什么是WeakSet? | 
| 204 | WeakSet 和 Set 有什么区别? | 
| 205 | 列出 WeakSet 上可用的方法集合? | 
| 206 | 什么是 WeakMap? | 
| 207 | WeakMap 和 Map 有什么区别? | 
| 208 | 列出 WeakMap 上可用的方法集合? | 
| 209 | uneval 的目的是什么? | 
| 210 | 你如何 encode (编码)一个 URL? | 
| 211 | 你如何 decode (解码)一个 URL? | 
| 212 | 你如何打印网页的内容? | 
| 213 | uneval 和 eval 有什么区别? | 
| 214 | 什么是 anonymous (匿名)函数? | 
| 215 | 局部变量和全局变量的优先顺序是什么? | 
| 216 | 什么是 javascript 访问器? | 
| 217 | 你如何在对象构造函数上定义属性? | 
| 218 | get 和defineProperty 有什么区别? | 
| 219 | Getter 和 Setter 的优点是什么? | 
| 220 | 我可以使用defineProperty方法添加 getter 和 setter 吗? | 
| 221 | switch-case 的目的是什么? | 
| 222 | 使用 swtich case 需要遵循什么约定? | 
| 223 | 什么是原始数据类型? | 
| 224 | 访问对象属性的不同方式有哪些? | 
| 225 | 什么是函数参数规则? | 
| 226 | 什么是错误对象? | 
| 227 | 当你收到语法错误时 | 
| 228 | 错误对象有哪些不同的错误名称? | 
| 229 | 错误处理中的各种语句是什么? | 
| 230 | javascript中的两种类型的循环是什么? | 
| 231 | 什么是 nodejs? | 
| 232 | 什么是 Intl 对象? | 
| 233 | 你如何执行特定于语言的日期和时间格式化? | 
| 234 | 什么是迭代器? | 
| 235 | 同步迭代是如何工作的? | 
| 236 | 什么是事件循环? | 
| 237 | 什么是调用栈? | 
| 238 | 什么是事件队列? | 
| 239 | 什么是装饰器? | 
| 240 | Intl 对象的属性是什么? | 
| 241 | 什么是一元运算符? | 
| 242 | 如何对数组中的元素进行排序? | 
| 243 | 排序数组时 compareFunction 的目的是什么? | 
| 244 | 你如何反转数组? | 
| 245 | 你如何在数组中找到最小值和最大值? | 
| 246 | 如何在没有math函数的情况下找到最小值和最大值? | 
| 247 | 什么是空语句及其目的? | 
| 248 | 如何获取模块的元数据? | 
| 249 | 什么是逗号运算符? | 
| 250 | 逗号运算符的优点是什么? | 
| 251 | 什么是 typescript ? | 
| 252 | javascript 和 typescript 有什么区别? | 
| 253 | typescript 相对于 javascript 的优势是什么? | 
| 254 | 什么是对象初始值设定项? | 
| 255 | 什么是构造方法? | 
| 256 | 如果在一个类中多次编写构造函数会发生什么? | 
| 257 | 如何调用父类的构造函数? | 
| 258 | 你如何获得一个对象的原型? | 
| 259 | 如果我为 getPrototype 方法传递字符串类型会发生什么? | 
| 260 | 如何将一个对象的原型设置为另一个对象? | 
| 261 | 你如何检查一个对象是否可以扩展? | 
| 262 | 如何防止对象扩展? | 
| 263 | 使对象不可扩展的不同方法有哪些? | 
| 264 | 如何在一个对象上定义多个属性? | 
| 265 | JavaScript 中的 MEAN 是什么? | 
| 266 | 什么是 javascript 中的混淆? | 
| 267 | 为什么需要混淆? | 
| 268 | 什么是Minification(缩小)? | 
| 269 | 缩小有什么好处? | 
| 270 | 混淆和加密有什么区别? | 
| 271 | 常用的缩小工具有哪些? | 
| 272 | 你如何使用 javascript 执行表单验证? | 
| 273 | 如何在没有 javascript 的情况下执行表单验证? | 
| 274 | 可用于约束验证的 DOM 方法有哪些? | 
| 275 | 什么是可用的约束验证 DOM 属性? | 
| 276 | 什么是有效性属性列表? | 
| 277 | 举例使用 rangeOverflow 属性? | 
| 278 | javascript 中是否提供枚举功能? | 
| 279 | 什么是枚举? | 
| 280 | 你如何列出一个对象的所有属性? | 
| 281 | 如何获取对象的属性描述符? | 
| 282 | 属性描述符提供的属性是什么? | 
| 283 | 你如何扩展类? | 
| 284 | 如何在不重新加载页面的情况下修改 url? | 
| 285 | 如何检查数组是否包含特定值? | 
| 286 | 你如何比较标量数组? | 
| 287 | 如何从获取参数中获取值? | 
| 288 | 你如何用逗号作为千位分隔符打印数字? | 
| 289 | java和javascript有什么区别? | 
| 290 | javascript是否支持命名空间? | 
| 291 | 你如何声明命名空间? | 
| 292 | 如何从父页面调用 iframe 中的 javascript 代码? | 
| 293 | 如何从日期获取时区偏移量? | 
| 294 | 如何动态加载 CSS 和 JS 文件? | 
| 295 | 在 DOM 中查找 HTML 元素的不同方法有哪些? | 
| 296 | 什么是jQuery? | 
| 297 | 什么是 V8 JavaScript 引擎? | 
| 298 | 为什么我们称javascript为动态语言? | 
| 299 | 什么是空运算符? | 
| 300 | 如何设置光标等待? | 
| 301 | 你如何创建一个无限循环? | 
| 302 | 为什么需要避免 with 语句? | 
| 303 | 以下 for 循环的输出是什么? | 
| 304 | 列出 ES6 的一些特性? | 
| 305 | 什么是 ES6? | 
| 306 | 我可以重新声明 let 和 const 变量吗? | 
| 307 | 是 const 变量使值不可变吗? | 
| 308 | 什么是默认参数? | 
| 309 | 什么是模板字面量? | 
| 310 | 如何在模板文字中编写多行字符串? | 
| 311 | 什么是嵌套模板? | 
| 312 | 什么是标记模板? | 
| 313 | 什么是原始字符串? | 
| 314 | 什么是解构赋值? | 
| 315 | 解构赋值中的默认值是什么? | 
| 316 | 你如何在解构赋值中交换变量? | 
| 317 | 什么是增强的对象字面量? | 
| 318 | 什么是动态导入? | 
| 319 | 动态导入的用例是什么? | 
| 320 | 什么是typed arrays (类型数组)? | 
| 321 | 模块加载器的优点是什么? | 
| 322 | 什么是 collation? | 
| 323 | 什么是...of 语句? | 
| 324 | 下面展开运算符数组的输出是什么? | 
| 325 | PostMessage 安全吗? | 
| 326 | postmessage目标源作为通配符有什么问题? | 
| 327 | 你如何避免收到来自攻击者的 postMessages? | 
| 328 | 我可以完全避免使用 postMessages 吗? | 
| 329 | postMessages 是否同步? | 
| 330 | Javascript 是什么范式? | 
| 331 | 内部和外部 javascript有什么区别? | 
| 332 | JavaScript 是否比服务器端脚本更快? | 
| 333 | 你如何获得复选框的状态? | 
| 334 | 双波浪号运算符的目的是什么? | 
| 335 | 你如何将字符转换为 ASCII 码? | 
| 336 | 什么是数组缓冲区? | 
| 337 | 下面的字符串表达式的输出是什么? | 
| 338 | Error对象的目的是什么? | 
| 339 | EvalError 对象的目的是什么? | 
| 340 | 从非严格模式到严格模式抛出的案例错误列表是什么? | 
| 341 | 是否所有对象都有prototypes(原型)? | 
| 342 | 参数和实参有什么区别? | 
| 343 | 数组中 some 方法的目的是什么? | 
| 344 | 你如何组合两个或多个数组? | 
| 345 | 浅拷贝和深拷贝有什么区别? | 
| 346 | 你如何创建一个字符串的特定数量的副本? | 
| 347 | 你如何根据正则表达式返回所有匹配的字符串? | 
| 348 | 你如何在开头或结尾修剪字符串? | 
| 349 | 下面带有一元运算符的控制台语句的输出是什么? | 
| 350 | javascript 是否使用 mixins? | 
| 351 | 什么是 thunk 函数? | 
| 352 | 什么是异步 thunk? | 
| 353 | 以下函数调用的输出是什么? | 
| 354 | 如何从字符串中删除所有换行符? | 
| 355 | 回流和重绘有什么区别? | 
| 356 | 否定数组会发生什么? | 
| 357 | 如果我们添加两个数组会发生什么? | 
| 358 | 在假值上添加加法运算符的输出是什么? | 
| 359 | 如何使用特殊字符创建自字符串? | 
| 360 | 如何从数组中删除虚假值? | 
| 361 | 你如何获得数组的唯一值? | 
| 362 | 什么是解构别名? | 
| 363 | 如何在不使用 map 方法的情况下映射数组值? | 
| 364 | 你如何清空一个数组? | 
| 365 | 你如何将数字四舍五入到某些小数? | 
| 366 | 将数组转换为对象的最简单方法是什么? | 
| 367 | 你如何用一些数据创建一个数组? | 
| 368 | 控制台对象的占位符是什么? | 
| 369 | 是否可以将 CSS 添加到控制台消息? | 
| 370 | 控制台对象的dir方法的目的是什么? | 
| 371 | 是否可以在控制台中调试 HTML 元素? | 
| 372 | 如何使用控制台对象以表格格式显示数据? | 
| 373 | 你如何验证参数是否为数字? | 
| 374 | 你如何创建复制到剪贴板按钮? | 
| 375 | 获取时间戳的快捷方式是什么? | 
| 376 | 你如何展平多维数组? | 
| 377 | 什么是最简单的多条件检查? | 
| 378 | 你如何捕获浏览器后退按钮? | 
| 379 | 如何禁用网页中的右键单击? | 
| 380 | 什么是包装对象? | 
| 381 | 什么是 AJAX? | 
| 382 | 处理异步代码的不同方式有哪些? | 
| 383 | 如何取消提取请求? | 
| 384 | 什么是网络语音API? | 
| 385 | 什么是最小超时限制? | 
| 386 | 你如何在现代浏览器中实现零超时? | 
| 387 | 事件循环中的任务是什么? | 
| 388 | 什么是微任务? | 
| 389 | 什么是不同的事件循环? | 
| 390 | queueMicrotask 的目的是什么? | 
| 391 | 你如何在 typescript 文件中使用 javascript 库? | 
| 392 | promises 和 observables 有什么区别? | 
| 393 | 什么是堆? | 
| 394 | 什么是事件表? | 
| 395 | 什么是微任务队列? | 
| 396 | shim 和 polyfill 有什么区别? | 
| 397 | 你如何检测原始或非原始值类型? | 
| 398 | 什么是Babel ? | 
| 399 | Node.js 是完全单线程的吗? | 
| 400 | 可观察对象的常见用例是什么? | 
| 401 | 什么是 RxJS? | 
| 402 | 函数构造函数和函数声明有什么区别? | 
| 403 | 什么是短路状态? | 
| 404 | 调整数组大小的最简单方法是什么? | 
| 405 | 什么是可观察的? | 
| 406 | 函数声明和类声明有什么区别? | 
| 407 | 什么是异步函数? | 
| 408 | 你如何防止 promises swallowing errors? | 
| 409 | 什么是 deno ? | 
| 410 | 你如何在javascript中使对象可迭代? | 
| 411 | 什么是正确的尾调用? | 
| 412 | 你如何检查一个对象是否是一个承诺? | 
| 413 | 如何检测函数是否被调用为构造函数? | 
| 414 | arguments 对象和rest 参数之间有什么区别? | 
| 415 | 扩展运算符和rest 参数之间有什么区别? | 
| 416 | 有哪些不同种类的 generators(生成器)? | 
| 417 | 什么是内置可迭代对象? | 
| 418 | for...of 和 for...in 语句之间有什么区别? | 
| 419 | 如何定义实例和非实例属性? | 
| 420 | isNaN 和 Number.isNaN 有什么区别? | 
| 421 | 如何在没有任何额外括号的情况下调用 IIFE? | 
| 422 | 可以在 switch case 中使用表达式吗? | 
| 423 | 忽略承诺错误的最简单方法是什么? | 
| 424 | 如何使用 CSS 设置控制台输出的样式? | 
301.你如何创建一个无限循环?
您可以使用 for 和 while 循环创建无限循环,而无需使用任何表达式。就 ESLint 和代码优化器工具而言,for 循环构造或语法是更好的方法,
for (;;) {}
while(true) {
}
复制代码⬆ 返回顶部 回到第300题
302.为什么需要避免 with 语句?
JavaScript 的 with 语句旨在为编写对对象的重复访问提供速记。因此,它可以通过减少重复冗长的对象引用的需要来帮助减小文件大小,而不会降低性能。让我们举一个例子,它用于在多次访问一个对象时避免冗余。
a.b.c.greeting = 'welcome';
a.b.c.age = 32;
复制代码使用with它变成:
with(a.b.c) {
greeting = "welcome";
age = 32;
}
复制代码但是这个with语句会产生性能问题,因为人们无法预测一个参数是指向一个实变量还是指向 with 参数中的一个属性。
⬆ 返回顶部 回到第300题
303.以下 for 循环的输出是什么?
for (var i = 0; i < 4; i++) { // 全局范围
setTimeout(() => console.log(i));
}
for (let i = 0; i < 4; i++) { // 块作用域
setTimeout(() => console.log(i));
}
复制代码上述 for 循环的输出是 4 4 4 4 和 0 1 2 3
说明:由于javascript的事件队列/循环,setTimeout循环执行完毕后会调用回调函数。由于变量 i 是用var关键字声明的,它变成了一个全局变量,并且在setTimeout调用time函数时使用迭代的值等于 4 。因此,第一个循环的输出是4 4 4 4。
而在第二个循环中,变量 i 被声明为let关键字,它变成了一个块范围的变量,并且每次迭代都保存一个新值 (0, 1 ,2 3)。因此,第一个循环的输出是0 1 2 3。
⬆ 返回顶部 回到第300题
304.列出 ES6 的一些特性?
下面是 ES6 的一些新特性的列表,
1.支持常量或不可变变量 2.对变量、常量和函数的块范围支持 3.箭头函数 4.默认参数 5.Rest and Spread 参数 6.Template Literals(模板字符串) 7.多行字符串 8.解构赋值 9.增强的对象文字 10.Promises 11.Classes 12.Modules
⬆ 返回顶部 回到第300题
305.什么是 ES6?
ES6 是 javascript 语言的第六版,它于 2015 年 6 月发布。它最初被称为 ECMAScript 6 (ES6),后来更名为 ECMAScript 2015。几乎所有现代浏览器都支持 ES6,但对于旧浏览器有很多转译器,比如 Babel.js 等。
⬆ 返回顶部 回到第300题
306.我可以重新声明 let 和 const 变量吗?
不,您不能重新声明 let 和 const 变量。如果你这样做,它会抛出以下错误
Uncaught SyntaxError: Identifier 'someVariable' has already been declared
复制代码说明:带有var关键字的变量声明引用了一个函数作用域,由于提升特性,该变量被视为在封闭作用域的顶部声明。因此,对同一个提升变量做出贡献的所有多个声明都没有任何错误。让我们举个例子,为 var 和 let/const 变量在同一范围内重新声明变量。
var name = 'Haiyong';
function myFunc() {
var name = 'Nick';
var name = 'Abraham'; // 在同一功能块中重新分配
alert(name); // Abraham
}
myFunc();
alert(name); // Haiyong
复制代码块范围的多声明抛出语法错误,
let name = 'Haiyong';
function myFunc() {
let name = 'Nick';
let name = 'Abraham'; // 未捕获的语法错误:标识符"name"已被声明
alert(name);
}
myFunc();
alert(name);
复制代码⬆ 返回顶部 回到第300题
307.是 const 变量使值不可变吗?
不, const 变量不会使值不可变。但它不允许后续赋值(即,您可以使用赋值声明但不能稍后赋值)
const userList = [];
userList.push('juejin'); // 即使不能重新分配也可以变异
console.log(userList); // ['juejin']
复制代码⬆ 返回顶部 回到第300题
308.什么是默认参数?
在 E5 中,我们需要依赖逻辑 OR 运算符来处理函数参数的默认值。而在 ES6 中,默认函数参数功能允许在未传递值或未定义时使用默认值初始化参数。让我们将行为与示例进行比较,
//ES5
var calculateArea = function(height, width) {
height = height || 50;
width = width || 60;
return width * height;
}
console.log(calculateArea()); //
300
复制代码默认参数使初始化更简单,
//ES6
var calculateArea = function(height = 50, width = 60) {
return width * height;
}
console.log(calculateArea()); //
300
复制代码⬆ 返回顶部 回到第300题
309.什么是模板字面量?
模板文字或模板字符串是允许嵌入表达式的字符串文字。它们由反引号 (`) 字符而不是双引号或单引号括起来。 在 E6 中,此功能允许使用如下动态表达式,
var greeting = `Welcome to JS World, Mr. ${firstName} ${lastName}.`
复制代码在 ES5 中,你需要像下面这样的中断字符串,
var greeting = 'Welcome to JS World, Mr.' + firstName + ' ' + lastName.
复制代码==注意==:您可以将多行字符串和字符串插值功能与模板文字一起使用。
⬆ 返回顶部 回到第300题
310.如何在模板文字中编写多行字符串?
在 ES5 中,您必须使用换行符('\n')和连接符号(+)来获得多行字符串。
 console.log('This is string sentence 1\n' +
 'This is string sentence 2');
复制代码而在 ES6 中,您不需要提及任何换行序列字符,
 console.log(`This is string sentence
 'This is string sentence 2`);
复制代码⬆ 返回顶部 回到第300题
311.什么是嵌套模板?
嵌套模板是模板文字语法中支持的一项功能,它允许在模板内的占位符 ${ } 内使用内部反引号。例如,下面的嵌套模板用于根据用户权限显示图标,而外部模板检查平台类型,
 const iconStyles = `icon ${ isMobilePlatform() ? '' :
  `icon-${user.isAuthorized ? 'submit' : 'disabled'}` }`;
复制代码您也可以在不嵌套模板功能的情况下编写上述用例。但是,嵌套模板功能更加紧凑和可读。
 //无嵌套模板
  const iconStyles = `icon ${ isMobilePlatform() ? '' :
   (user.isAuthorized ? 'icon-submit' : 'icon-disabled'}`;
复制代码⬆ 返回顶部 回到第300题
312.什么是标记模板?
标记模板是模板的高级形式,其中标记允许您使用函数解析模板文字。tag 函数接受第一个参数作为字符串数组,其余参数作为表达式。此函数还可以根据参数返回操作过的字符串。让我们看看组织中 IT 专业技能集的这种标记模板行为的使用情况,
 var user1 = 'Haiyong';
 var skill1 = 'JavaScript';
 var experience1 = 15;
 var user2 = 'juejin';
 var skill2 = 'JavaScript';
 var experience2 = 5;
 function myInfoTag(strings, userExp, experienceExp, skillExp) {
   var str0 = strings[0]; // "Mr/Ms. "
   var str1 = strings[1]; // " is a/an "
   var str2 = strings[2]; // "in"
   var expertiseStr;
   if (experienceExp > 10){
     expertiseStr = 'expert developer';
   } else if(skillExp > 5 && skillExp <= 10) {
     expertiseStr = 'senior developer';
   } else {
     expertiseStr = 'junior developer';
   }
   return ${str0}${userExp}${str1}${expertiseStr}${str2}${skillExp};
 }
 var output1 = myInfoTag`Mr/Ms. ${ user1 } is a/an ${ experience1 } in ${skill1}`;
 var output2 = myInfoTag`Mr/Ms. ${ user2 } is a/an ${ experience2 } in ${skill2}`;
 console.log(output1);// Mr/Ms. Haiyong is a/an expert developer in JavaScript(是一位 JavaScript 专家开发人员)
 console.log(output2);// Mr/Ms. juejin is a/an junior developer in JavaScript(是一名初级 JavaScript 开发人员)
复制代码⬆ 返回顶部 回到第300题
313.什么是原始字符串?
ES6 提供了一个原始字符串特性,使用该String.raw()方法来获取模板字符串的原始字符串形式。此功能允许您在输入原始字符串时访问它们,而无需处理转义序列。例如,用法如下,
  var calculationString = String.raw `The sum of numbers is \n${1+2+3+4}!`;
  console.log(calculationString); // The sum of numbers is 10
复制代码如果不使用原始字符串,将通过多行显示输出来处理换行符序列
  var calculationString = `The sum of numbers is \n${1+2+3+4}!`;
  console.log(calculationString);
  // The sum of numbers is
  // 10
复制代码此外,原始属性可用于标记函数的第一个参数
  function tag(strings) {
     console.log(strings.raw[0]);
  }
复制代码⬆ 返回顶部 回到第300题
314.什么是解构赋值?
解构赋值是一个 JavaScript 表达式,它可以将数组中的值或对象中的属性解包为不同的变量。 让我们使用解构赋值从数组中获取月份值
 var [one, two, three] = ['JAN', 'FEB', 'MARCH'];
 console.log(one); // "JAN"
 console.log(two); // "FEB"
 console.log(three); // "MARCH"
复制代码并且您可以使用解构赋值获取对象的用户属性,
 var {name, age} = {name: 'Haiyong', age: 22};
 console.log(name); // Haiyong
 console.log(age); // 22
复制代码⬆ 返回顶部 回到第300题
315.解构赋值中的默认值是什么?
如果在解构赋值期间从数组或对象中解压缩出来的值未定义,则可以为变量分配一个默认值。它有助于避免为每个分配单独设置默认值。让我们以数组和对象用例为例,
数组解构:
var x, y, z;
[x=2, y=4, z=6] = [10];
console.log(x); // 10
console.log(y); // 4
console.log(z); // 6
复制代码对象解构:
var {x=2, y=4, z=6} = {x: 10};
console.log(x); // 10
console.log(y); // 4
console.log(z); // 6
复制代码⬆ 返回顶部 回到第300题
316.你如何在解构赋值中交换变量?
如果不使用解构赋值,交换两个值需要一个临时变量。而使用解构功能,可以在一个解构表达式中交换两个变量值。让我们在数组解构赋值中交换两个数字变量,
var x = 10, y = 20;
[x, y] = [y, x];
console.log(x); // 20
console.log(y); // 10
复制代码⬆ 返回顶部 回到第300题
317.什么是增强的对象字面量?
对象字面量可以很容易地快速创建带有花括号内的属性的对象。例如,它为公共对象属性定义提供了更短的语法,如下所示。
//ES6
var x = 10, y = 20
obj = { x, y }
console.log(obj); // {x: 10, y:20}
//ES5
var x = 10, y = 20
obj = { x : x, y : y}
console.log(obj); // {x: 10, y:20}
复制代码318.什么是动态导入?
使用import()函数语法的动态导入允许我们通过使用 Promise 或 async/await 语法按需加载模块。目前此功能在stage4 提案中。动态导入的主要优点是减少了我们的 bundle 的大小、我们请求的大小/有效负载响应以及用户体验的整体改进。
动态导入的语法如下,
import('./Module').then(Module => Module.method());
复制代码⬆ 返回顶部 回到第300题
319.动态导入的用例是什么?
以下是使用动态导入而不是静态导入的一些用例,
按需或有条件地导入模块。例如,如果您想在旧版浏览器上加载 polyfill
 if (isLegacyBrowser()) {
     import(···)
     .then(···);
 }
复制代码在运行时计算模块说明符。例如,您可以将其用于国际化。
 import(`messages_${getLocale()}.js`).then(···);
复制代码从常规脚本中导入模块而不是模块。
⬆ 返回顶部 回到第300题
320.什么是typed arrays (类型数组)?
类型化数组是来自 ECMAScript 6 API 的类数组对象,用于处理二进制数据。JavaScript 提供了 8 种 Typed 数组类型,
1.Int8Array:一个 8 位有符号整数数组 2.Int16Array:16 位有符号整数数组 3.Int32Array:一个 32 位有符号整数数组 4.Uint8Array:8 位无符号整数数组 5.Uint16Array:16 位无符号整数数组 6.Uint32Array:一个 32 位无符号整数数组 7.Float32Array:32 位浮点数数组 8.Float64Array:64 位浮点数数组
例如,您可以创建一个 8 位有符号整数数组,如下所示
 const a = new Int8Array();
 // 您可以预先分配 n 个字节
 const bytes = 1024
 const a = new Int8Array(bytes)
复制代码⬆ 返回顶部 回到第300题
321.模块加载器的优点是什么?
模块加载器提供以下功能,
1.动态加载 2.状态隔离 3.全局命名空间隔离 4.编译钩子 5.嵌套虚拟化
⬆ 返回顶部 回到第300题
322.什么是 collation?
排序规则用于对一组字符串进行排序并在一组字符串中进行搜索。它由区域设置参数化并了解 Unicode。让我们来看看比较和排序功能,
比较:
 var list = [ "ä", "a", "z" ]; // 在德语中,“ä”与“a”一起排序,而在瑞典语中,“ä”在“z”之后排序
 var l10nDE = new Intl.Collator("de");
 var l10nSV = new Intl.Collator("sv");
 console.log(l10nDE.compare("ä", "z") === -1); // true
 console.log(l10nSV.compare("ä", "z") === +1); // true
复制代码排序:
 var list = [ "ä", "a", "z" ]; // 在德语中,“ä”与“a”一起排序,而在瑞典语中,“ä”在“z”之后排序
 var l10nDE = new Intl.Collator("de");
 var l10nSV = new Intl.Collator("sv");
 console.log(list.sort(l10nDE.compare)) // [ "a", "ä", "z" ]
 console.log(list.sort(l10nSV.compare)) // [ "a", "z", "ä" ]
复制代码⬆ 返回顶部 回到第300题
323.什么是…of 语句?
for...of 语句创建一个循环迭代可迭代对象或元素,例如内置字符串、数组、类数组对象(如参数或 NodeList)、TypedArray、Map、Set 和用户定义的可迭代对象。数组上 for...of 语句的基本用法如下,
 let arrayIterable = [10, 20, 30, 40, 50];
 for (let value of arrayIterable) {
   value ++;
   console.log(value); // 11 21 31 41 51
 }
复制代码⬆ 返回顶部 回到第300题
324.下面展开运算符数组的输出是什么?
 [...'John Resig']
复制代码数组的输出为 ['J', 'o', 'h', 'n', '', 'R', 'e', 's', 'i', 'g']
说明:字符串是一种可迭代类型,数组中的扩展运算符将可迭代的每个字符映射到一个元素。因此,字符串的每个字符都成为数组中的一个元素。
⬆ 返回顶部 回到第300题
325.PostMessage 安全吗?
是的,只要程序员/开发人员仔细检查到达消息的来源和来源,就可以认为 postMessages 非常安全。但是,如果您尝试在不验证消息来源的情况下发送/接收消息,则会产生跨站点脚本攻击。
⬆ 返回顶部 回到第300题
326.postmessage目标源作为通配符有什么问题?
postMessage 方法的第二个参数指定允许哪个源接收消息。如果您使用通配符“*”作为参数,则允许任何来源接收消息。在这种情况下,发送方窗口在发送消息时无法知道目标窗口是否在目标源。如果目标窗口已导航到另一个原点,则另一个原点将接收数据。因此,这可能会导致 XSS 漏洞。
 targetWindow.postMessage(message, '*');
复制代码⬆ 返回顶部 回到第300题
327.你如何避免收到来自攻击者的 postMessages?
您如何避免收到来自攻击者的 postMessages 由于侦听器侦听任何消息,攻击者可以通过从攻击者的来源发送消息来欺骗应用程序,这给人的印象是接收者从实际发送者的窗口收到了消息。您可以通过使用“message.origin”属性在接收者端验证消息的来源来避免此问题。例如,让我们在接收方上检查发送方的来源http://www.some-sender.com,
 //监听器打开 http:///
 window.addEventListener("message", function(message){
     if(/^http://www\.some-sender\.com$/.test(message.origin)){
          console.log('You received the data from valid sender', message.data);
    }
 });
复制代码⬆ 返回顶部 回到第300题
328.我可以完全避免使用 postMessages 吗?
您无法完全(或 100%)避免使用 postMessages。尽管考虑到风险,您的应用程序不使用 postMessage,但许多第三方脚本使用 postMessage 与第三方服务进行通信。因此,您的应用程序可能在您不知情的情况下使用 postMessage。
⬆ 返回顶部 回到第300题
329.postMessages 是否同步?
postMessages 在 IE8 浏览器中是同步的,但它们在 IE9 和所有其他现代浏览器(即 IE9+、Firefox、Chrome、Safari)中是异步的。由于这种异步行为,我们在 postMessage 返回时使用回调机制。
⬆ 返回顶部 回到第300题
330.Javascript 是什么范式?
JavaScript 是一种多范式语言,支持命令式/过程式编程、面向对象编程和函数式编程。JavaScript 支持具有原型继承的面向对象编程。
⬆ 返回顶部 回到第300题
331.内部和外部 javascript有什么区别?
内部 JavaScript:它是脚本标签内的源代码。 外部 JavaScript:源代码存储在外部文件中(以 .js 扩展名存储)并在标签中引用。
⬆ 返回顶部 回到第300题
332.JavaScript 是否比服务器端脚本更快?
是的,JavaScript 比服务器端脚本更快。因为 JavaScript 是一个客户端脚本,它不需要任何网络服务器的帮助来进行计算或计算。因此 JavaScript 总是比任何服务器端脚本(如 ASP、PHP 等)都快。
⬆ 返回顶部 回到第300题
333.你如何获得复选框的状态?
您可以checked在 DOM 中选定的复选框上应用该属性。如果值为 ,则True表示复选框已选中,否则未选中。例如,下面的 HTML 复选框元素可以使用 javascript 访问,如下所示,
   <input type="checkbox" name="checkboxname" value="Agree"> 同意条件<br>
复制代码 console.log(document.getElementById(‘checkboxname’).checked); // true or false
复制代码⬆ 返回顶部 回到第300题
334.双波浪号运算符的目的是什么?
双波浪号运算符 (~~) 称为双非按位运算符。这个运算符将成为 Math.floor() 的更快替代品。
⬆ 返回顶部 回到第300题
335.你如何将字符转换为 ASCII 码?
您可以使用该String.prototype.charCodeAt()方法将字符串字符转换为 ASCII 数字。例如,让我们找到 'ABC' 字符串的第一个字母的 ASCII 代码,
 "ABC".charCodeAt(0) // returns 65
复制代码而String.fromCharCode()方法将数字转换为相等的 ASCII 字符。
 String.fromCharCode(65,66,67); // returns 'ABC'
复制代码⬆ 返回顶部 回到第300题
336.什么是数组缓冲区?
ArrayBuffer 对象用于表示通用的、固定长度的原始二进制数据缓冲区。您可以按如下方式创建它,
 let buffer = new ArrayBuffer(16); // 创建一个长度为 16 的缓冲区
 alert(buffer.byteLength); // 16
复制代码要操作 ArrayBuffer,我们需要使用“视图”对象。
 //创建一个引用缓冲区的 DataView
  let view = new DataView(buffer);
复制代码⬆ 返回顶部 回到第300题
337.下面的字符串表达式的输出是什么?
 console.log("Welcome to JS world"[0])
复制代码上述表达式的输出是“W”。
说明:字符串上带有特定索引的括号表示法返回特定位置的字符。因此,它返回字符串的字符“W”。由于 IE7 及以下版本不支持此功能,因此您可能需要使用 .charAt() 方法来获得所需的结果。
⬆ 返回顶部 回到第300题
338.Error对象的目的是什么?
Error 构造函数创建一个错误对象,并在发生运行时错误时抛出错误对象的实例。Error 对象还可以用作用户定义异常的基础对象。错误对象的语法如下,
 new Error([message[, fileName[, lineNumber]]])
复制代码您可以在 try...catch 块中使用 Error 对象抛出用户定义的异常或错误,如下所示,
 try {
   if(withdraw > balance)
   throw new Error("Oops! You don't have enough balance");
 } catch (e) {
   console.log( + ': ' + e.message);
 }
复制代码⬆ 返回顶部 回到第300题
339.EvalError 对象的目的是什么?
EvalError 对象指示有关全局eval()函数的错误。尽管 JavaScript 不再抛出此异常,但 EvalError 对象仍保持兼容性。这个表达式的语法如下,
 new EvalError([message[, fileName[, lineNumber]]])
复制代码你可以在 try...catch 块中抛出 EvalError ,如下所示,
 try {
   throw new EvalError('Eval function error', 'someFile.js', 100);
 } catch (e) {
   console.log(e.message, , e.fileName);              // "Eval function error", "EvalError", "someFile.js"
复制代码⬆ 返回顶部 回到第300题
340.从非严格模式到严格模式抛出的案例错误列表是什么?
当您应用“使用严格”时;语法,下面的一些情况会在执行脚本之前抛出 SyntaxError
使用八进制语法时
 var n = 022;
复制代码1.使用with语句 2.在变量名上使用 delete 运算符时 3.使用 eval 或 arguments 作为变量或函数参数名称 4.当您使用新保留的关键字时 5.当你在块中声明一个函数时
 if (someCondition) { function f() {} }
复制代码因此,上述案例中的错误有助于避免开发/生产环境中的错误。
⬆ 返回顶部 回到第300题
341.是否所有对象都有prototypes(原型)?
不是。除了由用户创建的基础对象或使用 new 关键字创建的对象之外,所有对象都有原型。
⬆ 返回顶部 回到第300题
342.parameter(形参)和argument(实参)有什么区别?
参数是函数定义的变量名,而参数表示函数被调用时赋予的值。让我们用一个简单的函数来解释这一点
 function myFunction(parameter1, parameter2, parameter3) {
   console.log(arguments[0]) // "argument1"
   console.log(arguments[1]) // "argument2"
   console.log(arguments[2]) // "argument3"
 }
 myFunction("argument1", "argument2", "argument3")
复制代码⬆ 返回顶部 回到第300题
343.数组中 some 方法的目的是什么?
some() 方法用于测试数组中是否至少有一个元素通过了提供的函数实现的测试。该方法返回一个布尔值。让我们举一个例子来测试任何奇数元素,
 var array = [1, 2, 3, 4, 5, 6 ,7, 8, 9, 10];
 var odd = element ==> element % 2 !== 0;
 console.log(array.some(odd)); // true(奇数元素存在)
复制代码⬆ 返回顶部 回到第300题
344.你如何组合两个或多个数组?
concat() 方法用于通过返回包含所有元素的新数组来连接两个或多个数组。语法如下,
array1.concat(array2, array3, ..., arrayX)
复制代码让我们以数组与蔬菜和水果数组的串联为例,
  var veggies = ["Tomato", "Carrot", "Cabbage"];
  var fruits = ["Apple", "Orange", "Pears"];
  var veggiesAndFruits = veggies.concat(fruits);
  console.log(veggiesAndFruits); // Tomato, Carrot, Cabbage, Apple, Orange, Pears
复制代码⬆ 返回顶部 回到第300题
345.浅拷贝和深拷贝有什么区别?
有两种方法可以复制对象,
浅拷贝: 浅拷贝是对象的按位拷贝。创建一个新对象,该对象具有原始对象中值的精确副本。如果对象的任何字段是对其他对象的引用,则仅复制引用地址,即仅复制内存地址。
例子
 var empDetails = {
   name: "John", age: 25, expertise: "Software Developer"
 }
复制代码创建副本
 var empDetailsShallowCopy = empDetails    //Shallow copying!
复制代码如果我们像这样更改重复项中的某些属性值:
  = "Johnson"
复制代码上面的语句也会改变 的名称empDetails,因为我们有一个浅拷贝。这意味着我们也会丢失原始数据。
深拷贝: 深拷贝复制所有字段,并复制这些字段指向的动态分配的内存。当一个对象与其所引用的对象一起被复制时,就会发生深度复制。
例子
 var empDetails = {
   name: "John", age: 25, expertise: "Software Developer"
 }
复制代码使用原始对象的属性创建一个深拷贝到新变量中
 var empDetailsDeepCopy = {
   name: ,
   age: empDetails.age,
   expertise: empDetails.expertise
 }
复制代码现在,如果您更改 ,它只会影响 empDetailsDeepCopy 而不会影响empDetails
⬆ 返回顶部 回到第300题
346.你如何创建一个字符串的特定数量的副本?
该repeat()方法用于构造和返回一个新字符串,该字符串包含调用它的字符串的指定数量的副本,并连接在一起。请记住,此方法已添加到 ECMAScript 2015 规范中。
我们以Hello字符串为例,重复4次,
'Hello'.repeat(4);  // 'HelloHelloHelloHello'
复制代码⬆ 返回顶部 回到第300题
347.你如何根据正则表达式返回所有匹配的字符串?
该matchAll()方法可用于返回与正则表达式匹配字符串的所有结果的迭代器。例如,下面的示例根据正则表达式返回匹配字符串结果的数组,
let regexp = /Hello(\d?))/g;
let greeting = 'Hello1Hello2Hello3';
let greetingList = [...greeting.matchAll(regexp)];
console.log(greetingList[0]); //Hello1
console.log(greetingList[1]); //Hello2
console.log(greetingList[2]); //Hello3
复制代码⬆ 返回顶部 回到第300题
348.你如何在开头或结尾修剪字符串?
trim字符串原型的方法用于修剪字符串的两侧。但是如果你想修剪特别是在字符串的开头或结尾,那么你可以使用trimStart/trimLeft和trimEnd/trimRight方法。让我们在问候消息中查看这些方法的示例,
var greeting = '   Hello, Goodmorning!   ';
console.log(greeting); // "   Hello, Goodmorning!   "
console.log(greeting.trimStart()); // "Hello, Goodmorning!   "
console.log(greeting.trimLeft()); // "Hello, Goodmorning!   "
console.log(greeting.trimEnd()); // "   Hello, Goodmorning!"
console.log(greeting.trimRight()); // "   Hello, Goodmorning!"
复制代码⬆ 返回顶部 回到第300题
349.下面带有一元运算符的控制台语句的输出是什么?
让我们使用一元运算符来执行控制台语句,如下所示,
console.log(+ 'Hello');
复制代码上述控制台日志语句的输出返回 NaN。因为元素以一元运算符为前缀,JavaScript 解释器会尝试将该元素转换为数字类型。由于转换失败,语句的值导致 NaN 值。
⬆ 返回顶部 回到第300题
350.javascript 是否使用 mixins?
使用了,mixin在javascript里可以看作是一种从别的对象"借用"功能的方法。每一个新定义的对象都有一个 prototype属性,其他的对象就可以从这里"借用"功能。这里的功能可以是一个属性,也可以是一个方法。
⬆ 返回顶部 回到第350题
351.什么是 thunk 函数?
thunk 只是一个延迟评估值的函数。它不接受任何参数,而是在您调用 thunk 时给出值。即,它用于现在不执行,但将来某个时候执行。让我们举一个同步的例子,
const add = (x,y) => x + y;
const thunk = () => add(2,3);
thunk() // 5
复制代码⬆ 返回顶部 回到第350题
352.什么是异步 thunk?
异步 thunk 可用于发出网络请求。让我们看一个网络请求的例子,
function fetchData(fn){
  fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(response => response.json())
  .then(json => fn(json))
}
const asyncThunk = function (){
   return fetchData(function getData(data){
      console.log(data)
  })
}
asyncThunk()
复制代码该getData函数不会立即被调用,但只会在数据从 API 端点可用时调用。setTimeout 函数也用于使我们的代码异步。最好的实时示例是 redux 状态管理库,它使用异步 thunk 来延迟要调度的操作。
⬆ 返回顶部 回到第350题
353.以下函数调用的输出是什么?
代码片段:
const circle = {
  radius: 20,
  diameter() {
    return this.radius * 2;
  },
  perimeter: () => 2 * Math.PI * this.radius
};
console.log(circle.diameter());
console.log(circle.perimeter());
复制代码输出:
输出是 40 和 NaN。请记住,直径是一个正则函数,而周长的值是一个箭头函数。this常规函数的关键字(即diameter)指的是周围的作用域,它是一个类(即Shape对象)。而perimeter函数的这个关键字是指周围的范围,它是一个窗口对象。由于窗口对象没有半径属性,它返回一个未定义的值,而数值的倍数返回 NaN 值。
⬆ 返回顶部 回到第350题
354.如何从字符串中删除所有换行符?
最简单的方法是使用正则表达式来检测和替换字符串中的换行符。在这种情况下,我们使用替换函数和要替换的字符串,在我们的例子中是一个空字符串。
function remove_linebreaks( var message ) {
    return message.replace( /[\r\n]+/gm, "" );
}
复制代码在上面的表达式中,g 和 m 用于全局和多行标志。
⬆ 返回顶部 回到第350题
355.回流和重绘有什么区别?
甲重绘更改时,其影响的元件的可见性,而不是它的布局发生。这方面的示例包括轮廓、可见性或背景颜色。甲回流涉及影响页面(或整页)的一部分的布局的变化。调整浏览器窗口大小、更改字体、更改内容(例如用户键入文本)、使用涉及计算样式的 JavaScript 方法、从 DOM 中添加或删除元素以及更改元素的类是一些可以触发回流的事情。元素的回流会导致所有子元素和祖先元素以及 DOM 中跟随它的任何元素的后续回流。
⬆ 返回顶部 回到第350题
356.否定数组会发生什么?
使用!字符否定数组将强制数组为布尔值。由于数组被认为是真实的所以否定它会返回false。
console.log(![]); // false
复制代码⬆ 返回顶部 回到第350题
357.如果我们添加两个数组会发生什么?
如果将两个数组相加,它会将它们都转换为字符串并将它们连接起来。例如,添加数组的结果如下,
console.log(['a'] + ['b']);  // "ab"
console.log([] + []); // ""
console.log(![] + []); // "false", because ![] returns false.
复制代码⬆ 返回顶部 回到第350题
358.在假值上添加加法运算符的输出是什么?
如果在假值(null、undefined、NaN、false、“”)上添加加法(+)运算符,则假值将转换为数字值零。让我们在浏览器控制台上显示它们,如下所示,
console.log(+null); // 0
console.log(+undefined);// NaN
console.log(+false); // 0
console.log(+NaN); // NaN
console.log(+""); // 0
复制代码⬆ 返回顶部 回到第350题
359.如何使用特殊字符创建自字符串?
self 字符串可以由!+字符组合形成。您需要记住以下约定才能实现此模式。
由于数组是真实值,否定数组将产生错误: ![] === false 根据 JavaScript 强制规则,将数组相加在一起会将它们串起来: [] + [] === "" 在数组前面加上 + 运算符会将数组转换为假,否定将使其为真,最后转换结果将产生值 '1': +(!(+[])) === 1 通过应用上述规则,我们可以得出以下条件
![] + [] === "false"
+!+[] === 1
复制代码现在字符模式将被创建如下,
     s               e               l               f
^^^^^^^^^^^^^   ^^^^^^^^^^^^^   ^^^^^^^^^^^^^   ^^^^^^^^^^^^^
(![] + [])[3] + (![] + [])[4] + (![] + [])[2] + (![] + [])[0]
^^^^^^^^^^^^^   ^^^^^^^^^^^^^   ^^^^^^^^^^^^^   ^^^^^^^^^^^^^
(![] + [])[+!+[]+!+[]+!+[]] +
(![] + [])[+!+[]+!+[]+!+[]+!+[]] +
(![] + [])[+!+[]+!+[]] +
(![] + [])[+[]]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(![]+[])[+!+[]+!+[]+!+[]]+(![]+[])[+!+[]+!+[]+!+[]+!+[]]+(![]+[])[+!+[]+!+[]]+(![]+[])[+[]]
复制代码⬆ 返回顶部 回到第350题
360.如何从数组中删除虚假值?
您可以通过将布尔值作为参数传递来对数组应用过滤器方法。通过这种方式,它会从数组中删除所有虚假值(0、未定义、空值、假和“”)。
const myArray = [false, null, 1,5, undefined]
myArray.filter(Boolean); // [1, 5] // 与 myArray.filter(x => x) 相同;
复制代码⬆ 返回顶部 回到第350题
361.你如何获得数组的唯一值?
您可以使用Set和 rest expression/spread(...) 语法的组合来获取数组的唯一值。
console.log([...new Set([1, 2, 4, 4, 3])]); // [1, 2, 4, 3]
复制代码⬆ 返回顶部 回到第350题
362.什么是解构别名?
有时,您希望解构变量的名称与属性名称不同。在这种情况下,您将使用 a: newName来指定变量的名称。这个过程称为解构别名。
const obj = { x: 1 };
// 抓取 obj.x 作为 { otherName }
const { x: otherName } = obj;
复制代码⬆ 返回顶部 回到第350题
363.如何在不使用 map 方法的情况下映射数组值?
map只用fromArray的方法就可以不使用方法映射数组值。让我们从国家数组映射城市名称,
const countries = [
   { name: 'China', capital: 'Beijing' },
   { name: 'India', capital: 'Delhi' },
   { name: 'US', capital: 'Washington' },
   { name: 'Russia', capital: 'Moscow' },
   { name: 'Singapore', capital: 'Singapore' },
   { name: 'France', capital: 'Paris' },
];
const cityNames = Array.from(countries, ({ capital}) => capital);
console.log(cityNames); // ['Beijing', 'Washington', 'Moscow', 'Singapore', 'Delhi', 'Paris']
复制代码⬆ 返回顶部 回到第350题
364.你如何清空一个数组?
您可以通过将数组长度设置为零来快速清空数组。
let cities = ['Singapore', 'Delhi', 'London'];
cities.length = 0; // cities becomes []
复制代码⬆ 返回顶部 回到第350题
365.你如何将数字四舍五入到某些小数?
您可以使用toFixed原生 javascript 中的方法将数字四舍五入到一定数量的小数。
let pie = 3.141592653;
pie = pie.toFixed(3); // 3.142
复制代码⬆ 返回顶部 回到第350题
366.将数组转换为对象的最简单方法是什么?
您可以使用 spread(...) 运算符将数组转换为具有相同数据的对象。
var fruits = ["banana", "apple", "orange", "watermelon"];
var fruitsObject = {...fruits};
console.log(fruitsObject); // {0: "banana", 1: "apple", 2: "orange", 3: "wate
复制代码⬆ 返回顶部 回到第350题
367.你如何用一些数据创建一个数组?
您可以使用fill方法创建具有某些数据的数组或具有相同值的数组。
var newArray = new Array(5).fill("0");
console.log(newArray); // ["0", "0", "0", "0", "0"]
复制代码⬆ 返回顶部 回到第350题
368.控制台对象的占位符是什么?
以下是控制台对象可用的占位符列表,
%o — 它需要一个对象, %s — 它需要一个字符串, %d — 用于十进制或整数 这些占位符可以在 console.log 中表示如下
const user = { "name":"Haiyong", "id": 1, "city": "Beijing"};
console.log("Hello %s, your details %o are available in the object form", "John", user); // Hello Haiyong, your details {name: "Haiyong", id: 1, city: "Beijing"} are available in object
复制代码⬆ 返回顶部 回到第350题
369.是否可以将 CSS 添加到控制台消息?
可以,您可以将 CSS 样式应用于类似于网页上的 html 文本的控制台消息。
console.log('%c 文本为蓝色,大字体和红色背景', 'color: blue; font-size: x-large; background: red');
复制代码文本将显示如下, 
注意:所有 CSS 样式都可以应用于控制台消息。
⬆ 返回顶部 回到第350题
370.控制台对象的dir方法的目的是什么?
console.dir()用于显示指定的JavaScript对象作为JSON的属性的交互式列表。
const user = { "name":"Haiyong", "id": 1, "city": "Beijing"};
console.dir(user);
复制代码
以 JSON 表示形式显示的用户对象
 
 
                     
            
        













 
                    

 
                 
                    