首页 文章 精选 留言 我的

精选列表

搜索[JavaScript库],共10000篇文章
优秀的个人博客,低调大师

JavaScript 可选链 ?. 的五种误用场景与替代写法

可选链操作符 `?.` 从 ES2020 正式进入标准,现在已经是日常开发里离不开的语法。它让深层属性访问变得安全,也让很多原本需要临时变量判断的代码缩短到一行。但我在维护团队代码和 review 时发现,可选链被拿来当“万能防错”的情况越来越多:有人用它包住函数调用,有人用它做条件分支,有人把整个对象链都打上问号,结果运行时该抛的错误不抛了,该处理的空值被静默跳过,调试时反而更难定位问题。可选链本质上只做一件事——当左侧为 `null` 或 `undefined` 时短路求值,它不是类型守卫,也不是错误捕获机制。这篇文章结合真实代码片段,梳理几个常见的误用场景,并给出更清晰的替代写法。 ## 用 `?.` 包住函数调用,吞掉了参数错误 见过这样的代码: ```js function renderUser(user) { return user?.getProfile?.().name; } ``` 调用方传了一个完整对象,但 `getProfile` 因为重构被删掉了,于是 `user?.getProfile?.()` 返回 `undefined`,接着 `.name` 直接抛出 `Cannot read properties of undefined`。可选链把“方法不存在”这个本应尽早暴露的问题推迟到了属性访问阶段,错误信息变得莫名其妙。 如果 `getProfile` 是接口约定必须存在的方法,就不该用 `?.`: ```js function renderUser(user) { if (!user || typeof user.getProfile !== 'function') { throw new TypeError('renderUser 需要一个带 getProfile 方法的用户对象'); } return user.getProfile().name; } ``` 可选链适合处理“数据可能不存在”的领域,比如后端返回的可选字段,而不是用来掩盖调用约定被破坏的事实。 ## 把 `?.` 当成条件判断的替代品 ```js if (config?.features?.darkMode) { enableDarkMode(); } ``` 这段代码能跑,但表达的意思很含糊:`config` 不存在、`features` 不存在、`darkMode` 为 `false`,三种情况走同一个分支。如果业务上需要区分“配置没加载”和“用户没开暗色模式”,这种写法会丢掉信息。 更麻烦的是当这个值需要参与逻辑运算时: ```js const isDark = config?.features?.darkMode || false; ``` 如果 `darkMode` 是 `0` 或空字符串,`||` 会把它们也转成 `false`,而 `??` 才能正确保留 falsy 值: ```js const isDark = config?.features?.darkMode ?? false; ``` 可选链和 `??` 经常一起出现,但它们的短路逻辑不同。`?.` 只在 `null`/`undefined` 时短路,`||` 会对所有 falsy 值生效,混用之前先想清楚字段的取值范围。 ## 可选链不能阻止对 `null` 继续取值 ```js const city = order?.address?.city?.toUpperCase(); ``` 如果 `city` 存在但是数字类型,`.toUpperCase` 会直接报错。可选链只检查左侧是不是 `null` 或 `undefined`,不检查类型。这类代码在 TypeScript 里如果开启了严格模式,通常会被类型检查拦住,但在 JS 项目里很容易漏过去。 替代方式是把类型约束交给 TS,或者显式判断: ```ts type City = string | undefined; function formatCity(city: City): string { return typeof city === 'string' ? city.toUpperCase() : ''; } ``` 用 `?.` 做字符串方法调用时,先确认字段的类型定义,而不是靠运行时侥幸。 ## 在赋值左侧使用 `?.` 是语法错误 ```js user?.name = 'Alice'; // SyntaxError ``` 可选链不能作为赋值目标,这一点在写更新逻辑时容易踩到。有人想表达“如果 user 存在就更新”,正确的写法是: ```js if (user) { user.name = 'Alice'; } ``` 或者用可选链读取,再用独立赋值: ```js const target = user?.profile; if (target) { target.name = 'Alice'; } ``` 同样,`delete user?.name` 也是不允许的。可选链的设计目标是安全读取,不是安全写入。 ## 深层可选链掩盖了数据结构问题 ```js const value = a?.b?.c?.d?.e; ``` 五个问号连在一起,通常意味着数据结构不稳定,或者调用方不确定自己在处理什么。这种代码短期能避免报错,长期会让空值来源无法追溯。更好的做法是在边界层做数据校验,把不确定的结构转换成确定的内部模型: ```js function normalizeResponse(raw) { return { user: { name: raw?.user?.name ?? '匿名', avatar: raw?.user?.avatar ?? DEFAULT_AVATAR, }, }; } ``` 这样深层可选链只出现在一个地方,业务代码拿到的是已经规整过的对象,后续访问不需要再层层打问号。可选链是边界处理的工具,不是内部数据流的常态。 ## 和 `try/catch` 的取舍 有人用可选链替代 `try/catch` 来防御 `JSON.parse`: ```js const data = JSON.parse(input)?.payload; ``` 这完全无效,因为 `JSON.parse` 解析失败会直接抛错,可选链不会拦截。正确做法还是包裹 try/catch: ```js function parsePayload(input) { try { return JSON.parse(input).payload; } catch { return null; } } ``` 可选链处理的是属性访问路径上的 `null`/`undefined`,异常控制流是另一套机制。把两者混在一起,只会让错误处理变得模糊。 可选链本身很好用,但每加一个 `?` 之前,问一下自己:这里真的是“可能不存在”,还是“我不确定它存不存在”?前者是合理的边界处理,后者需要去补类型定义或数据校验。 推荐查看天气:https://www.0dtq.com/wuzhi/15tian.html 推荐查看天气:https://www.0dtq.com/wuzhi/40tian.html 推荐查看天气:https://www.0dtq.com/jiaozuowenxian/ 推荐查看天气:https://www.0dtq.com/jiaozuowenxian/zuotian.html 推荐查看天气:https://www.0dtq.com/jiaozuowenxian/7tian.html 推荐查看天气:https://www.0dtq.com/jiaozuowenxian/10tian.html 推荐查看天气:https://www.0dtq.com/jiaozuowenxian/15tian.html 推荐查看天气:https://www.0dtq.com/jiaozuowenxian/40tian.html 推荐查看天气:https://www.0dtq.com/qinyang/ 推荐查看天气:https://www.0dtq.com/qinyang/zuotian.html 推荐查看天气:https://www.0dtq.com/qinyang/7tian.html 推荐查看天气:https://www.0dtq.com/qinyang/10tian.html 推荐查看天气:https://www.0dtq.com/qinyang/15tian.html 推荐查看天气:https://www.0dtq.com/qinyang/40tian.html 推荐查看天气:https://www.0dtq.com/mengzhou/ 推荐查看天气:https://www.0dtq.com/mengzhou/zuotian.html 推荐查看天气:https://www.0dtq.com/mengzhou/7tian.html 推荐查看天气:https://www.0dtq.com/mengzhou/10tian.html 推荐查看天气:https://www.0dtq.com/mengzhou/15tian.html 推荐查看天气:https://www.0dtq.com/mengzhou/40tian.html 推荐查看天气:https://www.0dtq.com/jiyuan/ 推荐查看天气:https://www.0dtq.com/jiyuan/zuotian.html 推荐查看天气:https://www.0dtq.com/jiyuan/7tian.html 推荐查看天气:https://www.0dtq.com/jiyuan/10tian.html 推荐查看天气:https://www.0dtq.com/jiyuan/15tian.html 推荐查看天气:https://www.0dtq.com/jiyuan/40tian.html 推荐查看天气:https://www.0dtq.com/puyang/ 推荐查看天气:https://www.0dtq.com/puyang/zuotian.html 推荐查看天气:https://www.0dtq.com/puyang/7tian.html 推荐查看天气:https://www.0dtq.com/puyang/10tian.html 推荐查看天气:https://www.0dtq.com/puyang/15tian.html 推荐查看天气:https://www.0dtq.com/puyang/40tian.html 推荐查看天气:https://www.0dtq.com/qingfeng/ 推荐查看天气:https://www.0dtq.com/qingfeng/zuotian.html 推荐查看天气:https://www.0dtq.com/qingfeng/7tian.html 推荐查看天气:https://www.0dtq.com/qingfeng/10tian.html 推荐查看天气:https://www.0dtq.com/qingfeng/15tian.html 推荐查看天气:https://www.0dtq.com/qingfeng/40tian.html 推荐查看天气:https://www.0dtq.com/nanle/ 推荐查看天气:https://www.0dtq.com/nanle/zuotian.html 推荐查看天气:https://www.0dtq.com/nanle/7tian.html 推荐查看天气:https://www.0dtq.com/nanle/10tian.html 推荐查看天气:https://www.0dtq.com/nanle/15tian.html 推荐查看天气:https://www.0dtq.com/nanle/40tian.html 推荐查看天气:https://www.0dtq.com/fanxian/ 推荐查看天气:https://www.0dtq.com/fanxian/zuotian.html 推荐查看天气:https://www.0dtq.com/fanxian/7tian.html 推荐查看天气:https://www.0dtq.com/fanxian/10tian.html 推荐查看天气:https://www.0dtq.com/fanxian/15tian.html 推荐查看天气:https://www.0dtq.com/fanxian/40tian.html 推荐查看天气:https://www.0dtq.com/taiqian/ 推荐查看天气:https://www.0dtq.com/taiqian/zuotian.html 推荐查看天气:https://www.0dtq.com/taiqian/7tian.html 推荐查看天气:https://www.0dtq.com/taiqian/10tian.html 推荐查看天气:https://www.0dtq.com/taiqian/15tian.html 推荐查看天气:https://www.0dtq.com/taiqian/40tian.html 推荐查看天气:https://www.0dtq.com/xuchang/ 推荐查看天气:https://www.0dtq.com/xuchang/zuotian.html 推荐查看天气:https://www.0dtq.com/xuchang/7tian.html 推荐查看天气:https://www.0dtq.com/xuchang/10tian.html 推荐查看天气:https://www.0dtq.com/xuchang/15tian.html 推荐查看天气:https://www.0dtq.com/xuchang/40tian.html 推荐查看天气:https://www.0dtq.com/xuchangyanling/ 推荐查看天气:https://www.0dtq.com/xuchangyanling/zuotian.html 推荐查看天气:https://www.0dtq.com/xuchangyanling/7tian.html 推荐查看天气:https://www.0dtq.com/xuchangyanling/10tian.html 推荐查看天气:https://www.0dtq.com/xuchangyanling/15tian.html 推荐查看天气:https://www.0dtq.com/xuchangyanling/40tian.html 推荐查看天气:https://www.0dtq.com/xuchangxiangcheng/ 推荐查看天气:https://www.0dtq.com/xuchangxiangcheng/zuotian.html 推荐查看天气:https://www.0dtq.com/xuchangxiangcheng/7tian.html 推荐查看天气:https://www.0dtq.com/xuchangxiangcheng/10tian.html 推荐查看天气:https://www.0dtq.com/xuchangxiangcheng/15tian.html 推荐查看天气:https://www.0dtq.com/xuchangxiangcheng/40tian.html 推荐查看天气:https://www.0dtq.com/xuchangyuzhou/ 推荐查看天气:https://www.0dtq.com/xuchangyuzhou/zuotian.html 推荐查看天气:https://www.0dtq.com/xuchangyuzhou/7tian.html 推荐查看天气:https://www.0dtq.com/xuchangyuzhou/10tian.html 推荐查看天气:https://www.0dtq.com/xuchangyuzhou/15tian.html 推荐查看天气:https://www.0dtq.com/xuchangyuzhou/40tian.html 推荐查看天气:https://www.0dtq.com/changge/ 推荐查看天气:https://www.0dtq.com/changge/zuotian.html 推荐查看天气:https://www.0dtq.com/changge/7tian.html 推荐查看天气:https://www.0dtq.com/changge/10tian.html 推荐查看天气:https://www.0dtq.com/changge/15tian.html 推荐查看天气:https://www.0dtq.com/changge/40tian.html 推荐查看天气:https://www.0dtq.com/luohe/ 推荐查看天气:https://www.0dtq.com/luohe/zuotian.html 推荐查看天气:https://www.0dtq.com/luohe/7tian.html 推荐查看天气:https://www.0dtq.com/luohe/10tian.html 推荐查看天气:https://www.0dtq.com/luohe/15tian.html 推荐查看天气:https://www.0dtq.com/luohe/40tian.html 推荐查看天气:https://www.0dtq.com/yuanhui/ 推荐查看天气:https://www.0dtq.com/yuanhui/zuotian.html 推荐查看天气:https://www.0dtq.com/yuanhui/7tian.html 推荐查看天气:https://www.0dtq.com/yuanhui/10tian.html 推荐查看天气:https://www.0dtq.com/yuanhui/15tian.html 推荐查看天气:https://www.0dtq.com/yuanhui/40tian.html 推荐查看天气:https://www.0dtq.com/wuyang/ 推荐查看天气:https://www.0dtq.com/wuyang/zuotian.html 推荐查看天气:https://www.0dtq.com/wuyang/7tian.html 推荐查看天气:https://www.0dtq.com/wuyang/10tian.html 推荐查看天气:https://www.0dtq.com/wuyang/15tian.html 推荐查看天气:https://www.0dtq.com/wuyang/40tian.html 推荐查看天气:https://www.0dtq.com/linying/ 推荐查看天气:https://www.0dtq.com/linying/zuotian.html 推荐查看天气:https://www.0dtq.com/linying/7tian.html 推荐查看天气:https://www.0dtq.com/linying/10tian.html 推荐查看天气:https://www.0dtq.com/linying/15tian.html 推荐查看天气:https://www.0dtq.com/linying/40tian.html 推荐查看天气:https://www.0dtq.com/sanmenxia/ 推荐查看天气:https://www.0dtq.com/sanmenxia/zuotian.html 推荐查看天气:https://www.0dtq.com/sanmenxia/7tian.html 推荐查看天气:https://www.0dtq.com/sanmenxia/10tian.html 推荐查看天气:https://www.0dtq.com/sanmenxia/15tian.html 推荐查看天气:https://www.0dtq.com/sanmenxia/40tian.html 推荐查看天气:https://www.0dtq.com/hubin/ 推荐查看天气:https://www.0dtq.com/hubin/zuotian.html 推荐查看天气:https://www.0dtq.com/hubin/7tian.html 推荐查看天气:https://www.0dtq.com/hubin/10tian.html 推荐查看天气:https://www.0dtq.com/hubin/15tian.html 推荐查看天气:https://www.0dtq.com/hubin/40tian.html 推荐查看天气:https://www.0dtq.com/shengchi/ 推荐查看天气:https://www.0dtq.com/shengchi/zuotian.html 推荐查看天气:https://www.0dtq.com/shengchi/7tian.html 推荐查看天气:https://www.0dtq.com/shengchi/10tian.html 推荐查看天气:https://www.0dtq.com/shengchi/15tian.html 推荐查看天气:https://www.0dtq.com/shengchi/40tian.html 推荐查看天气:https://www.0dtq.com/shanxian/ 推荐查看天气:https://www.0dtq.com/shanxian/zuotian.html 推荐查看天气:https://www.0dtq.com/shanxian/7tian.html 推荐查看天气:https://www.0dtq.com/shanxian/10tian.html 推荐查看天气:https://www.0dtq.com/shanxian/15tian.html 推荐查看天气:https://www.0dtq.com/shanxian/40tian.html 推荐查看天气:https://www.0dtq.com/lushi/ 推荐查看天气:https://www.0dtq.com/lushi/zuotian.html 推荐查看天气:https://www.0dtq.com/lushi/7tian.html 推荐查看天气:https://www.0dtq.com/lushi/10tian.html 推荐查看天气:https://www.0dtq.com/lushi/15tian.html 推荐查看天气:https://www.0dtq.com/lushi/40tian.html 推荐查看天气:https://www.0dtq.com/yima/ 推荐查看天气:https://www.0dtq.com/yima/zuotian.html 推荐查看天气:https://www.0dtq.com/yima/7tian.html 推荐查看天气:https://www.0dtq.com/yima/10tian.html 推荐查看天气:https://www.0dtq.com/yima/15tian.html 推荐查看天气:https://www.0dtq.com/yima/40tian.html 推荐查看天气:https://www.0dtq.com/lingbao/ 推荐查看天气:https://www.0dtq.com/lingbao/zuotian.html 推荐查看天气:https://www.0dtq.com/lingbao/7tian.html 推荐查看天气:https://www.0dtq.com/lingbao/10tian.html 推荐查看天气:https://www.0dtq.com/lingbao/15tian.html 推荐查看天气:https://www.0dtq.com/lingbao/40tian.html 推荐查看天气:https://www.0dtq.com/nanyang/ 推荐查看天气:https://www.0dtq.com/nanyang/zuotian.html 推荐查看天气:https://www.0dtq.com/nanyang/7tian.html 推荐查看天气:https://www.0dtq.com/nanyang/10tian.html 推荐查看天气:https://www.0dtq.com/nanyang/15tian.html 推荐查看天气:https://www.0dtq.com/nanyang/40tian.html 推荐查看天气:https://www.0dtq.com/wancheng/ 推荐查看天气:https://www.0dtq.com/wancheng/zuotian.html 推荐查看天气:https://www.0dtq.com/wancheng/7tian.html 推荐查看天气:https://www.0dtq.com/wancheng/10tian.html 推荐查看天气:https://www.0dtq.com/wancheng/15tian.html 推荐查看天气:https://www.0dtq.com/wancheng/40tian.html 推荐查看天气:https://www.0dtq.com/wolong/ 推荐查看天气:https://www.0dtq.com/wolong/zuotian.html 推荐查看天气:https://www.0dtq.com/wolong/7tian.html 推荐查看天气:https://www.0dtq.com/wolong/10tian.html 推荐查看天气:https://www.0dtq.com/wolong/15tian.html 推荐查看天气:https://www.0dtq.com/wolong/40tian.html 推荐查看天气:https://www.0dtq.com/nanzhao/ 推荐查看天气:https://www.0dtq.com/nanzhao/zuotian.html 推荐查看天气:https://www.0dtq.com/nanzhao/7tian.html 推荐查看天气:https://www.0dtq.com/nanzhao/10tian.html 推荐查看天气:https://www.0dtq.com/nanzhao/15tian.html 推荐查看天气:https://www.0dtq.com/nanzhao/40tian.html 推荐查看天气:https://www.0dtq.com/nanyangfangcheng/ 推荐查看天气:https://www.0dtq.com/nanyangfangcheng/zuotian.html 推荐查看天气:https://www.0dtq.com/nanyangfangcheng/7tian.html 推荐查看天气:https://www.0dtq.com/nanyangfangcheng/10tian.html 推荐查看天气:https://www.0dtq.com/nanyangfangcheng/15tian.html 推荐查看天气:https://www.0dtq.com/nanyangfangcheng/40tian.html 推荐查看天气:https://www.0dtq.com/nanyangxixia/ 推荐查看天气:https://www.0dtq.com/nanyangxixia/zuotian.html 推荐查看天气:https://www.0dtq.com/nanyangxixia/7tian.html 推荐查看天气:https://www.0dtq.com/nanyangxixia/10tian.html 推荐查看天气:https://www.0dtq.com/nanyangxixia/15tian.html 推荐查看天气:https://www.0dtq.com/nanyangxixia/40tian.html 推荐查看天气:https://www.0dtq.com/nanyangzhenping/ 推荐查看天气:https://www.0dtq.com/nanyangzhenping/zuotian.html 推荐查看天气:https://www.0dtq.com/nanyangzhenping/7tian.html 推荐查看天气:https://www.0dtq.com/nanyangzhenping/10tian.html 推荐查看天气:https://www.0dtq.com/nanyangzhenping/15tian.html 推荐查看天气:https://www.0dtq.com/nanyangzhenping/40tian.html 推荐查看天气:https://www.0dtq.com/naxiang/ 推荐查看天气:https://www.0dtq.com/naxiang/zuotian.html 推荐查看天气:https://www.0dtq.com/naxiang/7tian.html 推荐查看天气:https://www.0dtq.com/naxiang/10tian.html 推荐查看天气:https://www.0dtq.com/naxiang/15tian.html 推荐查看天气:https://www.0dtq.com/naxiang/40tian.html

