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是一种动态类型语言,变量是没有类型的,可以随时赋予 ...
随机推荐
- 使用Python脚本操作MongoDB的教程
Reference: http://www.jb51.net/article/64225.htm
- 【Xilinx-ZYNQ ucos-iii的移植与开发】-00-开始
前一段时间,调试了一块ZYNQ的板子,上面用到了ucos-iii操作系统,最终在该板子上实现了操作系统的运行,并实现了一些外设模块的功能,主要包括PWM,I2C,GPIO,两级中断. 等有空了总结一下 ...
- 利用python 实现微信公众号群发图片与文本消息功能
在微信公众号开发中,使用api都要附加access_token内容.因此,首先需要获取access_token.如下: #获取微信access_token def get_token(): paylo ...
- 1.1.2.托管对象模型(Core Data 应用程序实践指南)
托管对象模型即对象图,可以看成实体类的描述,规定了数据字段. 要想创建托管对象模型,需生成NSManagedObjectModel类的实例.
- pace.js原理简介
简介: 不少童鞋可能都使用过pace.js:http://github.hubspot.com/pace/docs/welcome/ 只要在页面上引入pace.js和相关的css,并不需要对业务逻辑做 ...
- iOS 之 深复制、浅复制
深复制不仅复制对象本身,对象持有的属性对象也做了复制. 浅复制之复制对象本身,不对里面的属性进行复制.
- 1.4.2.5. 测试(Core Data 应用程序实践指南)
测试的方法也很简单: 首先,在AppDelegate.h里面引用CoreDataHelper @property (strong, nonatomic, readonly)CoreDateHelper ...
- js原生设计模式——12装饰者模式
1.面向对象模式装饰者 <!DOCTYPE html><html lang="en"><head> <meta charset=&q ...
- endnote 使用方法
选择需要的期刊格式,复制到收藏夹. 下载安装插件. 鼠标放在需要插入引用的地方. 关键词搜索文献,记得在这之前要把需要的文献保存至endnote online.然后insert就行了.初次安装可能会有 ...
- Java线程:堵塞队列与堵塞栈
一.堵塞队列 Java定义了堵塞队列的接口java.util.concurrent.BlockingQueue,堵塞队列是一个指定长度的队列,当试图向队列中添加元素而队列已满,或者是想从队列移出元素而 ...