Node.js 语法错误:无效或意外的标记(但很奇怪)

问题描述 投票:0回答:2

我一生中从未见过这个错误

weird error

我只是觉得这很奇怪......

我的代码如下所示:

const no = require('noparenth');

(在index.js:1)

我一生中从未见过这种情况......


所讨论的库只允许您调用不带括号的函数。我这样做是为了让编码更容易+速度更快。 代码如下所示:

Function.prototype.valueOf = function() {
    this.call(this);
    return 0; 
};

就是这样...

实际错误:

C:\Users\summit\testing\index.js:1
��c


SyntaxError: Invalid or unexpected token
javascript node.js function prototype
2个回答
4
投票

获取该类型字符的一种可能方法是将文件另存为

UTF-16 LE
并将其加载为
UTF-8

如果您使用 PowerShell,则可以轻松生成
UTF-16 LE
编码的文件,例如,如果您运行
echo "" > index.js
。如果您在 VSCode 中打开生成的文件,您可以在右下角看到它是
UTF-16 LE

请注意,生成的文件并不是真正的空文件,您可以通过在 Node.js REPL 中输入

require('fs').readFileSync('index.js')
来验证这一点。 您将得到
<Buffer ff fe 0d 00 0a 00>
,当用
UTF-16 LE
解释时,它由字节顺序标记 (
U+FEFF
)、回车符 (
U+000D
) 和换行符 (
U+000A
) 组成。

即使您使用文本编辑器打开该文件并将所有内容替换为文本,字节顺序标记仍然存在(只要您仍然保存在

UTF-16 LE
中)。例如,如果您保存
const x = 0
,缓冲区将变得像
ff fe 63 00 ...
,请注意
ff fe
仍然在那里。

当程序尝试将其加载为

UTF-8
时,它将得到
<invalid character>
<invalid character>
c
<null character>
等等。 您在输出中看到的内容正是来自
<invalid character>
<invalid character>
c
(Unicode:U+FFFD U+FFFD U+0063),显然不是 Node.js 中的有效标记。


至于你的实际函数,只有当你有类型强制(如

+myFunction
myFunction + ""
)或者直接调用它(如
myFunction.valueOf()
)时才会调用它。 我希望它会(稍微)慢一些,因为它调用用户定义的函数而不仅仅是本机代码。

除了修改不属于你的对象的原型这个坏主意之外,这样做的用处(如果有的话)也是有限的。 this.call(this)
表示您无法向函数调用添加更多参数。

另外,就像
myFunction.call(myFunction)
,我不确定你为什么要这样做。当用于对象的方法时,它就像
myObject.myMethod.call(myObject.myMethod)
(其中
this
等于函数本身)而不是
myObject.myMethod.call(myObject)
它会破坏依赖于 

myFunction + ""

等行为的东西。

似乎不太容易找到一个例子,不过我找到了
这个例子
isNative(Math.sin)原本应该返回
true
,但是按照上面所示的方式修改原型后,它变成了
3
    


0
投票

解决方案: 我删除了该文件,并使用 UI 手动创建了该文件,方法是右键单击我的文件夹,然后单击“新建文件”,我的代码编译得很好。如果这不起作用,我将另一个项目中的现有 JS 文件复制并粘贴到我的文件夹中,这也有效。

免责声明: 这没有经过研究,纯粹是轶事,但这对我有用,希望它可以帮助其他人。

© www.soinside.com 2019 - 2024. All rights reserved.