网上很多人喷 JavaScript,但是那些言论在我看来,大部分只不过是一门语言初学者,都还没正儿八经掌握一门语言之前,做出的一些不太负责任的评价。
所谓的坑,应该是那些系统入门了这门语言的人才有资格发言的。如果你连正儿八经的教程都没学过,连 JavaScript 的基本原理都不懂,就觉得自己反正是通才,想当然的瞎鸡巴写,那当然会遇到很多问题。
又或者,很多人第一门接触的动态语言就是 JavaScript,遇到了一些在动态语言中挺常见的错误,就觉得这是 JavaScript 另类的地方,这只是少见多怪罢了。JavaScript 在我看来就是一门很普通的脚本语言,很多坑其实都是合理的。
我这里不评价 JavaScript 的先进与否、好用与否、垃圾与否,那些都是立项之前就应该预研好的。我评价的是,成立了 JavaScript 项目后,在开发过程中才会暴露出来的那些反人类之处。
所谓的坑,应该同时满足几个要求:
- 熟手都会中招
- 会引发非预期行为,或者严重的性能问题
- 不属于易用性问题
就目前而言,能让我觉得这特么就是一个坑货的傻逼设定,还不是很多。主要是几个:
一:声明变量时一不小心漏掉 var,变量会变成全局变量
解决方法:声明 “use strict”;
(这个问题 Creator 在开发过程中遇到过几次,出现的几率很低,影响也很小)
二:return 语句后面不能直接换行,否则会返回 undefined
// 如果你有一天发现 return 语句超出了 80 个字符,想要让它另起一行,变成这样
return
obj && obj.abc;
// 那么你的返回值永远都会是 undefined,因为 return 语句在执行到回车时已经结束了。
// 后面的表达式根本就不会执行到。
// 这个错误很难暴露出来,因为可能本来就要返回 false/undefined。正确的写法:
return obj &&
obj.abc;
(这个问题在 Fireball 开发过程中遇到过一次,查了我好久)
三:array.sort() 默认的比较器会把元素转换为字符串再进行比较,导致整型排序出错
// 下面的结果竟然是 [10, 8, 9]
[9, 10, 8].sort()
// 下面的结果才是 [8, 9, 10]
[9, 10, 8].sort(function (lhs, rhs) { return lhs - rhs; })
(这个问题 P 大在 Creator 开发过程中遇到过一次,后果很严重)
对我来说 JavaScript 的坑真不多,就以上几点。如果你也对这门语言有担忧,那么建议你尽早把双脚浸湿,深入去好好学,把它当成一门全新的语言。
下面内容从网友回复中整理而来:
变量提升
var flag = true;
function verify() {
if (flag) {
......
var flag = false;
}
}
// 实际等价于:
var flag = true;
function verify() {
var flag; // = undefined
// 下面的if内容不会执行
if (flag) {
......
flag = false;
}
}