for…in
看见过但没怎么注意过的一个东西,查了一下,最后得出的结论是这个…能不用就别用,坑有点多……语法大致就是字面意思,在某个数组或对象里面遍历,有两个很明显的坑,一是不按顺序,而是效率低。
label
这个也不常用,书上的解释是给一段语句加标签。我理解大概是可以精准定位,比如一段双循环代码,在最外面给这段代码加个标签 xxx: ,如果在最内层break,只是跳出当层的循环,外层的循环依然继续,但是如果break xxx,直接可以跳到最外层。它一般与break、continue联合使用,但是最好不要嵌套过多的循环。
传递参数
1 | function setName(obj){ |
先创建一个空对象,保存在变量person中,然后把它传入setName(),这样person就相当于setName中的obj,他们引用的是一个对象,但是这不代表这个对象是按引用传递的,它依然是按值传递。比如说下面这一段
1 | function setName(obj){ |
这时候打印出来person.name的值依然是LLY,如果是按引用传递的话,局部作用域改变,全局应与其一致。其实……我觉得这种东西暂时没必要搞那么清楚,反正一调试什么都看得见。而且我觉得,当在函数内部重写obj的时候,这个变量的引用就是一个局部的对象了,用完就销毁了。
检测数据类型
这个比较简单,但调试会很有用,先留着。
基本数据类型
1 | var a = "LLY"; |
检测引用类型
1 | alert(person instanceof Object);//变量person是Object吗? |
因为所有引用类型都是Object的实例,所以检测一个引用类型是不是Object的时候会始终返回true。
作用域
JavaScript是没有块级作用域的。就是说在if里var一个变量,这个变量会添加到当前的执行环境中,这是和Java还有C的不同之处。
创建对象
三种方法
No.1
1 | var person = new Object(); |
No.2
1 | var person ={ }; |
…
No.3
1 | var person ={ |
第二种其实就是把第三种里面的内容去掉,再重新定义属性。我感觉第三种字面量语法用得比较多吧,看起来逼格高一点,而且代码量比较少,不过最后一个属性最好不要加分号。
访问对象
- person.name
- person[“name”]
第一种应该比较常见,第二种有个好处是可以通过变量访问,比如a=”name”,可以直接person[a];还有一个好处如果属性名为关键字保留字空格什么非法字符什么的,这时候不能用.,只能用方括号了,不过我想不通干嘛非要那么作用这些字符做属性名==
数组
数组好像没什么好说的,唯一感慨的是在一个数组的末尾添加新项就一行代码取到.length就可以啊啊!不像C还要分配内存空间==(吐槽一下,数据结构折腾疯)。
还有一个检测数组,除了之前的方法,也可以用Array.isArray()搞定。
说到数据结构,真的来了。
当然,学完C这种折腾人的东西,js这个明显太简单了。
其实也就是对数组的一个操作方法,栈后进先出,队列先进先出也没什么好说的,列下语法好了。
栈
var color = new Array();
var count = color.push(“red”,”green”);
var count = color.push(“black”);
item = color.pop();
此时item获取的是后进的”black”,同时最后一项已经出栈,所以现在数组里仅剩两项。
队列与之类似,但取数据是shift(),就是说先push进数据,但是shift()取数据时取的是最先进去的。
另外还有一个反队列 unshift()和pop(),unshift在前端插入数据,pop()从末项移除。
重排序方法
reverse() //反转数组项顺序
sort() //测试字符串的结果升序排列
sort()排序排的不是数值,而是字符串,所以一般是给它传入一个比较函数再进行排序
其它操作方法……增删改查复制替换,还是挺全的,用的时候可以看看,不枚举了。