javascript - Javascript:检查某些东西是否可以为它添加属性
问题描述
编辑:更清楚地表明需要确定我是否可以将属性添加到一个值,而不是一个值是否可以拥有自己的属性。
有没有办法检查是否可以向a添加属性value
?
例如,如果我有以下代码:
function test( value ) {
// return true if it is possible to add properties to value
}
除了实际添加value
要测试的属性之外,是否有可靠的方法来推断是否value
可以添加属性?
例如,我知道object
can 有属性undefined
但不能,但我并不热衷于创建一个已知事物的列表,这些已知事物在未来可能不够用。类似的东西instanceof object
就足够了吗?
解决方案
没有属性的值列表很短:undefined
和null
. 对这些的测试应该很简单(value == null
)。
请注意,所有其他原语都可以具有属性(通过装箱),但是由于装箱的对象会立即丢失,因此向它们添加属性是没有意义的:
1..test = 1;
"test".test = 1;
Infinity.test = 1;
NaN.test = 1;
true.test = 1;
Symbol().test = 1;
1n.test = 1;
要检查非基元,typeof value === "object"
可以使用,但null
也是一个对象(一个非常特殊的对象,实际上它算作基元但typeof
关于它的谎言),您必须明确检查value !== null
.
虽然您通常可以为对象添加属性,但它们可以被冻结,然后添加属性是无用的,这同样适用于代理。
const obj = {};
Object.freeze(obj);
obj.test = 1;
console.log(obj.test);
由于无法检测到代理,因此无法确定是否可以添加属性。
推荐阅读
- node.js - 如何在没有异步的情况下使用 Azure npm 包?
- amazon-web-services - 获取 AWS route53 资源的 A 类记录的值和名称
- c# - 无法在c#中读取html文件
- linux - 如何同时对 170 个文件运行一组命令?
- laravel - 运行时 Laravel 迁移在“renameColumn”上失败
- spacy - spacy 中命名实体标签类型的符号是否必须与训练数据中带注释的标签类型的符号匹配?
- javascript - 几次迭代后异步 puppeteer 浏览器断开连接
- flutter - Flutter - 使用收到的每条消息通知的实时消息应用程序的最佳方式?
- java - 将已经存在的字符串变量转换为布尔值时出现“无法访问的代码”
- jquery - 用jsRender过滤项目?