编码规范

避免使用全局变量

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

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

解决方案

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. cxf

    一,cxf webService入门案例 1,jar包 注意版本 使用jdk6和apache-cxf-3.1.2,但cxf-3.1.2已经不支持jdk6,需要jdk7以上 版本用错会报java.lan ...

  2. C++第五章函数

    书上的点: 这次直接写写画画了,遇到的bug也就直接敲了,忘记记录了,好在都在书上,所以勾画一下,提一下.发现每一章后面的小结,都蛮有意思的.可以抄一遍. 1.返回值的函数成为返回值函数(value- ...

  3. NGINX server配置中if的用法

    server的配置以php为例,如下: 1 server{ 2 root /var/webproject/www/mytools-php; 3 index index.html index.php; ...

  4. 关于SpringMVC和Struts2的区别

    1.    与struts2不同 1.  springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器. 2. springmvc是基于方法开发,传递参数是通 ...

  5. UVa 1645 Count(**)

    题目大意:输入n,统计有多少个n个结点的有根树,使得每个深度中所有结点的子结点数相同.结果模1000000007. 思路:根据题意,每个结点的每个子树都是相同的.所以n结果为n-1的所有约数的结果加起 ...

  6. CentOS 7 安装virtualBox

    sudo rpm -ivh rpmforge-release-0.5.1-1.el5.rf.x86_64.rpm sudo yum install VirtualBox-5.0

  7. Apple Watch 使用体验

    交互 Apple Watch 支持以下几种交互方式: 按下 Digital Crown (数码表冠),在桌面和表盘之间切换. 长按 Digital Crown (数码表冠),启动 Siri. 双击 D ...

  8. 议:如何将树形菜单形式的数据转化成HTML的二维表(相同内容需合并单元格)

    一般做OA类管理系统,经常涉及到“组织架构”的概念,那么像这种有上下层级关系的数据一般会做成树形菜单的方式显示,底层代码必定会用到递归算法.这篇随笔的目的就是要谈谈除了用树形菜单来显示这种上下层级关系 ...

  9. DEVMODE 结构体

    typedef struct _devicemode { TCHAR dmDeviceName[CCHDEVICENAME]; //打印机(显示设备)名称 WORD dmSpecVersion; WO ...

  10. error C2664 转换错误汇总[转]

    vs2005提示 error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [17]”转换为“LPCTSTR”. 在用vs2005编写mfc程序的时 ...