gpt4 book ai didi

javascript - 给定 ‘undefined’(获得默认值)的 JS fn 可选参数失败至少 ‘new Date(yr,moi,d,hr,min,s,ms)’ +Array.prototype.splice

转载 作者:行者123 更新时间:2023-12-04 07:52:30 25 4
gpt4 key购买 nike

官方 JS 文档 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Default_parameters说“在 JavaScript 中,函数参数默认为 [伪值]undefined [当参数被省略时]。”(实际上我一直发现这种情况),而且它似乎暗示(所以我经常在我的 for 中调用我自己的 JS 函数),调用者可以通过简单地确保该可选参数而不是明确传递“未定义”来指定{默认值用于可选参数}。然而,我是第一个发现做后者会导致错误,否则 JS 内置方法的可选参数的其他奇怪行为 - 至少是“新日期”和“Array.prototype.splice”。
例如,形式为“new Date(yr,moi,d,hr,min,s,ms)”的 JavaScript 简单方法调用,其中这些参数之一是可选的,因此被赋予“未定义”(因此到那里请求使用默认值)然后给出(看似错误的)“无效日期”{至少在顶级网络浏览器 Chrome 和 Firefox 中},即使官方文档似乎表明结果应该是有效日期,当“未定义”时返回参数已被简单地省略,如以下情况(5 个可选参数中的每一个):

  • ‘new Date(2020,6,undefined)’给出无效时似乎应该给出‘new Date(2020,6)’
  • ‘new Date(2020,6,15,undefined)’给出无效时似乎应该给出‘new Date(2020,6,15)’
  • 'new Date(2020,6,15,12,undefined)' 给出无效时似乎应该给出'new Date(2020,6,12)'
  • 'new Date(2020,6,15,12,30,undefined)' 给出无效时似乎应该给出'new Date(2020,6,12,30)'
  • 'new Date(2020,6,15,12,30,30,undefined)'给出无效时似乎应该给出'new Date(2020,6,15,12,30,30)'

  • 但是“新日期”官方文档 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date#Individual_date_and_time_component_values说从“day”到这些参数的第一个“[, day [, hours [, minutes [, seconds [, milliseconds]]]]]”是可选的,所以似乎“undefined”可以在这里工作。
    所以,作为一个 hack,它会通过调用值“null”而不是“undefined”来工作(即使这看起来是错误的)。至少对于 Chrome 中的“新日期”,我尝试了对可选参数使用“空”而不是“未定义”的技巧,发现奇怪的是,它有时有效但奇怪的是:例如“新日期(2020,6 ,15,null)' 与 'new Date(2020,6,15)' 相同,但是 'new Date(2020,6,null)' 而不是给出 'new Date(2020,6)' 它奇怪地给出了减号1天。如果 'null' 像往常一样减少到 0,则不应允许使用 'new Date(2020,null)',而是提供有效的 'new Date(2020,1)' --bazar!,但肯定不够可预测修复“未定义”失败。
    更重要的是,要在其他内置函数上测试 {this: questions when {passing undefined for省略}},通过 https://developer.mozilla.org/en-US/search?q=optional 搜索其他带有可选参数的 JS 内置方法| , 我找到 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice我看到‘[0,1,2].splice(1)’预期返回‘[1, 2]’但‘[0,1,2].splice(1,undefined)’返回神秘的‘[]’。
    那么出了什么问题以及如何最好地修复?
    似乎很难相信在 JS 开发的后期,这些核心的 optional 可能有如此简单的错误,所以我认为我一定是做错了什么。但是,如果是这样,那么如何显式请求内置函数设置其可选参数以使用其默认值,而无需{必须显式{调用函数,所以知道并计算}每个默认参数的默认值,也没有明确地编码每个可能的函数调用和每个可能的参数遗漏}?

    最佳答案

    原因Date显式传递时给出不同的结果 undefined完全省略参数是,在内部,它会检查您传递了多少个参数,并相应地执行逻辑。例如:

    ‘new Date(2020,6,undefined)’ gives Invalid when seems should give ‘new Date(2020,6)’


    您可以使用以下方法复制:

    const something = (...args) => {
    const arg0 = args[0] * 10000;
    const arg1 = args[1] * 100;
    const arg2 = args.length === 2 ? 0 : parseInt(args[2]);
    return arg0 + arg1 + arg2;
    };
    console.log(something(1, 2, 3)); // normal, works
    console.log(something(1, 2)); // omit third parameter
    console.log(something(1, 2, undefined)); // pass undefined

    the specification :

    d. If numberOfArgs > 2, let dt be ? ToNumber(values[2]); else let dt be 1𝔽.


    e. If numberOfArgs > 3, let h be ? ToNumber(values[3]); else let h be +0𝔽.


    等等 - 它检查参数的数量,并尝试解析传递的每个参数,即使参数是 undefined .
    路过 null导致不同的行为,因为 ToNumber转换 null到 0,但是 undefinedNaN .

    More important, to test {this: problems when {passing undefined for omitted}} on other built-ins, searching for other JS built-in methods with optional parameters via https://developer.mozilla.org/en-US/search?q=optional, I find https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice I see ‘[0,1,2].splice(1)’ expectedly returns ‘[1, 2]’ BUT ‘[0,1,2].splice(1,undefined)’ returns mysterious ‘[]’.

    splice做同样的事情,尽管 slightly different wording .

    Array.prototype.splice ( start, deleteCount, ...items )


    1. Else if deleteCount is not present, then

    a. Let insertCount be 0.


    b. Let actualDeleteCount be len - actualStart.


    “不存在”检测是否实际传递了参数 - 而不是参数是否为 undefined或不。

    关于javascript - 给定 ‘undefined’(获得默认值)的 JS fn 可选参数失败至少 ‘new Date(yr,moi,d,hr,min,s,ms)’ +Array.prototype.splice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66881149/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com