复习
apply和call方法的使用和区别
*
* 都可以改变this指向的
* 使用方式:
* 函数名.apply(对象,[参数1,参数2,参数3,...]);
* 函数名.call(对象,参数1,参数2,参数3,....);
* 我想要使用其他对象的某个方法,其他对象.方法名.apply(当前对象,参数,...);
* 这个方法就会被当前的对象所使用,同时这个方法中的this就是当前的对象,在调用方法的时候改变了this的指向
*
* bind方法的使用和区别
* 复制一个方法或者是函数,是在复制的同时改变了this的指向
* 使用方式:
* 函数名.bind(对象,参数1,参数2,...);------>返回值是复制之后的这个函数
*
* 高阶函数---->函数的使用的方式:函数作为参数使用,函数作为返回值使用
* 函数作为参数使用的时候,这个函数可以是匿名函数,也可以是命名函数
* 作用域和作用域链及预解析
*
* 闭包:函数中有另一个函数,或者是一个函数中有另一个对象,里面的函数或者是对象都可以使用外面函数中定义的变量或者数据,此时形成闭包
*
* function f1(num){
*
* return function(){
* console.log(num);
* }
* }
*
* f1(20);
*
* 闭包模式:函数模式闭包,对象模式的闭包
* 闭包的作用:缓存数据,延长作用域链,同时也是缺点,函数中的变量不能及时的释放
*
* 沙箱:就是一个环境,也可以叫黑盒,在这个环境中模拟外面真实的开发环境,完成需求,效果和外面的真实的开发环境是一样的
* 沙箱避免命名冲突
*
* 递归:函数中调用函数自己,递归一定要有结束的条件,否则就是死循环
*
* 递归:一般应用在遍历上
* 递归轻易不要用,效率很低,
var num=100;
(function () {
var num=10;
console.log(num);
}());
console.log(num);
(function () {
})();
02课程介绍
浅拷贝
* 深拷贝----------|======>递归
* 遍历DOM树-------|======>递归------晚上能够把代码写出来是最好的
*
* 正则表达式-------很重要的东西
* 元字符
* 写几个正则表达式
* 写代码
* 正则表达式的案例=========>代码写出来
* 数组和伪数组的区别
03浅拷贝
浅拷贝:拷贝就是复制,就相当于把一个对象中的所有的内容,复制一份给另一个对象,直接复制,或者说,就是把一个对象的地址给了另一个对象,他们指向相同,两个对象之间有共同的属性或者方法,都可以使用
var obj1={
name:"fangyuan",
age:23,
sex:"女",
car:["奔驰","奥迪","宝马","苹果"]
};
var obj2={};//新建另一个新的对象
//写一个函数,作用:把一个对象的属性复制到另一个对象中,浅拷贝
//把a对象中的所有的属性复制到对象b中
function extend(a,b){
for(var key in a){
b[key]=a[key];
}
}
extend(obj1,obj2);
console.log(obj1);
console.log(obj2);//开始的时候这个对象是空对象
浅拷贝:就是直接遍历一个对象的属性找到之后复制一份放到另一个对象中
04深拷贝
深拷贝:拷贝还是复制,深:把一个对象中所有的属性或者方法,一个一个的找到.并且在另一个对象中开辟相应的空间,一个一个的存储到另一个对象中
数组也是属于对象,对象是需要开辟单独的一快空间的,(比如此处的car),而普通的属性不需要开辟单独的空间,比如此处的age,sex,而dog是一个对象。
深拷贝和浅拷贝不是一回事,深拷贝效率更费时,要一个一个的找,代码用到的是递归。
var obj1={
name:"方园",
sex:"女",
car:["奔驰","宝马","特斯拉"],
dog:{
name:"哈士奇",
age:10,
color:"经典黑白"
}
};
var obj2={};//空对象
//通过函数实现,把对象a中的所有的数据深拷贝到对象b中
function extend(a,b) {
for(var key in a){
//先获取a对象中每个属性的值
var item=a[key];
//判断这个属性的值是不是数组
if(item instanceof Array){
//如果是数组,那么在b对象中添加一个新的属性,并且这个属性值也是空数组
b[key]=[];
//调用这个方法,把a对象中这个数组的属性值一个一个的复制到b对象的这个数组属性中即递归
extend(item,b[key]);
}else if(item instanceof Object){//判断这个值是不是对象类型的
//如果是对象类型的,那么在b对象中添加一个属性,是一个空对象
b[key]={};
//再次调用这个函数,把a对象中的属性对象的值一个一个的复制到b对象的这个属性对象中
extend(item,b[key]);
}else{
//如果值是普通的数据,直接复制到b对象的这个属性中
b[key]=item;
}
}
}
extend(obj1,obj2);
console.dir(obj1);
console.dir(obj2);
05遍历DOM树
//节点:nodeName,nodeType,nodeValue
// 第一个函数:给我根节点,我会找到所有的子节点:forDOM(根节点)
// 获取这个根节点的子节点
// var children=根节点的.children
// 调用第二个函数
//
// 第二个函数:给我所有的子节点,我把每个子节点的名字显示出来(children)
// for(var i=0;i<children.length;i++){
// 每个子节点
// var child=children[i];
//获取页面中的根节点--根标签
var root=document.documentElement;//html
//函数遍历DOM树
//根据根节点,调用fn的函数,显示的是根节点的名字
function forDOM(root1) {
//调用f1,显示的是节点的名字
// f1(root1);
//获取根节点中所有的子节点
var children=root1.children;
//调用遍历所有子节点的函数
forChildren(children);
}x
//给我所有的子节点,我把这个子节点中的所有的子节点显示出来
function forChildren(children) {
//遍历所有的子节点
for(var i=0;i<children.length;i++){
//每个子节点
var child=children[i];
//显示每个子节点的名字
f1(child);
//判断child下面有没有子节点,如果还有子节点,那么就继续的遍历
child.children&&forDOM(child);
}
}
//函数调用,传入根节点
forDOM(root);
function f1(node) {
console.log("节点的名字:"+node.nodeName);
}
06正则表达式(元字符和限定符)
* 正则表达式:也叫规则表达式,按照一定的规则组成的一个表达式,这个表达式的作用主要是匹配字符串的,
* "我的电话:10086,他的电话:10010,你的电话:10000" 正则表达式,把这个字符串中的所有的数字找到
*
* 正则表达式的作用:匹配字符串的
*
* 在大多数编程语言中都可以使用
*
* 正则表达式的组成:是由元字符或者是限定符组成的一个式子
*
* 元字符:
*
* . 表示的是:除了\n以外的任意的一个字符 "fdsfs238"
*
* [] 表示的是:范围, [0-9] 表示的是0到9之间的任意的一个数字, "789" [0-9]
* [1-7] 表示的是1到7之间的任意的一个数字
* [a-z] 表示的是:所有的小写的字母中的任意的一个
* [A-Z] 表示的是:所有的大写的字母中的任意的一个
* [a-zA-Z] 表示的是:所有的字母的任意的一个
* [0-9a-zA-Z] 表示的是: 所有的数字或者是字母中的一个
* [] 另一个函数: 把正则表达式中元字符的意义干掉 [.] 就是一个.
* | 或者 [0-9]|[a-z] 表示的是要么是一个数字,要么是一个小写的字母
* () 分组 提升优先级 [0-9]|([a-z])|[A-Z] //先计算括号里面的a-z
* ([0-9])([1-5])([a-z]) 三组, 从最左边开始计算
* (()(()))注意:不是按照括号的里外包围顺序的,而是从左到右的顺序
*
*
* 都是元字符,但是也可以叫限定符,下面的这些
* * 表示的是:前面的表达式出现了0次到多次
* [a-z][0-9]* 小写字母中的任意一个 后面是要么是没有数字的,要么是多个数字的
* "fdsfs3223323" [a-z][0-9]*
*
* + 表示的是:前面的表达式出现了1次到多次
* [a-z][9]+ 小写字母一个后面最少一个9,或者多个9
* "fesfewww9fefds"
*
* ? 表示的是:前面的表达式出现了0次到1次,最少是0次,最多1次 ,另一个含义:阻止贪婪模式
* [4][a-z]? "1231234ij"
* 限定符:限定前面的表达式出现的次数
* {} 更加的明确前面的表达式出现的次数
* {0,} 表示的是前面的表达式出现了0次到多次,和 *一样的
* {1,} 表示的是前面的表达式出现了1次到多次,和 +一样的
* {0,1} 表示的是前面的表达式出现了0次到1次,和 ?一样的
* {5,10} 表示的是前面的表达式出现了5次到10次
* {4} 前面的表达式出现了4次
* {,10} 错误的========不能这么写
* ^ 表示的是以什么开始,或者是取非(取反)
^在括号外面表示以什么开头,在括号里面的话则表示取反
^[0-9] 以数字开头
* ^[a-z] 以小写字母开始
* [^0-9] 取反,非数字
* [^a-z] 非小写字母
* [^0-9a-zA-Z_] 特殊符号 (-不算是特殊符号)
* $ 表示的是以什么结束
[0-9][a-z]$ 必须以小写字母结束
[0-9][a-z] 是不严格模式例如 "3f2432e"
* ^[0-9][a-z]$ 相当于是严格模式 ,必须以数字开头,字母结尾 "4f",上面的(3f2432在此处是不对的)
不严格模式是有就行,而严格模式是必须是
* \d 数字中的任意一个,
* \D 非数字中的一个
* \s 空白符中的一个
* \S 非空白符
* \w 非特殊符号
* \W 特殊符号
* \b 单词的边界
* "what are you no sha lei"
复习正则表达式
* . 除了\n以外的任意一个单个字符
* [] 范围
* () 分组,提升优先级
* | 或者
* * 0-多次
* + 1-多次
* ? 0-1次
* {0,} 和*一样
* {1,} 和+
* {0,1} 和?
*
* \d 数字中的任意一个相当于【0-9】
* \D 非数字
* \s 空白符
* \S 非空白符
* \W 特殊符号(没有下划线)
* \w 非特殊符号 _ (有下划线)
* ^ 取反,以什么开始
* $ 以什么结束
*
* \b 单词边界(what are you doing 中的空格)
还有很多就不一一介绍了,去网站MDN中去找吧
07正则表达式练习
* 写正则表达式,根据字符串来写正则表达式进行匹配
*
* 经验: 1.找规律 2.不要追求完美
*
*
* 身份证的正则表达式
*
* 15位或者18位(第一位不能为0所以第一位是1-9)
* (15位是老的,18位是新的)国家的18位里面是存储了档案的对应的15位都是存储的,也就是说15位也是可以找到的
* ([1-9][0-9]{14})|([1-9][0-9]{16}[0-9xX])
*
* 上面升级成以下表达式:
* ([1-9][0-9]{14})([0-9]{2}[0-9xX])?
* ?代表出现0次或者1次,只有这两种情况,
* 即前面15位是必须有的,后面三位是可能有的
*
*
* 练习:
* 1.座机号码的正则表达式
* 010-19876754
* 0431-87123490
*
* [0-9]{3,4}[-][0-9]{8}
* \d{3,4}[-]\d{8}
*
* \d{3,4}[-][0-9]{8} 这种方式没有上面两种好,应为要么全用\d,要么全用【0-9】用一个套路
*
*
* 2.qq号码的正则表达式(5-11位)
*
* [1-9][0-9]{4,10}
* \d{5,11}
*
* 3.手机号码的正则表达式
*
* 130 131 132 133 134 135 136 137 138 139
* 143 147
* 150 151 152 153 154 155 156 157 158 159
* 170 171 173 176 177
* 180 181 182 183 184 185 186 187 188 189
* ([1][358][0-9][0-9]{8})|([1][4][37][0-9]{8})|([1][7][01367][0-9]{8})
* \d{11}
* 邮箱的正则表达式,必须要记住的
*
* sd2113_3.-fd@itcast.com.cn
* 应为后面的域名要么是一级域名(即只有一个域名),要么二级域名(比如.com.cn)
* 所以是{1,2}, +代表1次或者以上
*
* [0-9a-zA-Z_.-]+[@][0-9a-zA-Z_.-]+([.][a-zA-Z]+){1,2}
08创建正则表达式对象
注意先写一个//,然后在注释里面写上正则表达式:这种方式是Javascript的特有的一种写法
//创建正则表达式对象
//两种:
* 1.通过构造函数创建对象
* 2.字面量的方式创建对象
1.正则表达式的作用:匹配字符串的
*
* */
//对象创建完毕---
var reg=new RegExp(/\d{5}/);
注意先写一个//,然后在注释里面写上正则表达式
//字符串
var str="我的电话是10086";
//调用方法验证字符串是否匹配
var flag=reg.test(str);
console.log(flag); //true
//对象创建完毕---
var reg=new RegExp(/\d{5}/);
//调用方法验证字符串是否匹配
var flag=reg.test("我的电话是10086");
console.log(flag); //true
2.字面量的方式创建正则表达式对象
var reg=/\d{1,5}/;
var flag=reg.test("小苏的幸运数字:888");
console.log(flag); //true
09识别正则表达式是否匹配
[a-z]和[a-z]{2,3}有啥区别?
console.log(/./.test("除了回车换行以为的任意字符"));//true
console.log(/.*/.test("0个到多个"));//true
console.log(/.+/.test("1个到多个"));//true
console.log(/.?/.test("哈哈"));//true
console.log(/[0-9]/.test("9527"));//true
console.log(/[a-z]/.test("what"));//true
console.log(/[A-Z]/.test("Are"));//true
console.log(/[a-zA-Z]/.test("干啥子"));//false
console.log(/[0-9a-zA-Z]/.test("9ebg"));//true
console.log(/b|(ara)/.test("abra"));//true
console.log(/[a-z]{2,3}/.test("arfsf"));//true
console.log(/\d/.test("998"));true
//若\d.{5,8}.test("998")则是false
console.log(/\d*/.test("998"));
//*代表0-多次 true
console.log(/\d+/.test("998"));
true
console.log(/\d{0,}/.test("998"));
true
console.log(/\d{2,3}/.test("998"));
true
console.log(/\D/.test("eat"));
\D代表非数字 true
console.log(/\s/.test(" "));
空白符true
console.log(/\S/.test("嘎嘎 "));
\S代表非空白符 ,但注意此处是true.只要里面有一个符合非空白符就行
console.log(/\w/.test("_"));
非特殊符号 true
console.log(/\W/.test("_"));
特殊符号 false
10案例验证密码的强度
* 密码: 数字,字母,特殊符号
*
* 密码: 只有数字- 或者是只有字母,或者是只有特殊符号---1级---弱
* 两两组合: 数字和字母, 数字和特殊符号, 字母和特殊符号 -----2级----中
* 三者都有: 数字和字母和特殊符号------3级-----强
//获取文本框注册键盘抬起事件
my$("pwd").onkeyup=function () {
//每次键盘抬起都要获取文本框中的内容,验证文本框中有什么东西,得到一个级别,然后下面的div显示对应的颜色
//如果密码的长度是小于6的,没有必要判断
if(this.value.length>=6){
var lvl=getLvl(this.value);
if(lvl==1){
//弱
my$("strengthLevel").className="strengthLv1";
}else if(lvl==2){
my$("strengthLevel").className="strengthLv2";
}else if(lvl==3){
my$("strengthLevel").className="strengthLv3";
}else{
my$("strengthLevel").className="strengthLv0";
}
}else{
my$("strengthLevel").className="strengthLv0";
}
};
//给我密码,我返回对应的级别
function getLvl(pwd) {
var lvl=0;//默认是0级
//密码中是否有数字,或者是字母,或者是特殊符号
if(/[0-9]/.test(pwd)){
lvl++;
}
//判断密码中有没有字母
if(/[a-zA-Z]/.test(pwd)){
lvl++;
}
//判断密码中有没有特殊符号
if(/[^0-9a-zA-Z_]/.test(pwd)){
lvl++;
}
return lvl;//1 3
}
上面的判断级别那块代码中级别刚好和classname中的lv刚好一样于是代码可以升级成下面的这样:
//获取文本框注册键盘抬起事件
my$("pwd").onkeyup=function () {
//每次键盘抬起都要获取文本框中的内容,验证文本框中有什么东西,得到一个级别,然后下面的div显示对应的颜色
//如果密码的长度是小于6的,没有必要判断
// if(this.value.length>=6){
// var lvl= getLvl(this.value);
// my$("strengthLevel").className="strengthLv"+lvl;
// }else{
// my$("strengthLevel").className="strengthLv0";
// }
上述代码可以浓缩成这样
my$("strengthLevel").className="strengthLv"+(this.value.length>=6?getLvl(this.value) :0);
};
//给我密码,我返回对应的级别
function getLvl(pwd) {
var lvl=0;//默认是0级
//密码中是否有数字,或者是字母,或者是特殊符号
if(/[0-9]/.test(pwd)){
lvl++;
}
//判断密码中有没有字母
if(/[a-zA-Z]/.test(pwd)){
lvl++;
}
//判断密码中有没有特殊符号
if(/[^0-9a-zA-Z_]/.test(pwd)){
lvl++;
}
return lvl;//最小的值是1,最大值是3
}
<style type="text/css">
#dv{
width: 300px;
height:200px;
position: absolute;
left:300px;
top:100px;
}
.strengthLv0 {
height: 6px;
width: 120px;
border: 1px solid #ccc;
padding: 2px;
}
.strengthLv1 {
background: red;
height: 6px;
width: 40px;
border: 1px solid #ccc;
padding: 2px;
}
.strengthLv2 {
background: orange;
height: 6px;
width: 80px;
border: 1px solid #ccc;
padding: 2px;
}
.strengthLv3 {
background: green;
height: 6px;
width: 120px;
border: 1px solid #ccc;
padding: 2px;
}
</style>
<body>
<div id="dv">
<label for="pwd">密码</label>
<input type="text" id="pwd" maxlength="16"><!--课外话题-->
<div>
<em>密码强度:</em>
<em id="strength"></em>
<div id="strengthLevel" class="strengthLv0"></div>
</div>
</div>
11案例验证用户输入的是否为邮箱格式
<body>
请您输入邮箱地址:<input type="text" value="" id="email"/> *<br/>
<script>
//如果输入的是邮箱,那么背景颜色为绿色,否则为红色
//获取文本框,注册失去焦点的事件
document.getElementById("email").onblur = function () {
//判断这个文本框中输入的是不是邮箱
var reg = /^[0-9a-zA-Z_.-]+[@][0-9a-zA-Z_.-]+([.][a-zA-Z]+){1,2}$/;
if (reg.test(this.value)) {
this.style.backgroundColor = "green";
} else {
this.style.backgroundColor = "red";
}
};
</script>
</body>
12案例:验证用户输入的是否为中文名字
注意中文的正则表达式是:[\u4e00-\u9fa5] 代表数字范围是: [一-龥]
<body>
请输入您的名字:<input type="text" value="" id="userName" />*<br/>
<script>
//是中文名字,则绿色,否则红色
document.getElementById("userName").onblur=function () {
var reg=/^[\u4e00-\u9fa5]{2,6}$/;
if(reg.test(this.value)){
this.style.backgroundColor="green";
}else{
this.style.backgroundColor="pink";
}
};
//[\u4e00-\u9fa5] [一-龥]
</script>
13大案例验证表单
body {
background: #ccc;
}
label {
width: 40px;
display: inline-block;
}
span {
color: red;
}
.container {
margin: 100px auto;
width: 400px;
padding: 50px;
line-height: 40px;
border: 1px solid #999;
background: #efefef;
}
span {
margin-left: 30px;
font-size: 12px;
}
.wrong {
color: red
}
.right {
color: green;
}
.defau {
width: 200px;
height: 20px;
}
.de1 {
background-position: 0 -20px;
}
</style>
</head>
<body>
<div class="container" id="dv">
<label for="qq">Q Q</label><input type="text" id="qq"><span></span><br/>
<label>手机</label><input type="text" id="phone"><span></span><br/>
<label>邮箱</label><input type="text" id="e-mail"><span></span><br/>
<label>座机</label><input type="text" id="telephone"><span></span><br/>
<label>姓名</label><input type="text" id="fullName"><span></span><br/>
</div>
<script src="common.js"></script>
<script>
//qq的
checkInput(my$("qq"),/^\d{5,11}$/); ^$是代表严格模式
//手机
checkInput(my$("phone"),/^\d{11}$/);
//邮箱
checkInput(my$("e-mail"),/^[0-9a-zA-Z_.-]+[@][0-9a-zA-Z_.-]+([.][a-zA-Z]+){1,2}$/);
//座机号码
checkInput(my$("telephone"),/^\d{3,4}[-]\d{7,8}$/);
//中文名字
checkInput(my$("fullName"),/^[\u4e00-\u9fa5]{2,6}$/);
//给我文本框,给我这个文本框相应的正则表达式,我把结果显示出来
//通过正则表达式验证当前的文本框是否匹配并显示结果
function checkInput(input,reg) {
//文本框注册失去焦点的事件
input.onblur=function () {
if(reg.test(this.value)){
this.nextElementSibling.innerText="正确了";
this.nextElementSibling.style.color="green";
}else{
this.nextElementSibling.innerText="让你得瑟,错了吧";
this.nextElementSibling.style.color="red";
}
};
}
</script>
14正则表达式其他方法的使用
/正则表达式中:g 表示的是全局模式匹配
//正则表达式中:i 表示的是忽略大小写
//正则表达式中:$1表示的是选择的第一组
var str="中国移动:10086,中国联通:10010,中国电信:10000";
//把里面所有的数字全部显示出来
var array=str.match(/\d{5}/g);//match是匹配的意思
console.log(array); //10086,10010,10000如果没有加/g的话则是10086
var str = "123123@xx.com,fangfang@valuedopinions.cn 286669312@qq.com 2、emailenglish@emailenglish.englishtown.com 286669312@qq.com...";
var array = str.match(/\w+@\w+\.\w+(\.\w+)?/g);
console.log(array);
提取这里的日
var str="2017-11-12";
var array=str.match(/(\d{4})[-](\d{2})[-](\d{2})/g);
console.log(array);
正则表达式对象.$3代表选择第三组即第三个括号
console.log(RegExp.$3);//12
var email="fangyuan@126.cn";
email.match(/([0-9a-zA-Z_.-]+)[@]([0-9a-zA-Z_-]+)(([.][a-zA-Z]+){1,2})/);
console.log(RegExp.$1);// fangyuan
console.log(RegExp.$2);//126
console.log(RegExp.$3);//.cn
var str="小苏好帅哦,真的是太帅了,帅,就是真帅";
str=str.replace(/帅/g,"猥琐");所有的帅字换成猥琐
console.log(str);//如果不加/g则只有第一个帅被换成猥琐
var str=" 哦买噶的 ,太幸福了 ";
str=str.trim();代表仅仅把两端空格去掉了,但是中间的没有去掉
console.log("==="+str+"===");
var str = " 哦买噶的 ,太幸福了 ";
str = str.replace(/\s+/g, "");///s代表空表符,+代表多个的意思,/g代表全局
console.log("===" + str + "===");就会所有的空白符都去掉了
所有的h都替换成S(i代表忽略大小写)
var str="HhpphH";//SSppSS
str=str.replace(/[h]/gi,"S");
console.log(str);SSppSS如果是[h]/g则出现HSppSH
构造函数的方式 对象
var reg = new RegExp(/[h]/gi);
var str = "HhpphH";//SSppSS
str = str.replace(reg, "S");
console.log(str);
var str = "中国移动:10086,中国联通:10010,中国电信:10000";
//把里面所有的数字全部显示出来
var array = str.match(/\d{5}/g);
//正则表达式对象.exec方法传入字符串也就是说match方法和reg.exec方法是一样的
var reg=/\d{5}/g;
//var array=reg.exec(str);
console.log(array);
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));
此时运行结果是:
var str = "中国移动:10086,中国联通:10010,中国电信:10000";
var reg=/\d{5}/g;
var result=reg.exec(str);
while(result!=null){//如果不等于Null,则匹配出来了
console.log(result);
result=reg.exec(str);
}
结果是:
var str = "中国移动:10086,中国联通:10010,中国电信:10000";
var reg=/\d{5}/g;
//通过正则表达式匹配这个字符串
var array=reg.exec(str);
console.log(array);
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));//null应为检索到第四次的时候就没了
但是分析上面的依旧有汉字,下面想要把汉字去掉,则变成array【0】 ,代码如下:
var str = "中国移动:10086,中国联通:10010,中国电信:10000";
var reg=/\d{5}/g;
//通过正则表达式匹配这个字符串
var array=reg.exec(str);
while (array!=null){
//输出匹配的内容
console.log(array[0]);
array=reg.exec(str);
}
学习正则表达式目的是为了将来能看懂别人写的正则表达式和自己写出一些简单的式子。以后大多情况下都是百度搜自己能看懂
15数组和伪数组
//伪数组和数组的区别
//真数组的长度是可变的
//伪数组的长度不可变
//真数组可以使用数组中的方法
//伪数组不可以使用数组中的方法
数组
var arr=[10,20,30];
arr[3]=100;
console.log(arr.length);
//对象---假的数组(伪数组)
var obj={
0:10,
1:20,
2:30,
length:3
};