简介

我想这是在我总结JavaScript系列中最为需要注意的,最为重要的内容。你必须要去了解这些问题特性,才能准备好应对措施,这真的很重要。

毒瘤

全局变量

全局变量的存在的确是带来了方便,但是我觉得JavaScript对于全局变量的依赖性已经到达一种恐怖的状态。如果某些全局变量的名称碰巧和子程序中的变量名称相同,那么它们就会相互冲突,可能导致程序无法执行,而且不好调试。

文章中定义了三种定义全局变量的方式,分别是:

  1. 在任何函数之外放置一个var语句,这个和其他语言一样:

    var foo = value;

  2. 直接给全局对象添加一个属性。如果是在Web浏览器里,全局变量为Window:

    window.foo = value;

  3. 直接使用未经处理的变量,这个称为隐式的全局变量:

    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 毒瘤和糟粕(需要注意的地方)的更多相关文章

  1. javascript sort方法容易犯错的地方

    sort方法用来对数组排序非常方便.但是sort(func)这个func参数的构造却很容易混淆. sort判断func的返回值是判断正负,而不是ture和false.所以务必保证返回值要么负数要么正数 ...

  2. 《Javascript语言精粹》 读书笔记

    1 6种值被当做假:false.null.undefined.空字符串''.数字0.数字NaN,其他所有值都为真,包括"false" 2 typeof有6种值,分别是'number ...

  3. (网页)12种不宜使用的Javascript语法(转)

    转自阮一峰: 最近写的一些小东西,总是出各种各样的问题,用了angular.js反应居然比我的jQuery还慢,客户吐槽了,我又把一个小操作,改成了jQuery.浏览一下大神的的博客.转载一点东西: ...

  4. 这几种JavaScript语法不要轻易使用,容易出事

    文章目录 12种不宜使用的JavaScript语法 1. == 2. with 3. eval 4. continue 5. switch 贯穿 6. 单行的块结构 7. ++和-- 8. 位运算符 ...

  5. JavaScript 语言精粹笔记3

    方法 毒瘤 糟粕 记录一下阅读蝴蝶书的笔记,本篇为书中最后一部分:方法.代码风格.优美的特性.毒瘤.糟粕等. 方法 这一章主要介绍了一些方法集.这里写几个我不太熟悉的方法和要点吧. array.joi ...

  6. 详解Javascript中正则表达式的使用

    正则表达式用来处理字符串特别好用,在JavaScript中能用到正则表达式的地方有很多,本文对正则表达式基础知识和Javascript中正则表达式的使用做一个总结. 第一部分简单列举了正则表达式在Ja ...

  7. 最新的jQuery插件和JavaScript库

    每一个前端开发人员很清楚的重要性和功能的JavaScript库提供.它提供了一个简单的接口,用于构建快速动态的接口,而无需大量的代码. 谢谢你的超级从事jQuery开发者社区,人始终是创造新的和令人惊 ...

  8. javascript语言精粹

    内容选自:<javascript语言精粹> 1.6种值会为假(==false),分别是false,null,undefined,' ',0,NaN 2.typeof有6种值,分别是'num ...

  9. JavaScript数据类型转换

    原文转自:http://javascript.ruanyifeng.com/grammar/conversion.html#rd JavaScript是一种动态类型语言,变量是没有类型的,可以随时赋予 ...

随机推荐

  1. react programming

    So you're curious in learning this new thing called Reactive Programming, particularly its variant c ...

  2. JS 中 Class - 类创建

    Class - 类创建 Class类实现了在JavaScript中声明一个新的类, 并通过构造函数实例化这个类的机制.通过使用Class.create()方法, 你实际上声明了一个新的类, 并定义了一 ...

  3. GP项目总结(一)

    1.使用activity渲染不同的View时,两种方法: (1.)自定义两个不同的View,然后在mainActivity里根据不同的数据使用不同的View,通过addView()来Activity里 ...

  4. centos 6 下编译安装 nginx

    下载nginx源码包,可以到nginx官方的下载文件归档里 http://nginx.org/download/ 下载 下载pcre源码,并编译安装,从pcre官方下载  ftp://ftp.csx. ...

  5. IOS 微信

    原文:http://blog.csdn.net/ysy441088327/article/details/8441608 按照常例,列一些网址先: 微信开放平台首页: http://open.weix ...

  6. Grunt构建工具能做哪些事?

    Grunt到底有什么作用?一般用来干嘛? 很多前端的工作,包括Less编译.javascript压缩.Css压缩等零零碎碎的工作, 都可以让Grunt来做. 实际上在项目开发中,一般是前端代码 与 后 ...

  7. Mybatis学习(8)逆向工程

    什么是逆向工程: mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mapper.xml.po.. ...

  8. java_web学习(16)Ajax

    Ajax       Ajax(Asynchronous JavaScript and XML的缩写),允许浏览器与服务器通信而无须刷新当前页面的技术都被叫做Ajax.       Ajax:一种不用 ...

  9. 【翻译】在Visual Studio中使用Asp.Net Core MVC创建第一个Web Api应用(二)

    运行应用 In Visual Studio, press CTRL+F5 to launch the app. Visual Studio launches a browser and navigat ...

  10. Memcached Client的释疑

    1.目前大多数php环境里使用的都是不带d的memcache版本,这个版本出的比较早,是一个原生版本,完全在php框架内开发的.与之对应的带d的memcached是建立在libmemcached的基础 ...