优秀的个人博客,低调大师

JavaScript 中的 Array.prototype.sort 为何不总是按预期排序?

在开发中,我们经常用 `Array.prototype.sort()` 对数组排序,特别是处理数字数组时,默认行为常常让人困惑。比如 `[1, 5, 10, 2].sort()` 会得到 `[1, 10, 2, 5]`,而不是按数值大小排列。这是因为 `sort` 默认将元素转换为字符串,再比较 UTF-16 码元序列。更隐蔽的问题出现在比较函数返回值不规范、数组包含 `undefined` 或稀疏元素,以及现代引擎对稳定排序的差异上。本文从底层规范与常见误区出发,讨论排序不生效的原因、比较函数的正确写法、以及处理数字、对象、多字段排序时的可靠做法,同时涉及性能与稳定性的取舍。 ## 默认比较是字符串比较 `sort()` 不传参数时,会把所有元素转成字符串,然后按 UTF-16 码元顺序比较。数字 `10` 转成 `"10"`,`2` 转成 `"2"`,字符串比较中 `"10"` 的字符 `'1'` 排在 `'2'` 前面,所以 `10` 会出现在 `2` 之前。这个行为从 ES1 就定下来了,不能依赖它做数值排序。 ```js const nums = [1, 5, 10, 2]; nums.sort(); console.log(nums); // [1, 10, 2, 5] ``` 要按数值排序,必须提供比较函数。 ```js nums.sort((a, b) => a - b); console.log(nums); // [1, 2, 5, 10] ``` ## 比较函数返回值的要求 比较函数应该返回一个数字: - 小于 0:`a` 排在 `b` 前面 - 大于 0:`b` 排在 `a` 前面 - 等于 0:保持相对顺序(在稳定排序下) 很多人会写成返回布尔值或者直接返回差值却忽略浮点数精度。例如 `return a > b` 只会返回 `true` 或 `false`,被隐式转换为 `1` 或 `0`,导致 `a a > b); // 结果不可靠 // 正确:返回数值 [3, 1, 2].sort((a, b) => a - b); ``` 对于可能超出安全整数的数字,用 `a - b` 也可能溢出或丢失精度,更安全的是用比较运算符返回 -1 / 0 / 1。 ```js function compareNumbers(a, b) { if (a b) return 1; return 0; } ``` ## undefined、null 和稀疏元素 `undefined` 元素会被 `sort` 一律排到数组末尾,比较函数也不会被调用。`null` 则会被转换成字符串 `"null"`。稀疏数组中的空槽会被当作 `undefined` 处理,并且排序后空槽可能被具体值填充,改变数组长度。 ```js const arr = [3, undefined, 1, null, 2]; arr.sort((a, b) => a - b); console.log(arr); // [1, 2, 3, null, undefined] ``` 如果数据来自 JSON 或接口,字段可能缺失,最好先过滤或映射为统一类型再排序。 ## 对象数组和多字段排序 按对象属性排序时,要确保属性可比较且类型一致。混合字符串和数字时,`a - b` 会得到 `NaN`,比较函数返回 `NaN` 被当作 0,排序失效。 ```js const users = [ { name: 'Alice', age: 30 }, { name: 'Bob', age: 25 }, { name: 'Carol', age: 30 } ]; users.sort((a, b) => a.age - b.age); ``` 多字段排序可以用链式比较,先比较主要字段,相等时再比较次要字段。 ```js users.sort((a, b) => { if (a.age !== b.age) return a.age - b.age; return a.name.localeCompare(b.name); }); ``` `localeCompare` 适合字符串比较,能处理语言敏感的大小写和变音符号。 ## 稳定排序与引擎差异 ES2019 之前,规范不要求 `sort` 稳定,V8 对短数组用插入排序(稳定),长数组用快速排序(不稳定)。ES2019 起要求稳定排序,所有现代引擎都遵守。但稳定只保证比较函数返回 0 的元素相对顺序不变,如果比较函数本身设计有问题,依然会得到意外结果。 ```js const items = [ { id: 1, type: 'b' }, { id: 2, type: 'a' }, { id: 3, type: 'b' } ]; items.sort((a, b) => a.type.localeCompare(b.type)); // id 为 1 和 3 的元素都会保持原有相对顺序 ``` ## 性能与拷贝 `sort` 会直接修改原数组。如果不希望改变原数组,先用 `slice()` 或扩展运算符复制。 ```js const sorted = [...arr].sort((a, b) => a - b); ``` 比较函数应尽量简单,避免在函数内部做复杂计算或频繁访问闭包变量。对于大数组,可以先映射出排序键,排序后再映射回原对象,减少重复属性访问。 ```js const sorted = arr .map(item => ({ item, key: item.value })) .sort((a, b) => a.key - b.key) .map(entry => entry.item); ``` 如果只需要前 N 个元素,不必全量排序,可以用堆或选择算法,但多数场景下 `sort` 足够快。 ## 实际排查建议 遇到排序不符合预期,先检查比较函数返回值是否符合规范,再确认数组元素类型是否一致,有无 `undefined`、`null` 或数字字符串混合。用 `console.log` 在比较函数里打印参数和返回值是快速定位手段,但线上环境记得移除。单元测试里加几条边界用例,比如空数组、单元素、相同值、极端数值,能避免大部分低级错误。 推荐查看天气:https://www.40tianqi.com/jiancaoping/ 推荐查看天气:https://www.40tianqi.com/jiancaoping/zuotian.html 推荐查看天气:https://www.40tianqi.com/jiancaoping/7tian.html 推荐查看天气:https://www.40tianqi.com/jiancaoping/10tian.html 推荐查看天气:https://www.40tianqi.com/jiancaoping/15tian.html 推荐查看天气:https://www.40tianqi.com/jiancaoping/40tian.html 推荐查看天气:https://www.40tianqi.com/wanbailin/ 推荐查看天气:https://www.40tianqi.com/wanbailin/zuotian.html 推荐查看天气:https://www.40tianqi.com/wanbailin/7tian.html 推荐查看天气:https://www.40tianqi.com/wanbailin/10tian.html 推荐查看天气:https://www.40tianqi.com/wanbailin/15tian.html 推荐查看天气:https://www.40tianqi.com/wanbailin/40tian.html 推荐查看天气:https://www.40tianqi.com/jinyuan/ 推荐查看天气:https://www.40tianqi.com/jinyuan/zuotian.html 推荐查看天气:https://www.40tianqi.com/jinyuan/7tian.html 推荐查看天气:https://www.40tianqi.com/jinyuan/10tian.html 推荐查看天气:https://www.40tianqi.com/jinyuan/15tian.html 推荐查看天气:https://www.40tianqi.com/jinyuan/40tian.html 推荐查看天气:https://www.40tianqi.com/qingxu/ 推荐查看天气:https://www.40tianqi.com/qingxu/zuotian.html 推荐查看天气:https://www.40tianqi.com/qingxu/7tian.html 推荐查看天气:https://www.40tianqi.com/qingxu/10tian.html 推荐查看天气:https://www.40tianqi.com/qingxu/15tian.html 推荐查看天气:https://www.40tianqi.com/qingxu/40tian.html 推荐查看天气:https://www.40tianqi.com/yangqu/ 推荐查看天气:https://www.40tianqi.com/yangqu/zuotian.html 推荐查看天气:https://www.40tianqi.com/yangqu/7tian.html 推荐查看天气:https://www.40tianqi.com/yangqu/10tian.html 推荐查看天气:https://www.40tianqi.com/yangqu/15tian.html 推荐查看天气:https://www.40tianqi.com/yangqu/40tian.html 推荐查看天气:https://www.40tianqi.com/loufan/ 推荐查看天气:https://www.40tianqi.com/loufan/zuotian.html 推荐查看天气:https://www.40tianqi.com/loufan/7tian.html 推荐查看天气:https://www.40tianqi.com/loufan/10tian.html 推荐查看天气:https://www.40tianqi.com/loufan/15tian.html 推荐查看天气:https://www.40tianqi.com/loufan/40tian.html 推荐查看天气:https://www.40tianqi.com/gujiao/ 推荐查看天气:https://www.40tianqi.com/gujiao/zuotian.html 推荐查看天气:https://www.40tianqi.com/gujiao/7tian.html 推荐查看天气:https://www.40tianqi.com/gujiao/10tian.html 推荐查看天气:https://www.40tianqi.com/gujiao/15tian.html 推荐查看天气:https://www.40tianqi.com/gujiao/40tian.html 推荐查看天气:https://www.40tianqi.com/datongshi/ 推荐查看天气:https://www.40tianqi.com/datongshi/zuotian.html 推荐查看天气:https://www.40tianqi.com/datongshi/7tian.html 推荐查看天气:https://www.40tianqi.com/datongshi/10tian.html 推荐查看天气:https://www.40tianqi.com/datongshi/15tian.html 推荐查看天气:https://www.40tianqi.com/datongshi/40tian.html 推荐查看天气:https://www.40tianqi.com/nanjiao/ 推荐查看天气:https://www.40tianqi.com/nanjiao/zuotian.html 推荐查看天气:https://www.40tianqi.com/nanjiao/7tian.html 推荐查看天气:https://www.40tianqi.com/nanjiao/10tian.html 推荐查看天气:https://www.40tianqi.com/nanjiao/15tian.html 推荐查看天气:https://www.40tianqi.com/nanjiao/40tian.html 推荐查看天气:https://www.40tianqi.com/xinrong/ 推荐查看天气:https://www.40tianqi.com/xinrong/zuotian.html 推荐查看天气:https://www.40tianqi.com/xinrong/7tian.html 推荐查看天气:https://www.40tianqi.com/xinrong/10tian.html 推荐查看天气:https://www.40tianqi.com/xinrong/15tian.html 推荐查看天气:https://www.40tianqi.com/xinrong/40tian.html 推荐查看天气:https://www.40tianqi.com/yanggao/ 推荐查看天气:https://www.40tianqi.com/yanggao/zuotian.html 推荐查看天气:https://www.40tianqi.com/yanggao/7tian.html 推荐查看天气:https://www.40tianqi.com/yanggao/10tian.html 推荐查看天气:https://www.40tianqi.com/yanggao/15tian.html 推荐查看天气:https://www.40tianqi.com/yanggao/40tian.html 推荐查看天气:https://www.40tianqi.com/tianzhen/ 推荐查看天气:https://www.40tianqi.com/tianzhen/zuotian.html 推荐查看天气:https://www.40tianqi.com/tianzhen/7tian.html 推荐查看天气:https://www.40tianqi.com/tianzhen/10tian.html 推荐查看天气:https://www.40tianqi.com/tianzhen/15tian.html 推荐查看天气:https://www.40tianqi.com/tianzhen/40tian.html 推荐查看天气:https://www.40tianqi.com/datongguangling/ 推荐查看天气:https://www.40tianqi.com/datongguangling/zuotian.html 推荐查看天气:https://www.40tianqi.com/datongguangling/7tian.html 推荐查看天气:https://www.40tianqi.com/datongguangling/10tian.html 推荐查看天气:https://www.40tianqi.com/datongguangling/15tian.html 推荐查看天气:https://www.40tianqi.com/datongguangling/40tian.html 推荐查看天气:https://www.40tianqi.com/lingqiu/ 推荐查看天气:https://www.40tianqi.com/lingqiu/zuotian.html 推荐查看天气:https://www.40tianqi.com/lingqiu/7tian.html 推荐查看天气:https://www.40tianqi.com/lingqiu/10tian.html 推荐查看天气:https://www.40tianqi.com/lingqiu/15tian.html 推荐查看天气:https://www.40tianqi.com/lingqiu/40tian.html 推荐查看天气:https://www.40tianqi.com/hunyuan/ 推荐查看天气:https://www.40tianqi.com/hunyuan/zuotian.html 推荐查看天气:https://www.40tianqi.com/hunyuan/7tian.html 推荐查看天气:https://www.40tianqi.com/hunyuan/10tian.html 推荐查看天气:https://www.40tianqi.com/hunyuan/15tian.html 推荐查看天气:https://www.40tianqi.com/hunyuan/40tian.html 推荐查看天气:https://www.40tianqi.com/zuoyun/ 推荐查看天气:https://www.40tianqi.com/zuoyun/zuotian.html 推荐查看天气:https://www.40tianqi.com/zuoyun/7tian.html 推荐查看天气:https://www.40tianqi.com/zuoyun/10tian.html 推荐查看天气:https://www.40tianqi.com/zuoyun/15tian.html 推荐查看天气:https://www.40tianqi.com/zuoyun/40tian.html 推荐查看天气:https://www.40tianqi.com/datongxian/ 推荐查看天气:https://www.40tianqi.com/datongxian/zuotian.html 推荐查看天气:https://www.40tianqi.com/datongxian/7tian.html 推荐查看天气:https://www.40tianqi.com/datongxian/10tian.html 推荐查看天气:https://www.40tianqi.com/datongxian/15tian.html 推荐查看天气:https://www.40tianqi.com/datongxian/40tian.html 推荐查看天气:https://www.40tianqi.com/yangquan/ 推荐查看天气:https://www.40tianqi.com/yangquan/zuotian.html 推荐查看天气:https://www.40tianqi.com/yangquan/7tian.html 推荐查看天气:https://www.40tianqi.com/yangquan/10tian.html 推荐查看天气:https://www.40tianqi.com/yangquan/15tian.html 推荐查看天气:https://www.40tianqi.com/yangquan/40tian.html 推荐查看天气:https://www.40tianqi.com/kuangqu/ 推荐查看天气:https://www.40tianqi.com/kuangqu/zuotian.html 推荐查看天气:https://www.40tianqi.com/kuangqu/7tian.html 推荐查看天气:https://www.40tianqi.com/kuangqu/10tian.html 推荐查看天气:https://www.40tianqi.com/kuangqu/15tian.html 推荐查看天气:https://www.40tianqi.com/kuangqu/40tian.html 推荐查看天气:https://www.40tianqi.com/pingding/ 推荐查看天气:https://www.40tianqi.com/pingding/zuotian.html 推荐查看天气:https://www.40tianqi.com/pingding/7tian.html 推荐查看天气:https://www.40tianqi.com/pingding/10tian.html 推荐查看天气:https://www.40tianqi.com/pingding/15tian.html 推荐查看天气:https://www.40tianqi.com/pingding/40tian.html 推荐查看天气:https://www.40tianqi.com/yuxian/ 推荐查看天气:https://www.40tianqi.com/yuxian/zuotian.html 推荐查看天气:https://www.40tianqi.com/yuxian/7tian.html 推荐查看天气:https://www.40tianqi.com/yuxian/10tian.html 推荐查看天气:https://www.40tianqi.com/yuxian/15tian.html 推荐查看天气:https://www.40tianqi.com/yuxian/40tian.html 推荐查看天气:https://www.40tianqi.com/changzhi/ 推荐查看天气:https://www.40tianqi.com/changzhi/zuotian.html 推荐查看天气:https://www.40tianqi.com/changzhi/7tian.html 推荐查看天气:https://www.40tianqi.com/changzhi/10tian.html 推荐查看天气:https://www.40tianqi.com/changzhi/15tian.html 推荐查看天气:https://www.40tianqi.com/changzhi/40tian.html 推荐查看天气:https://www.40tianqi.com/xiangyuan/ 推荐查看天气:https://www.40tianqi.com/xiangyuan/zuotian.html 推荐查看天气:https://www.40tianqi.com/xiangyuan/7tian.html 推荐查看天气:https://www.40tianqi.com/xiangyuan/10tian.html 推荐查看天气:https://www.40tianqi.com/xiangyuan/15tian.html 推荐查看天气:https://www.40tianqi.com/xiangyuan/40tian.html 推荐查看天气:https://www.40tianqi.com/tunliu/ 推荐查看天气:https://www.40tianqi.com/tunliu/zuotian.html 推荐查看天气:https://www.40tianqi.com/tunliu/7tian.html 推荐查看天气:https://www.40tianqi.com/tunliu/10tian.html 推荐查看天气:https://www.40tianqi.com/tunliu/15tian.html 推荐查看天气:https://www.40tianqi.com/tunliu/40tian.html 推荐查看天气:https://www.40tianqi.com/pingshun/ 推荐查看天气:https://www.40tianqi.com/pingshun/zuotian.html 推荐查看天气:https://www.40tianqi.com/pingshun/7tian.html 推荐查看天气:https://www.40tianqi.com/pingshun/10tian.html 推荐查看天气:https://www.40tianqi.com/pingshun/15tian.html 推荐查看天气:https://www.40tianqi.com/pingshun/40tian.html 推荐查看天气:https://www.40tianqi.com/changzhilicheng/ 推荐查看天气:https://www.40tianqi.com/changzhilicheng/zuotian.html 推荐查看天气:https://www.40tianqi.com/changzhilicheng/7tian.html 推荐查看天气:https://www.40tianqi.com/changzhilicheng/10tian.html 推荐查看天气:https://www.40tianqi.com/changzhilicheng/15tian.html 推荐查看天气:https://www.40tianqi.com/changzhilicheng/40tian.html 推荐查看天气:https://www.40tianqi.com/huguan/ 推荐查看天气:https://www.40tianqi.com/huguan/zuotian.html 推荐查看天气:https://www.40tianqi.com/huguan/7tian.html 推荐查看天气:https://www.40tianqi.com/huguan/10tian.html 推荐查看天气:https://www.40tianqi.com/huguan/15tian.html 推荐查看天气:https://www.40tianqi.com/huguan/40tian.html 推荐查看天气:https://www.40tianqi.com/changzi/ 推荐查看天气:https://www.40tianqi.com/changzi/zuotian.html 推荐查看天气:https://www.40tianqi.com/changzi/7tian.html 推荐查看天气:https://www.40tianqi.com/changzi/10tian.html 推荐查看天气:https://www.40tianqi.com/changzi/15tian.html 推荐查看天气:https://www.40tianqi.com/changzi/40tian.html 推荐查看天气:https://www.40tianqi.com/wuxiang/ 推荐查看天气:https://www.40tianqi.com/wuxiang/zuotian.html 推荐查看天气:https://www.40tianqi.com/wuxiang/7tian.html 推荐查看天气:https://www.40tianqi.com/wuxiang/10tian.html 推荐查看天气:https://www.40tianqi.com/wuxiang/15tian.html 推荐查看天气:https://www.40tianqi.com/wuxiang/40tian.html 推荐查看天气:https://www.40tianqi.com/qinxian/ 推荐查看天气:https://www.40tianqi.com/qinxian/zuotian.html 推荐查看天气:https://www.40tianqi.com/qinxian/7tian.html 推荐查看天气:https://www.40tianqi.com/qinxian/10tian.html 推荐查看天气:https://www.40tianqi.com/qinxian/15tian.html 推荐查看天气:https://www.40tianqi.com/qinxian/40tian.html 推荐查看天气:https://www.40tianqi.com/qinyuan/ 推荐查看天气:https://www.40tianqi.com/qinyuan/zuotian.html 推荐查看天气:https://www.40tianqi.com/qinyuan/7tian.html 推荐查看天气:https://www.40tianqi.com/qinyuan/10tian.html 推荐查看天气:https://www.40tianqi.com/qinyuan/15tian.html 推荐查看天气:https://www.40tianqi.com/qinyuan/40tian.html 推荐查看天气:https://www.40tianqi.com/shuozhou/ 推荐查看天气:https://www.40tianqi.com/shuozhou/zuotian.html 推荐查看天气:https://www.40tianqi.com/shuozhou/7tian.html 推荐查看天气:https://www.40tianqi.com/shuozhou/10tian.html 推荐查看天气:https://www.40tianqi.com/shuozhou/15tian.html 推荐查看天气:https://www.40tianqi.com/shuozhou/40tian.html 推荐查看天气:https://www.40tianqi.com/shuocheng/ 推荐查看天气:https://www.40tianqi.com/shuocheng/zuotian.html 推荐查看天气:https://www.40tianqi.com/shuocheng/7tian.html 推荐查看天气:https://www.40tianqi.com/shuocheng/10tian.html 推荐查看天气:https://www.40tianqi.com/shuocheng/15tian.html 推荐查看天气:https://www.40tianqi.com/shuocheng/40tian.html 推荐查看天气:https://www.40tianqi.com/shuozhoupinglu/ 推荐查看天气:https://www.40tianqi.com/shuozhoupinglu/zuotian.html

