JavaScript 毒瘤和糟粕(需要注意的地方)
简介
我想这是在我总结JavaScript系列中最为需要注意的,最为重要的内容。你必须要去了解这些问题特性,才能准备好应对措施,这真的很重要。
毒瘤
全局变量
全局变量的存在的确是带来了方便,但是我觉得JavaScript对于全局变量的依赖性已经到达一种恐怖的状态。如果某些全局变量的名称碰巧和子程序中的变量名称相同,那么它们就会相互冲突,可能导致程序无法执行,而且不好调试。
文章中定义了三种定义全局变量的方式,分别是:
在任何函数之外放置一个var语句,这个和其他语言一样:
var foo = value;
直接给全局对象添加一个属性。如果是在Web浏览器里,全局变量为Window:
window.foo = value;
直接使用未经处理的变量,这个称为隐式的全局变量:
foo = value;
工作中遇见的普遍的错误应该是第三种,这很普遍。
作用域
JavaScript并没有实现作用域,因此代码块中声明的变量在包含此代码块的函数的任何位置都是可见的。
所以,声明变量最好的方式是每个函数的开头部分声明所有变量。
自动插入分号
如果一个return语句返回一个值,这个值表达式的开始部分必须和return同一行。否则,比如
return
{
status : "value"
}
这明显返回是一个具有属性的对象。只需要将左括号和return同一行就避免了。
typeof
返回一个用于识别其运算数类型的字符串。
但是需要注意的是,比如typeof null返回的对象是object而不是null,因此尽量不使用。
parseInt
将字符串转化为整数。但是如果该字符串的第一个字符是0,那么该字符串会基于八进制而不是十进制来求值,而且在八进制中,8和9不是数字,所以参数为“08”或者“09” 产生的结果都是0;所以建议加上基数参数,不要省略掉。
NaN
NAN是一个特殊定义的值,不是一个数字,但是
typeof NaA ==== 'number'; // true
可以看出,typeof无法辨别数字和NaN,而且NaN也不等同于它自己。
判断一个值是否是数字的方法是
var isNumber = function isNumber(value) {
return typeof value ==== 'number' && isFinite(value);
}
伪数组
数组的监测:
if(Object.prototype.toStrings.apply(my_value)) === '[Object Array]') {
} //return true;
注意,参数列表arguments数组不是一个数组,它只是一个存着length成员属性的对象。
假值
值 | 类型 |
---|---|
0 | Number |
NaN(非数字) | Number |
''(空字符串) | String |
false | Boolean |
null | Object |
undefined | Undefined |
表格里面的值全部都等同于假,但是它们是不可互换的,所以不要使用不安全的,而是应该使用=。
还有这个表格里面最需要注意的应该是NaN,null,undefined等等。
hasOwnProperty
注意,这是一个方法,而不是一个运算符,所以在任何对象中,它可能会被一个不同的函数甚至一个非函数的值所替换。比如说:
obj.hasOwnProperty = null; //地雷
//...使用
obj.hasOwnProperty(...) //触碰地雷
对象
注意,在Object.prototype中,包含着一个名为constructor的成员对象,它的值是一个成员对象,这个是默认的。
糟粕
eval
谨慎使用,这是一个传递字符串给编译器返回执行结果的函数。
缺少块的语句
我感觉这个因人而异,不过我喜欢加上括号。
位运算符
JavaScript没有整数类型,它只有双精度的浮点数。因此,位操作符把它们的数字运算数先转换成整数,接着执行运算,然后再转换回去。但由于语言的执行环境接触不到硬件,所以非常慢。
function
推荐以function表达式代替function语句。因为能够明确的表示这是一个包含一个函数值的变量。
var foo = function() {
};
类型的包装对象
尽量避免使用new Boolean(true)或者new Array或者new Object等等这些类型的包装对象,没有必要,用[],{}等等就好。
void
在其它语言中,void是一种类型,表示没有值,但是在JavaScript中,void是一个运算符,它接受一个运算符并且返回undefined。
JavaScript 毒瘤和糟粕(需要注意的地方)的更多相关文章
- javascript sort方法容易犯错的地方
sort方法用来对数组排序非常方便.但是sort(func)这个func参数的构造却很容易混淆. sort判断func的返回值是判断正负,而不是ture和false.所以务必保证返回值要么负数要么正数 ...
- 《Javascript语言精粹》 读书笔记
1 6种值被当做假:false.null.undefined.空字符串''.数字0.数字NaN,其他所有值都为真,包括"false" 2 typeof有6种值,分别是'number ...
- (网页)12种不宜使用的Javascript语法(转)
转自阮一峰: 最近写的一些小东西,总是出各种各样的问题,用了angular.js反应居然比我的jQuery还慢,客户吐槽了,我又把一个小操作,改成了jQuery.浏览一下大神的的博客.转载一点东西: ...
- 这几种JavaScript语法不要轻易使用,容易出事
文章目录 12种不宜使用的JavaScript语法 1. == 2. with 3. eval 4. continue 5. switch 贯穿 6. 单行的块结构 7. ++和-- 8. 位运算符 ...
- JavaScript 语言精粹笔记3
方法 毒瘤 糟粕 记录一下阅读蝴蝶书的笔记,本篇为书中最后一部分:方法.代码风格.优美的特性.毒瘤.糟粕等. 方法 这一章主要介绍了一些方法集.这里写几个我不太熟悉的方法和要点吧. array.joi ...
- 详解Javascript中正则表达式的使用
正则表达式用来处理字符串特别好用,在JavaScript中能用到正则表达式的地方有很多,本文对正则表达式基础知识和Javascript中正则表达式的使用做一个总结. 第一部分简单列举了正则表达式在Ja ...
- 最新的jQuery插件和JavaScript库
每一个前端开发人员很清楚的重要性和功能的JavaScript库提供.它提供了一个简单的接口,用于构建快速动态的接口,而无需大量的代码. 谢谢你的超级从事jQuery开发者社区,人始终是创造新的和令人惊 ...
- javascript语言精粹
内容选自:<javascript语言精粹> 1.6种值会为假(==false),分别是false,null,undefined,' ',0,NaN 2.typeof有6种值,分别是'num ...
- JavaScript数据类型转换
原文转自:http://javascript.ruanyifeng.com/grammar/conversion.html#rd JavaScript是一种动态类型语言,变量是没有类型的,可以随时赋予 ...
随机推荐
- Linux文件编辑之sed命令
文件编辑之sed命令 sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为模式空间 (pattern space ...
- Asp.Net集群中Session共享
今天遇到了这个问题,于是研究了一下.要解决这个问题,首先就要明白一些Session的机理.Session在服务器是以散列表形式存在的,我们都知道Session是会话级的,每个用户访问都会生成一个Ses ...
- 安装pip工具
Python 2.7.9+ and 3.4+ Good news! Python 3.4 (released March 2014) and Python 2.7.9 (released Decemb ...
- 文件查找和比较命令 来自: http://man.linuxde.net/find
文件查找和比较1.find命令,用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时不设置任何参数,则find命令则在当前目录下查找子目录与文件.并且将查到的子 ...
- 使用菜单(Menu)资源
前面已经介绍过Android的菜单支持,前面介绍菜单时分别介绍了如何使用Java代码来实现菜单和使用XML资源文件定义菜单. 实际上Android推荐使用XML资源文件来定义菜单,使用XML资源文件定 ...
- AJAX 跨域请求的解决办法:使用 JSONP获取JSON数据
由于受到浏览器的限制,ajax不允许跨域通信.如果尝试从不同的域请求数据,会出现安全错误.如果能控制数据驻留的远程服务器并且每个请求都前往同一域,就可以避免这些安全错误.但是,如果仅停留在自己的服务器 ...
- Iframe 自适应高度并实时监控高度变化的js代码
不得不用到iframe,且被强烈要求不能让它出现滚动条!嵌入的页面肯定是高度不一的,页面中也不能出现大片空白,所以也不能写死高度!真是麻鬼烦啊!google N次 + 百度M次 + 试验了1605次之 ...
- ORA-39002 ORA-39070 ORA-29283 ORA-06512 ORA-29283
记一次expdp导出失败,报错如下 ORA-39002: invalid operation ORA-39070: Unable to open the log file. ORA-29283: in ...
- linux学习笔记----权限与命令之间的关系(极重要)
一.权限与命令之间的关系 二.文件与目录的默认权限与隐藏权限 1)umask为默认的权限(通过umask -S)查看你的系统的默认权限. umask的分数是指该默认值需要减掉的权限,比如说umask= ...
- vue.js中ajax请求
<div id="app"> <table style="border-collapse: collapse"> <thead&g ...