JS编程建议——10:谨记对象非空特性

简介: 10:谨记对象非空特性

建议10:谨记对象非空特性
JavaScript从来没有真正的空对象,因为每个对象都可以从原型链中取得成员,这种机制会带来很多麻烦。例如,在编写统计一段文本中每个单词的出现次数的代码时可以这样设计:先使用toLowerCase方法统一转换文本为小写格式,接着使用split方法以一个正则表达式为参数生成一个单词数组,然后可以遍历该数组中每个单词,并统计每个单词出现的次数。

  1. var i, word;
  2. var text = "A number of W3C staff will be on hand to
  3. HTML5, CSS, and other technologies of the Open Web Platform.";
  4. var words = text.toLowerCase().split(/[s,.]+/);
  5. var count = {};
  6. for( i = 0; i < words.length; i += 1) {
  7. word = words[i];
  8. if(count[word]) {
  9. count[word] += 1;
  10. } else {
  11. count[word] = 1;
  12. }
  13. }
    在执行结果中,count["on"]的值为1, count["of"]的值是3,而count.constructor却包含着一个看上去令人不可思议的字符串。在主流浏览器上,count.constructor将会返回字符串:function Object (){[native code]}。其原因是count对象继承自Object.prototype,而Object.prototype包含一个名为constructor的成员对象。count.constructor的值是一个Object。+=运算符,就像+运算符一样,如果它的运算数不是数字时会执行字符串连接的操作而不是加法运算。因为count对象是一个函数,所以+=运算符将其转换成一个莫名其妙的字符串,然后再把一个数字1加在它的后面。

采用与处理for in中问题相同的方法来避免类似的问题:用hasOwnProperty方法检测成员关系,或者查找特定的类型。在当前情形下,可以编写如下过滤条件:

  1. if (typeof count[word] === 'number') {
  2. }
相关文章
|
1月前
|
JavaScript 前端开发
如何在 JavaScript 中使用 __proto__ 实现对象的继承?
使用`__proto__`实现对象继承时需要注意原型链的完整性和属性方法的正确继承,避免出现意外的行为和错误。同时,在现代JavaScript中,也可以使用`class`和`extends`关键字来实现更简洁和直观的继承语法,但理解基于`__proto__`的继承方式对于深入理解JavaScript的面向对象编程和原型链机制仍然具有重要意义。
|
1月前
|
Web App开发 JavaScript 前端开发
如何确保 Math 对象的方法在不同的 JavaScript 环境中具有一致的精度?
【10月更文挑战第29天】通过遵循标准和最佳实践、采用固定精度计算、进行全面的测试与验证、避免隐式类型转换以及持续关注和更新等方法,可以在很大程度上确保Math对象的方法在不同的JavaScript环境中具有一致的精度,从而提高代码的可靠性和可移植性。
|
26天前
|
JSON 前端开发 JavaScript
JavaScript中对象的数据拷贝
本文介绍了JavaScript中对象数据拷贝的问题及解决方案。作者首先解释了对象赋值时地址共享导致的值同步变化现象,随后提供了五种解决方法:手动复制、`Object.assign`、扩展运算符、`JSON.stringify`与`JSON.parse`组合以及自定义深拷贝函数。每种方法都有其适用场景和局限性,文章最后鼓励读者关注作者以获取更多前端知识分享。
18 1
JavaScript中对象的数据拷贝
|
23天前
|
JavaScript 前端开发 安全
JavaScript与TypeScript的对比,分析了两者的特性及在实际项目中的应用选择
本文深入探讨了JavaScript与TypeScript的对比,分析了两者的特性及在实际项目中的应用选择。JavaScript以其灵活性和广泛的生态支持著称,而TypeScript通过引入静态类型系统,提高了代码的可靠性和可维护性,特别适合大型项目。文章还讨论了结合使用两种语言的优势,以及如何根据项目需求和技术背景做出最佳选择。
42 4
|
28天前
|
JavaScript 前端开发 安全
ECMAScript 6(以下简称 ES6)的出现为 JavaScript 带来了许多新的特性和改进,其中 let 和 const 是两个非常重要的关键字。
ES6 引入了 `let` 和 `const` 关键字,为 JavaScript 的变量管理带来了革新。`let` 提供了块级作用域和暂存死区特性,避免变量污染,增强代码可读性和安全性;`const` 用于声明不可重新赋值的常量,但允许对象和数组的内部修改。两者在循环、函数内部及复杂项目中广泛应用,有助于实现不可变数据结构,提升代码质量。
26 5
|
27天前
|
前端开发 JavaScript 持续交付
提高JavaScript编程效率
提高JavaScript编程效率
26 3
|
27天前
|
自然语言处理 JavaScript 前端开发
ECMAScript 6 的出现为 JavaScript 带来了许多新的特性和改进
这些只是ES6的一些主要特性,它们极大地增强了JavaScript的功能和表现力,使得JavaScript在大型应用开发、前端框架等领域能够更加高效地编写复杂的应用程序。
|
1月前
|
JavaScript 前端开发 图形学
JavaScript 中 Math 对象常用方法
【10月更文挑战第29天】JavaScript中的Math对象提供了丰富多样的数学方法,涵盖了基本数学运算、幂运算、开方、随机数生成、极值获取以及三角函数等多个方面,为各种数学相关的计算和处理提供了强大的支持,是JavaScript编程中不可或缺的一部分。
|
1月前
|
自然语言处理 JavaScript 前端开发
JavaScript闭包:解锁编程潜能,释放你的创造力
【10月更文挑战第25天】本文深入探讨了JavaScript中的闭包,包括其基本概念、创建方法和实践应用。闭包允许函数访问其定义时的作用域链,常用于数据封装、函数柯里化和模块化编程。文章还提供了闭包的最佳实践,帮助读者更好地理解和使用这一强大特性。
19 2
|
2月前
|
JavaScript 前端开发 编译器
掌握现代化JavaScript:ECMAScript提案与特性
【10月更文挑战第13天】本文介绍了ECMAScript(ES)的最新提案与特性,包括可选链、空值合并运算符、类字段和顶层Await等。通过跟踪TC39提案、使用Babel或TypeScript、测试兼容性以及逐步迁移,开发者可以高效地采用这些新特性,简化代码、提高开发效率并增强应用功能。文章还提供了实战技巧,帮助开发者在现代Web开发中充分利用这些现代化的特性。