如果你是一个JAVAScript新手或仅仅最近才在你的开发工作中接触它,你可能感到沮丧 。所有的语言都有自己的怪癖(quirks)——但从基于强类型的服务器端语言转移过来的开发人员可能会感到困惑 。我就曾经这样,几年前,当我被推到了全职JavaScript开发者的时候,有很多事情我希望我一开始就知道 。在这篇文章中,我将分享一些怪癖,希望我能分享给你一些曾经令我头痛不已的经验 。这不是一个完整列表——仅仅是一部分——但希望它让你看清这门语言的强大之处,可能曾经被你认为是障碍的东西 。
我们将看下列技巧:
- 相等
- 点号vs括号
- 函数上下文
- 函数声明vs函数表达式
- 命名vs匿名函数
- 立即执行函数表达式
- typeof vs Object.prototype.toString
var x = 1;if(x == "1") {console.log("YAY! They're equal!");}
这是怎么回事?整数1是如何和字符串”1”相等的?在JavaScript中,有相等(==)和严格相等(===)之说 。相等运算符将强制转换两边的操作数为相同类型后执行严格相等比较 。所以在上面的例子中,字符串”1”会被转换为整数1,这个过程在幕后进行,然后与变量x进行比较 。
严格相等不进行类型转换 。如果操作数类型不同(如整数和字符串),那么他们不全等(严格相等) 。
var x = 1;// 严格平等,类型必须相同if(x === "1") {console.log("Sadly, I'll never write this to the console");}if(x === 1) {console.log("YES! Strict Equality FTW.")}
你可能正在考虑可能发生强制类型转换而引起的各种恐怖问题——假设你的引用中发生了这种转换,可能导致你非常困难找到问题出在哪里 。这并不奇怪,这也是为什么经验丰富的JavaScript开发者总是建议使用严格相等 。2.) 点号 vs 括号这取决于你来自其他什么语言,你可能见过或没见过这种方式(这就是废话) 。
// 获取person对象的firstName值var name = person.firstName;// 获取数组的第三个元素var theOneWeWant = myArray[2]; // remember, 0-based index不要忘了第一个元素的索引是0
然而,你知道它也可以使用括号引用对象的成员吗?比如说:var name = person["firstName"];
为什么会这样有用吗?而你会用点符号的大部分时间,有几个实例的括号使某些方法可能无法这样做 。例如,我会经常重构大开关语句到一个调度表,所以这样的事情:为什么可以这样用?你以前可能对使用点更熟悉,有几个特例只能用括号表示法 。例如,我经常会将switch语句重构为查找表(速度更快),其实就像这样:
var doSomething = function(doWhat) {switch(doWhat) {case "doThisThing":// more code...break;case "doThatThing":// more code...break;case "doThisOtherThing":// more code....break;// additional cases here, etc.default:// default behaviorbreak;}}
可以转化为像下面这样:var thingsWeCanDo = {doThisThing : function() { /* behavior */ },doThatThing : function() { /* behavior */ },doThisOtherThing : function() { /* behavior */ },default : function() { /* behavior */ }};var doSomething = function(doWhat) {var thingToDo = thingsWeCanDo.hasOwnProperty(doWhat) ? doWhat : "default"thingsWeCanDo[thingToDo]();}
使用switch并没有错误(并且在许多情况下,如果被迭代多次并且非常关注性能,switch可能比查找表表现更好) 。然而查找表提供了一个很好的方法来组织和扩展代码,并且括号允许你的属性延时求值 。3.) 函数上下文已经有一些伟大的博客发表了文章,正确理解了JavaScript中的this上下文(在文章的结尾我会给出一些不错的链接),但它确实应该加到“我希望我知道”的列表 。它真的困难看懂代码并且自信的知道在任何位置this的值——你仅需要学习一组规则 。不幸的是,我早起读到的许多解释只是增加了我的困惑 。因此我试图简明扼要的做出解释 。
第一——首先考虑全局情况(Global)默认情况下,直到某些原因改变了执行上下文,否则this的值都指向全局对象 。在浏览器中,那将会是window对象(或在node.js中为global) 。
推荐阅读
- 正确冲泡黄茶的七个步骤,冲泡蒙顶黄芽的禁忌
- 黄茶的作用和功效减肥助消化,普洱茶和皖西黄大茶功效与作用的区别
- BAT都在使用的开源接口管理平台
- 刀片服务器是什么?刀片服务器在哪些领域应用的较为广泛
- 遇事最有水平的三种处理方式
- 28个实用的穿搭小技巧,让你越穿越好看
- 香蕉苹果的七个错误防不胜防
- 保湿|10年没有换过的6款空瓶精华 好用的精华液推荐 有效的精华液排行榜
- 大黄茶的功效与作用,普洱茶和广东大叶青功效与作用的区别
- PS常用的快捷键,PS快捷键大全