javascript随手记
编码规范
写在所有函数外面的变量就是全局变量。
之所以要避免使用全局变量是因为:如果有多个类库的话,它们都定义了一个名字的变量。这时候后引入的类库中该变量的值就会覆盖前面引入的类库中该同名变量的功能。
解决方案
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字符串类型称作不可变对象。
这里对象的意义指的是真正的值存放在堆中的变量。