当前位置: 首页 > news >正文

福州医院网站建设公司最近一周新闻大事件

福州医院网站建设公司,最近一周新闻大事件,日照网站建设哪一家好,网站的空间和域名备案在JavaScript中存储键值对的一个简单常见的方法是使用对象字面量。然而,对象字面量不是真正意义上的哈希映射,如果使用不当可能会构成潜在的隐患。虽然目前JavaScript可能没有提供原生的hashmap(至少不能跨浏览器),对象…

在JavaScript中存储键值对的一个简单常见的方法是使用对象字面量。然而,对象字面量不是真正意义上的哈希映射,如果使用不当可能会构成潜在的隐患。虽然目前JavaScript可能没有提供原生的hashmap(至少不能跨浏览器),对象字面量如果没有隐患就能达到所需的功能也许是一个更好的选择。

对象字面量存在的问题

对象字面的问题在于其原型链继承自Object原型上的对象和方法会破坏其维持键值的机制。以toString方法为例,使用in操作符检查同名属性会导致错误的结果:

javascriptvar map = {};
`toString` in map; // true

上面的错误之所以会发生,是因为in操作符会从对象的原型链上查找继承属性。为了解决该问题,我们可以用hasOwnProperty方法来确定键值的存在性,因为该方法只检查对象本身的属性:

javascriptvar map = {};
map.hasOwnProperty('toString'); // false

上面的方法能够良好的工作,除非你遇到一个名为hasOwnProperty键。重写此方法将会因为尝试调用hasOwnProperty方法而导致意外的行为,根据新的值最有可能导致错误:

javascriptvar map = {};
map.hasOwnProperty = 'foo';
map.hasOwnProperty('hasOwnProperty'); // TypeError

一个快速的修正方法是利用一个通用且没有被篡改的对象字面量,并在你指定的hashmap上下文中执行hasOwnProperty方法:

javascriptvar map = {};
map.hasOwnProperty = 'foo';
{}.hasOwnProperty.call(map, 'hasOwnProperty'); // true

尽管实际工作时没有任何问题,但对象字面量还是限制了它的使用。举个例子,每次你在for...in循环里面遍历一个对象的属性,你都要过滤其原型链中的属性:

javascriptvar map = {};
var has = {}.hasOwnProperty;for (var key in map) {if(has.call(map, key)) {// ...}
}

一段时间后,可能会变得有点乏味。值得庆幸的是,有一个更好的办法。

空对象

创建一个真正的哈希映射的秘诀就是避免原型,及其带来的包袱。我们可以利用ES5中引入的Object.create方法达到该目的。该方法的特别之处在于你可以给一个新对象明确定义原型。举个例子,用一个较复杂的方式定义一个简单对象字面量:

javascriptvar obj = {};
// 等价于
var obj = Object.create(Object.prototype);

除了能够定义一个你选择的原型,你也能够通过传入一个null放弃传入原型:

javascriptvar map = Object.create(null);map instanceof Object; // false
Object.prototype.isPrototypeOf(map); // false
Object.getPrototypeOf(map); // null

这些空对象对于哈希映射是理想的,因为缺少[[Prototype]]避免了命名冲突。由于该对象完全是空的,它会抵制任何形式的强制转换,试图这样做将导致一个错误:

javascriptvar map = Object.create(null);
map + ""; // TypeError: Cannot convert object to primitive value

空对象没有任何初始值或者字符串表现形式,因为空对象除了作为键值对的存储空间没有为任何其他事情做打算,简单又普通。

注意hasOwnProperty方法在空对象中也消失了,这无关紧要,因为in操作符可以无异常的工作了:

javascriptvar map = Object.create(null);
'toString' in map; // false

更好的是,乏味的for...in循环变得更加简单。我们最终可以按其本身的意思写一个循环:

javascriptvar map = Object.create(null);
for (var key in map) {// ...
}

虽然存在差异,但对所有的意图和目的,它仍然表现得就像一个对象字面量。属性可以利用.或则[]访问,对象可以被序列化,且对象仍然可以使用上下文对象的原型方法:

javascriptvar map = Object.create(null);Object.defineProperties(map, {'foo': {value: 1,enumerable: true},'bar': {value: 2,enumerable: false}
});map.foo; // 1
map['bar']; // 2JSON.stringify(map); // {"foo": 1}{}.hasOwnProperty.call(map, 'foo'); // true
{}.propertyIsEnumerable.call(map, 'bar'); // false

甚至不同检查类型的方法将会告诉你从对象字面中期望得到什么:

javascriptvar map = Object.create(null);
typeof map; // object
{}.toString.call(map); // [object Object]
{}.valueOf.call(map); // Object {}

这一切使得空对象代替对象字面量变得简单,让他们很好地集成到一个现有的应用程序,而不会引起大范围的变化。

总结

在简单的键值存储的背景下,使用空对象是对象字面量的有效替代方案,用明确的定义消除对象字面量的怪癖。对于更全面的数据结构,ES6将以MapSet形式引入原生的hashmap。在此之前,甚至之后,你应该使用空对象满足你所有的基本哈希映射需求。

欢迎光临我的个人博客:风影博客

参考

  • 原文地址:True Hash Maps in JavaScript
  • Object.create()
http://www.lbrq.cn/news/2489311.html

相关文章:

  • 网站流量提升方法发外链的平台有哪些
  • 知名电子商务企业湖南网站营销seo方案
  • 外贸 礼品 网站百度指数是啥
  • 手机网站设计建设服务海口seo网络公司
  • 网站后台页面进不去哪个网站是免费的
  • wordpress大前端整站网站批量查询
  • 辽宁共青团网站建设爱站权重查询
  • 网站设计中遇到的问题最新热点新闻事件素材
  • 做网站最便宜要多少钱龙岗网络公司
  • 武汉seo网站排名优化公司营销网站建设价格
  • wordpress 编辑器设置seo站内优化
  • 物流网站建设方案网站制作过程
  • 网站帮企业做推广价格怎么算站点查询
  • 自做网站怎么搭建属于自己的网站
  • 河北响应式网站企业新闻20字摘抄大全
  • c2c网站的功能新平台怎么推广
  • 网站建设公司怎么写宣传语宁波网站seo公司
  • asp 网站 模板百度广告代运营公司
  • 桂林漓江阳朔优化设计四年级上册数学答案
  • 中国代理网官网重庆seo公司
  • wordpress适合做网页seo搜索引擎优化是通过优化答案
  • 网站对接微信接口智能网站推广优化
  • 淘宝找做网站株洲企业seo优化
  • 游戏网站怎么赚钱chinaz站长素材
  • 企业网站建设的上市公司电商运营seo
  • 互联网有多少网站济南网站推广
  • wordpress投稿者用户权限seo怎么优化步骤
  • 外贸公司起名seo优化
  • 遵义做网站哪家好哪家好seo优化推广技巧
  • 网站是否必须做认证山西seo排名厂家
  • OpenResty 高并发揭秘:架构优势与 Linux 优化实践
  • AWD的攻击和防御手段
  • Windows Server存储池,虚拟磁盘在系统启动后不自动连接需要手动连接
  • 【愚公系列】《MIoT.VC》003-构建基本仿真工作站(组件的属性、行为、视频展示)
  • 嵌入式硬件篇---zigbee无线串口通信问题
  • CIU32L051 DMA+Lwrb环形队列实现串口无阻塞性数据的收发 + 数据百分百不丢失的实现