tra*_*ang 1 javascript strict node.js hasownproperty ecmascript-6
对于某些值,调用 hasOwnProperty 会引发错误。
我们来检查一下下面的代码:
null.hasOwnProperty('bar') // Error
undefined.hasOwnProperty('bar') // Error
(0).hasOwnProperty('bar') // Returns false
Run Code Online (Sandbox Code Playgroud)
除了nulland之外,还有其他变量undefined在调用 with 时会引发错误吗.hasOwnProperty?
设置对象属性的相同问题:
null.bar // Error
undefined.bar // Error
(0).bar === undefined // Returns true
Run Code Online (Sandbox Code Playgroud)
=========
在我的 Node.js 环境中抛出错误的另一种情况:
在浏览器中
'use strict';
(0).bar = 0; // Nothing happens
Run Code Online (Sandbox Code Playgroud)
在 Node.js v.10.3.0 中:
(0).bar = 0; // Nothing
'use' strict';
(0).bar === undefined; // Returns true
true.bar === undefined; // Returns true
''.bar = '';// STILL NOTHING HAPPENS
(0).bar = 0; //TypeError: Cannot create property 'bar' on number '0'
(true).bar = true; // TypeError: Cannot create property 'bar' on boolean 'true'
Run Code Online (Sandbox Code Playgroud)
========
最终,我发现了JavaScript 中的 Check if a value is an object:
if (obj instanceof Object) obj.hasOwnProperty(...) // Or set a property on it
Run Code Online (Sandbox Code Playgroud)
这个解决方案完全满足我的需求。
太长了;
Object.prototype.hasOwnProperty可以直接调用
Object.prototype,
Object.prototype在其继承链中并且不在 hasOwnProperty 继承链或对象上重新定义的对象的子集,以及
BigInt、布尔值、数字、字符串和符号原始值。然而,在原始值上调用它通常是多余的
(primitiveValue).hasOwnProperty(propertyName)
Run Code Online (Sandbox Code Playgroud)
总是返回false- 原始值没有自己的属性。
数据类型
JavaScript 目前支持ECMAScript 2020规范中的八种不同的数据类型:
BigInt(ECMAScript 2020 中引入)、布尔值、Null、未定义、数字、字符串、符号(ECMAScript 2015 中新增)
和对象。
其中前七个是原始值而不是对象值 - 包括null数据类型为 Null 的值。(是的,typeof null返回“object”而不是“null”,但这是早期 JavaScript 引擎设计的产物,无法修复,因为它会破坏网络。)
数字、布尔值和字符串
NumberNumber、Boolean 和 String 类型的值分别在与属性值查找语法一起使用时Boolean自动转换为全局构造函数的“包装”对象实例。String
因此
(1).hasOwnProperty("MAX_SAFE_INTEGER")
Run Code Online (Sandbox Code Playgroud)
返回 false,因为该属性继承自Number.prototype。类似地, hasOwnProperty 对布尔值的调用返回 false,因为布尔包装对象本身没有任何固有的属性。但
("hello folks").hasOwnProperty("length");
Run Code Online (Sandbox Code Playgroud)
返回,true因为“length”是 String 包装对象自己的属性。
未定义和空
数据类型 Undefined ( undefined) 或 Null ( null) 的原始值不会转换为包装对象,并且在尝试将 hasOwnProperty 它们作为方法调用时会生成语法错误:
(undefined).hasOwnProperty("example") // TypeError
(null).hasOwnProperty("example") // TypeError
Run Code Online (Sandbox Code Playgroud)
符号和 BigInt
Symbol 和 BigInt 数据类型值有单独的处理 - 它们都是在 ECMAScript 中的新数据类型没有对象包装器的决定之后引入的。
实际上,这意味着 JavaScript 引擎在内部分别实现了 对和数据类型应用Symbol.prototype和BigInt.prototype方法的语法,但只允许对原型方法和属性进行读取访问 - 任何在或数据类型上设置属性的尝试都会生成错误。symbolbigintsymbolbigint
函数Symbol和BigInt全局函数都不允许使用newbefore 调用。
Symbol充当工厂函数并返回新的符号值。
BigInt是一个类型转换函数,用于将字符串和数字转换为bigint数据类型。
与boolean、number和string数据类型的旧对象包装器不同,尝试在或数据类型上设置属性永远不会悄悄成功。symbolbigint
目的
对象(数据类型为 Object)通常继承 hasOwnProperty 自Object.prototype. 如果 hasOwnProperty 在继承链中稍后的某个位置重新定义(这不是一个好主意null),或者如果在到达之前在其继承链中创建了对象,则此继承可能会失败Object.prototype。
在其继承链的开头创建对象的最简单方法null是调用
Object.create( null);
Run Code Online (Sandbox Code Playgroud)
扩展这样的对象还将创建不继承的对象Object.prototype,因此不能使用 hasOwnProperty .
请注意,应用于原型链不包含return 的instanceof Object对象。不要用于确定对象数据类型。Object.prototypefalseinstanceof
在 JavaScript 的早期版本中,在从原始值自动创建的包装对象上设置属性在语法上是正确的,并且不会生成错误。然而,一旦评估了包装对象表达式,包装对象就被丢弃。尝试在后面的代码中查找自定义属性会失败,因为查找时使用了一个新的、不同的、缺少自定义属性的包装对象。
如果尝试将属性值分配给任何原始值,严格模式会生成错误。
(primitiveValue).hasOwnProperty(propertyName)
Run Code Online (Sandbox Code Playgroud)
CheckOwnProperty返回一个布尔值,反映第一个参数是否属于对象数据类型并且具有与第二个参数同名的自己的属性。它对所有原始值返回 false。
| 归档时间: |
|
| 查看次数: |
11932 次 |
| 最近记录: |