我一生中从未见过这个错误
我只是觉得这很奇怪......
我的代码如下所示:
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
获取该类型字符的一种可能方法是将文件另存为
UTF-16 LE
并将其加载为 UTF-8
。 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
解决方案: 我删除了该文件,并使用 UI 手动创建了该文件,方法是右键单击我的文件夹,然后单击“新建文件”,我的代码编译得很好。如果这不起作用,我将另一个项目中的现有 JS 文件复制并粘贴到我的文件夹中,这也有效。
免责声明: 这没有经过研究,纯粹是轶事,但这对我有用,希望它可以帮助其他人。