You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需显式调用length,像C# Range那样获取JavaScript子串?

问题描述

当字符串来源是未知表达式(或表达式存在副作用)时,我们需要先将其存入变量,才能截取开头至倒数第二个字符,这需要两行代码:

const str = new Date().toISOString();
return str.substring(0, str.length - 1);

// 强行写成一行的话,表达式会被执行两次,存在冗余:
return new Date().toISOString().substring(0, new Date().toISOString().length - 1);

有没有类似C# Range运算符的简洁写法,能实现单行操作?比如C#中可以这样简洁处理:

return new DateTimeOffset().ToString("o")[..^1];

注:我清楚内部可能仍会调用length属性,此问题并非针对性能优化,而是寻求更简短清晰的写法。

可行方案
  • 使用slice方法(推荐):slice原生支持负索引,直接传入0, -1即可截取到倒数第二个字符,无需手动计算长度,是最简洁的实现方式:

    return new Date().toISOString().slice(0, -1);
    
  • 立即执行箭头函数包裹:通过自执行函数将表达式仅执行一次,避免重复计算,同时保持单行结构:

    return (str => str.substring(0, str.length - 1))(new Date().toISOString());
    
  • 管道运算符(需环境支持):ES2022的管道运算符(部分环境需配置启用)能让逻辑更直观:

    return new Date().toISOString() |> (str => str.slice(0, -1));
    

内容的提问来源于stack exchange,提问作者Luke Vo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 07:17:11