编码规范

避免使用全局变量

写在所有函数外面的变量就是全局变量。

之所以要避免使用全局变量是因为:如果有多个类库的话,它们都定义了一个名字的变量。这时候后引入的类库中该变量的值就会覆盖前面引入的类库中该同名变量的功能。

解决方案

1、对于需要立即执行的,使用匿名函数并立即执行。

(function(){
var test = "hello, world!";
alert(test);
}());

这里注意:该匿名函数外面的括号以及最后的分号不能忘了!

2、对于不用立即执行的,直接封装到函数里面即可。

缓存循环长度
for (var i=0, max=arr.length; i<max; i++){
//......
}

这样的话,就不必每次循环都去读取数组arr的长度了。

一种更优雅的循环技法:

var arr = [1,5,2,7,9,3];
i = arr.length;
while (i--) {
alert(arr[i]);
}

这样做的好处是:

1、代码更为精简,并且使用到了单var技法,代码显得更 优雅。

2、和上一种技法相比,它同样存储了要循环的数组的长度,不必每次循环都去遍历数组对象。

3、每次都和零比较,提高代码的运行效率。

但是,这种写法JSLint不推荐。我个人认为代码风格其实就是在 效率、可读性、是否优雅 此三者之间做一个妥协取舍。那么具体应该怎么做也就见仁见智了。

最简单的命名规范

1、构造函数使用大驼峰camel命名法。即所有单词的首字母大写。

2、一般函数和方法使用小驼峰camel命名法。即除第一个单词的首字母小写之外,其它单词首字母大写。

3、其它诸如局部变量所有单词之间使用下划线分隔,所有字母小写。

javascript中的数据类型

个人觉得这是一个非常混乱的问题,为什么这么说呢?

摆现象:

观点一:说javascript的数据类型包括:5种简单数据类型和1种复杂数据类型。

number、string、boolean、null、undefined五种简单数据类型

剩下的都属于object这一复杂数据类型,包括数组、函数、正则表达式等等。

观点二:说javascript的数据类型包括:6种数据类型。

    number、string、boolean、undefined、function、object

观点三:一切皆是对象,啧啧,牛X吧。

试分析:

观点一:是根据数据类型的可变或者不可变来进行区分归类的。

    可变的类型划分到简单数据类型。

    不可变的类型划分到复杂数据类型。

看下面一段js代码:

var s = "tt";
var s2 = s;
s = "dd";
alert(s); //dd
alert(s2); //tt

这说明,string是不可变的,所以它是5种简单数据类型的一种。

既然在5种简单数据类型中看到了null和undefined,那NaN又是什么呢?NaN表示该变量非数字。可以使用isNaN()函数来判断。

使用typeof来判断会发现它的类型是number。而number本身自然是不可变的,所以也就没有必要将它单独列到5种简单数据类型中去了。

对于这种观点来说,什么是对象?对象就是可变的键控集合。

观点二:是根据javascript的内置typeof关键字做出的结论。

    你会发现使用typeof关键字只能得到六种数据类型:number、string、boolean、object、function、ubdefined。

    而null的类型是object,NaN的类型是number,undefined的类型就是undefined。

    String、Number、Boolean(注意首字母是大写),它们是string、number、boolean这三个类型的包装对象,属于object类型。

观点三:这个比较粗犷,得出的结论估计来源两点:

    1、有方法的东东就是对象。

    2、与javascript和java的关系有异曲同工之妙。

总结

其实,本来就无所谓对错之分,只不过是分类依据不同罢了。

正如同如果根据颜色来分:白马、白鸡、白人是一类;黑马、黑鸡、黑人是一类。

如果根据种族来分:马、鸡、人各是一类。

引申

对于观点一中的可变和不可变类型,有必要详细说说。
这个就要先搞清楚计算机中栈和堆的关系了。
我们先来看看总共有哪些类型吧:number、string、boolean、null、undefined、object。
1、其中,object在栈上存放着变量的地址,在堆上存放着真正的值。所以它是可变的。

2、另外一些值类型的数据则是存放在栈上,变量之间的复制存放的是一份新的拷贝,它们是不可变的。

3、对于string来说,比较特殊。它虽然也是将地址存放在栈中,将真正的值存放在堆中。但是它却是不可变的。这是为什么呢?看下面的代码:

var s = "tt";
var s2 = s;
s = "dd";
alert(s); //dd
alert(s2); //tt

其实一开始为变量s赋值为"tt"的时候,会在堆中开辟一块内存空间。

为s2赋值为s的时候,其实是将变量s在栈中存放的地址赋给了它。也就是说s2和s在栈中得值是一样的,它们都是一个地址,都指向堆中得一块内存空间,而那块内存空间中存放的就是"tt"。

当为s重新赋值为"dd"的时候,注意这里就是string类型特殊的地方了。它会先到堆中去看有不有现成的数据"dd",如果有的话就将该数据的地址赋值给s,如果没有就重新开辟一块内存空间并赋值为"dd",最后将这块新开辟的内存空间的地址赋值给s。

