javascript - 在任何情况下,`x.valueOf() === x` 可能会返回 `false`?
问题描述
我试图理解这种valueOf()
方法。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf
是否存在任何类型的变量都可能返回false
以进行以下检查的情况?
x.valueOf() === x
const obj = {};
const str = "abc";
const strNum = "123";
const number = 123;
const arrStr = ["a","b","c"];
const arrNum = [1,2,3];
console.log(obj.valueOf() === obj);
console.log(str.valueOf() === str);
console.log(strNum.valueOf() === strNum);
console.log(number.valueOf() === number);
console.log(arrStr.valueOf() === arrStr);
console.log(arrNum.valueOf() === arrNum);
解决方案
具有自定义valueOf
方法的变量可能会返回未通过测试的值:
const obj = {
valueOf() {
return NaN;
}
};
console.log(obj.valueOf() === obj);
包裹在对象中的数字也会返回 false:
const obj = new Number(5);
console.log(obj.valueOf() === obj);
MDN 文档看起来具有误导性。Object.prototype.valueOf
将返回一个对象或抛出一个错误 - 请参阅规范。
请记住,当调用valueOf
非对象时,例如数字/字符串/布尔值,您将调用该特定原语valueOf
的方法(例如),而不是.Number.prototype.valueOf
Object.prototype.valueOf
推荐阅读
- html - Bootstrap 4 - 使表头具有粘性
- shell - 删除 cron 作业及其评论,由 Puppet 通过 awk/sed 创建的环境
- java - 使用 java 返回错误序列化 Avro 消息
- angular - webpack“找不到命名空间'DataTables'”的角度SSR问题
- c# - Xamarin.Essentials.NotImplementedInReferenceAssemblyException
- c++ - boost::stacktrace 无法提供行号
- java - 如何使用firebase auth将两种类型的用户重定向到Anroid studio中的不同活动
- assembly - 如何将键盘输入保存到程序集中的寄存器中?
- sql - SQL 变量/命令?
- c - 变量持有的可能值