【问题标题】:Edge: SCRIPT1028: Expected identifier, string or number边缘:SCRIPT1028:预期的标识符、字符串或数字
【发布时间】:2019-05-06 18:43:02
【问题描述】:

我的页面在 Chrome 和 Firefox 中运行良好:

但是,当我尝试在 Edge 中加载此页面时,问题和答案消失了。仅发布类别。此外,当尝试在 IE 中加载此页面时,除了搜索栏外,所有内容都消失了。

Edge 给我以下错误:

SCRIPT1028: SCRIPT1028: faq.html 第 84 行的预期标识符、字符串或数字

这里指的是下面的代码:

function sortByCategory(data) {
  return data.reduce((obj, c) => {
    const { category, ...rest } = c; // this line throws the error
    obj[category] = obj[category] || [];
    obj[category].push(rest);
    return obj;
  }, {});
}

我该如何解决这个问题?

【问题讨论】:

    标签: javascript jquery microsoft-edge


    【解决方案1】:

    Edge 似乎(令人惊讶地)还不支持属性休息,这很不幸,但后来它只在 ES2018 中正式添加。您需要重写代码以不使用属性 rest(对象文字的 ...rest 部分)(或者,作为 CertainPerformance suggests,使用转译器)。

    这里有许多方法中的一个

    function sortByCategory(data) {
        return data.reduce((obj, c) => {
            //const { category, ...rest } = c;
            const { category } = c;
            const rest = {};
            for (const key of Object.keys(c)) {
                if (key !== "category") {
                    rest[key] = c[key];
                }
            }
            obj[category] = obj[category] || [];
            obj[category].push(rest);
            return obj;
        }, {});
    }
    

    我避免使用delete,因为对象上的delete 会取消优化对象,从而使属性查找变慢。但是仅对这些对象进行反优化可能不会对您的页面/应用程序的感知速度产生任何影响,所以...

    【讨论】:

    • 正是我想要的!完美运行,谢谢。
    • 加一个本地建议
    • 我刚刚在Edge Chromium Beta 78.0.276.19 中进行了测试,对象中的... 语法分布在赋值a = {...b, ...c};右侧 侧,这是可行的。 (它在 Edge 18 中出现了与这个问题相同的语法消息。)我还没有在作业的 left 侧测试它,就像在这个问题中一样,但它也应该在那里工作,给定这是来自 Chromium 项目的 V8 JavaScript。我的另一个网页在 Edge 18 或 Safari 13(没有 shims/transpilation)中都无法运行,但在这个 Beta 版中运行良好。
    • @ToolmakerSteve - 谢谢。是的,Edge Chromium 大概会有完全的休息和传播支持(包括属性休息和传播),因为它使用了 V8,它有完全的休息和传播支持。
    【解决方案2】:

    Edge 和 IE support 对象属性休息语法都不是(尽管 Edge 最终可能会支持它)。我建议使用Babel 自动将您的代码转译为 ES5,这将允许您使用该语言的最新和最好的版本进行编写,同时允许古老且不兼容的浏览器理解您所有的转译代码。比如插上

    const { category, ...rest } = c;
    

    结果

    "use strict";
    
    function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
    
    var _c = c,
        category = _c.category,
        rest = _objectWithoutProperties(_c, ["category"]);
    

    看起来不是很漂亮,但它可以自动完成。

    一种手动​​方式可能是:

    const c = {
      category: 'category',
      foo: 'foo',
      bar: 'bar'
    };
    
    const category = c.category;
    // Object.assign so as not to mutate the original object:
    const rest = Object.assign({}, c);
    delete rest.category;
    console.log(rest);

    【讨论】:

    • 好答案!可能值得从那个“yet”句子中删除“IE”。 :-) IE 永远不会支持它(或任何其他 ES2015+)。
    • 谢谢!甚至不知道 Babel,哎呀
    • 另外,考虑到Edge will likely be replaced by a chromium variant,浏览器应该至少与 Chrome 更内联。 (不管这对浏览器市场和标准来说是好事还是坏事,我会中途离开。)
    • @BramVanroy - 目前尚不清楚他们是基于 Chromium(一种基于多个组件堆栈构建的浏览器),还是仅仅基于 Blink ,其中的渲染引擎(以及 Chrome 和 Opera)。可悲的是,关于这个话题的报道将两者混为一谈。我认为他们只是在替换渲染引擎。从您链接的文章中:“采用 Chromium 作为默认渲染引擎...” 如果他们保留 Chakra(他们的 JavaScript 引擎),则更改不会影响他们对 JavaScript 功能的支持。也就是说,他们很高兴在 VS Code 中通过 Electron 使用 V8(Google 的 JS 引擎),所以……我们拭目以待!
    【解决方案3】:

    从 2020 年 5 月 12 日起,这将在 Microsoft Edge 中运行。测试版:Microsoft Edge Version 81.0.416.72 (Official build) (64-bit)

    https://www.microsoft.com/en-us/edge

    以下代码行导致SCRIPT1028: Expected identifier, string or number 异常,但更新时一切正常:

    return {
        ...state,
        products: [...state.products, ...action.payload],
    };
    

    【讨论】:

    • 很遗憾,Chromium Edge 的这个新更新没有在应用程序中提供,所以用户需要知道它然后手动安装......对于普通用户来说并不容易
    【解决方案4】:

    如果你有节点包生态系统:

    1. 更新 package.json 中的浏览器列表

    {
      ...
      "browserslist": {
        "production": [
          ...
        ],
        "development": [
          "last 1 chrome version",
          "last 1 firefox version",
          "last 1 safari version",
          "last 1 ie version" // <- make sure this is present
        ]
      },
      ...
    }
    1. 删除 node_modules 中的 .cache 文件夹
    2. 重新运行开发服务器

    【讨论】:

      【解决方案5】:

      Edge 44 失败并显示“SCRIPT1028: Expected identifier, string or number” :

      var a = {};
      a = { ...a};
      

      但是成功了:

      var a = {};
      a = Object.assign({}, a);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多