所以这时候s和s2在栈中的值已经不一样了。它们分别指向堆中不同的内存空间。

而改变了变量s,结果却并没有改变变量s2,所以说它是不可变的。

所以在有些时候也会把string字符串类型称作不可变对象。

这里对象的意义指的是真正的值存放在堆中的变量。

javascript随手记的更多相关文章

  1. 复习JavaScript随手记

    数据类型 基本类型 string number boolean undefined number类型,包含整数浮点数 NaN和自己都不相等,涉及NaN的计算结果都是NaN isNaN()函数用于判断一 ...

  2. JavaScript技巧手冊

    js小技巧 每一项都是js中的小技巧,但十分的有用! 1.document.write(""); 输出语句  2.JS中的凝视为//  3.传统的HTML文档顺序是:documen ...

  3. JavaScript的个人学习随手记(三)

    JavaScript Window - 浏览器对象模型 Window 对象 以下window对象时使用均可省略window 所有浏览器都支持 window 对象.它表示浏览器窗口. 所有 JavaSc ...

  4. JavaScript的个人学习随手记(二)

    JS HTML DOM 改变 HTML 输出流 JavaScript 能够创建动态的 HTML 内容: 今天的日期是: Sat Sep 24 2016 15:06:50 GMT+0800 (中国标准时 ...

  5. JavaScript的个人学习随手记(一)

    JavaScript 简介  要学习的人可以到W3School http://www.w3school.com.cn/b.asp JavaScript 是世界上最流行的编程语言. 这门语言可用于 HT ...

  6. 发发关于JavaScript的感慨,随手记几个js知识碎片

    最近一段时间写了很多JavaScript和jquery代码,越来越感觉js基础不牢固,写一句查半天,有时间肯定要系统的学一下. 不说了,先记一下最近学到的点东西,省的以后没时间系统学js还要再来查. ...

  7. 【javascript】随手记代码

    //js实现的当前界面的刷新.前进.后退 <input type="button" value="刷新" onclick="window.loc ...

  8. Javascript手记-垃圾收集

    如果有人问.net的垃圾回收,大家会马上想到gc,那如果有人问你javascript如何进行内存管理的呢?挠挠头,一口香瓜,听我细细道来! javascript具有自动垃圾收集机制,执行环境会负责管理 ...

  9. Javascript手记-执行环境和作用域

    执行环境是javascript一个重要的概念,执行环境定义了变量有权访问其他数据决定了他们各自的行为,每个执行环境 都有一个与之关联的变量,环境中定义的所有变量和函数都保存在这个对象中,虽然我们编写的 ...

随机推荐

  1. IOS中如何显示带有html标签的富文本

    NSString *strHTML = @"<p>你好</p><p>        这是一个例子,请显示</p><p>外加一个ta ...

  2. 修改UIBarButtonItem字体大小、颜色等相关属性

    在ios中如果想修改UIBarButtonItem里面的内容有很多种方法,常见的就是自定义contentView  但是有时候因为懒不想自定义只想在原来的文字上进行修改 如果只是修改UIBarButt ...

  3. 关于Java基本数据类型

    Java的基本数据类型分为两大类:boolean类型和数字类型.而数值类型又分为整数类型和浮点类型.而整数类型中的字符类型也可以被单独对待. 总共是4类8种. byte类型整数在内存里占8位. -12 ...

  4. 关于JDBC链接数据库的代码实现

    /** * 快速入门 */ @Test public void demo1() { /** * * 1.加载驱动. * * 2.获得连接. * * 3.编写sql执行sql. * * 4.释放资源. ...

  5. JMS简介

    任何一个系统从整体上来看,其实质就是由无数个小的服务或事件(我们可以称之为事务单元)有机地组合起来的.对于系统中任何一个比较复杂的功能,都是通过调用各个独立的事务单元以实现统一的协调运作而实现的.现在 ...

  6. PHP自动化测试

    参考网址: 1. 基于Jenkins 实现php项目的自动化测试.自动打包和自动部署 2.  PHP Jenkins,参考:http://jenkins-php.org/ 3.安装PHP_CodeSn ...

  7. 3.x vector的用法

    #include<vector> //struct struct GOLD_STRUCT {     Sprite  * goldspSprite;     int goldValue; ...

  8. SignalR 跨域设置

    参考文章:http://www.cnblogs.com/nywd/p/3691813.html 上一节,已经实现了,当前域内的通信,这一节中,介绍一下跨域的即时通信,既然要做,我们肯定要把这个推送及聊 ...

  9. Linux命令行程序和内建指令

    摘录百度分类 文件系统 cat cd chmod chown chgrp cksum cmp cp du df fsck fuser ln ls lsattr lsof mkdir mount mv ...

  10. Agile.Net 组件式开发平台 - 开发环境部署

    环境准备: Windows 7 (32/64) Windows Server 2008 (32/64) Microsoft SQL Server 2008 R2 (32/64) Microsoft V ...