优秀的个人博客,低调大师

dart系列之:HTML的专属领域,除了javascript之外,dart也可以

简介 虽然dart可以同时用作客户端和服务器端,但是基本上dart还是用做flutter开发的基本语言而使用的。除了andorid和ios之外,web就是最常见和通用的平台了,dart也提供了对HTML的原生支持,这个支持就是dart:html包。 dart:html提供了对DOM对象的各种有用的操作和对HTML5 API的支持。这样我们可以直接使用dart来操作HTML。 除了DOM之外,dart:html还可以对css进行操作,使用dart:html也非常简单: import 'dart:html'; DOM操作 对于DOM操作来说,首先是需要找到这个元素。 dart提供了querySelector() 和 querySelectorAll()方法,可以根据ID, class, tag, name或者这些元素的集合来进行查找。 同样都是query方法,两者的不同在于,querySelector只返回找到的第一个元素,而querySelectorAll返回找到的所有元素。 所以querySelector返回的是一个Element,而querySelectorAll返回的是一个集合List。 Element idElement = querySelector('#someId')!; Element classElement = querySelector('.some-class')!; List<Element> divElements = querySelectorAll('div'); List<Element> textInputElements = querySelectorAll( 'input[type="text"]',); List<Element> specialElement = querySelectorAll('#someId div.class'); 上面就是我们查找DOM中元素的操作。找到之后,就可以对这些元素进行操作了。 dart使用Element来表示DOM中的元素。对于每个Element来说,都拥有classes, hidden, id, style, 和 title 这些属性。 如果Element中并没有要设置的属性,则可以使用attributes,如下: elem.attributes['someAttribute'] = 'someValue'; 当然对应某些特殊的Element,会有Element对应的子类与之绑定。 比如对于一个a标签来说,如下所示: <a id="name" href="/name/detail">详情</a> a标签对应的是dart中的AnchorElement元素。 如果要改变a标签的href值,可以这样: var anchor = querySelector('#name') as AnchorElement; anchor.href = 'http://www.flydean.com'; 还可以添加、替换或者删除对应的节点: querySelector('#id')!.nodes.add(elem); querySelector('#id')!.replaceWith(elem); querySelector('#id')?.remove(); 上面我们使用了一个特殊的运算符,感叹号,表示的是将一个可为空的类型转换成为不为空的类型。 CSS操作 CSS实际上就是element中的class,当我们获取到element之后,就可以调用他的classes字段,然后对CSS进行处理。 elem.classes返回的是一个list,我们可以向其添加或者删除对应的class。 var name = querySelector('#id')!; name.classes.add('redline'); 有class当然是最好了,class也是我们推荐的写法。但是有时候还是需要直接在element中添加style,如下所示: name.style ..fontWeight = 'bold' ..fontSize = '3em'; 处理事件 和DOM的交互就是各种事件,向element中添加event,可以使用element.onEvent.listen(function). 比如我们可以添加click事件: querySelector('#id')!.onClick.listen((e) { // do something }); 下面是常用的一些event: change blur keyDown keyUp mouseDown mouseUp 总结 以上就是Dart对html的支持。 本文已收录于http://www.flydean.com/20-dart-html/ 最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现! 欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册