事件:鼠标事件、键盘事件、系统事件、表单事件、自定义事件
函数可以理解为命令,做一些事情,如: function abc() { //肯定不会主动执行! … }
function(){} 匿名函数 元素.事件 = function(){}
字符串连接:加号
关于兼容:
for循环的使用场景:
for循环的执行顺序:1→234→234……
注意下面这样一个循环:
- for (var i=0; i<aLi.length; i++) {
- aLi[i].onclick = function(){
- alert(i);
- }
- }
以上代码会弹出一个3,而不是一次0、1、2;这里注意,如果在for循环里面包了一个函数,函数里面用了i,那么由于作用域的关系,i不会像你想象的那样逐次增加。
window是js中的"老大"
- function fn1(){
- alert(this);
- }
- fn1();
上述代码中执行函数fn1()相当于window.fn1();因此,在函数体内弹出这个this仍然是window。
- function fn1(){
- alert(this);
- }
- oBtn.onclick = fn1;
上述用按钮的点击事件调用的fn1函数,最终弹出来的是这个按钮,而不是window。
- function fn1(){
- alert(this);
- }
- oBtn.onclick = function(){
- alert(this)
- }
上述代码,点击按钮弹出的this仍然是oBtn这个按钮。
- function fn1(){
- alert(this);
- }
- oBtn.onclick = function(){
- fn1();
- }
上述代码,点击oBtn按钮,弹出的就不再是oBtn这个对象,而是window。
- <input id="btn2" type="button" value="按钮2" onclick="alert(this)" />
上述代码是行间事件,弹出的this就是这个按钮btn2。
- function fn1(){
- alert(this);
- }
- <input id="btn2" type="button" onclick="fn1();" value="按钮2” />
上述代码中,弹出的this就是window。
- function fn1(){
- this
- }
-
- fn1(); this => window
-
- oDiv.onclick = fn1; this => oDiv
-
- oDiv.onclick = function(){
- this => oDiv
- };
-
- oDiv.onclick = function(){
- fn1(); fn1()里面的this => window
- }
-
- <div onclick=" this "></div> this => div
-
- <div onclick = " fn1(); "></div> fn1()里面的this => window
- <script>
-
- fn1(this);
- function fn1(obj){
- obj => window
- }
-
- oDiv.onclick = function(){
- this
- fn1(this);
- };
- function fn1(obj){ obj => oDiv }
-
- </script>
- <input type="button" value="按钮1" />
- <input type="button" value="按钮2" />
- <input type="button" value="按钮3" />
-
- window.onload = function(){
- var aBtn = document.getElementsByTagName('input');
- for(var i=0; i<aBtn.length; i++) {
- aBtn[i].onclick = function(){
- this.style.background = 'yellow';
- }
- }
- }
上述代码的作用与下面这段代码的作用等价,注意that的使用方法。
- <input type="button" value="按钮1" />
- <input type="button" value="按钮2" />
- <input type="button" value="按钮3" />
-
- window.onload = function(){
- var aBtn = document.getElementsByTagName('input');
- var that = null;
-
- for(var i=0; i<aBtn.length; i++) {
- aBtn[i].onclick = function(){
- that = this;
- fn1();
- };
- }
- function fn1(){
- //this => window
- that.style.background = 'yellow';
- }
- }
上述代码还等价于下面这段代码:
- <input type="button" value="按钮1" />
- <input type="button" value="按钮2" />
- <input type="button" value="按钮3" />
-
- window.onload = function(){
- var aBtn = document.getElementsByTagName('input');
-
- for(var i=0; i<a.aBtn.length; i++) {
- aBtn[i].onclick = fn1; //注意不要在fn1后面加括号
- }
-
- function fn1(){
- this.style.background = 'yellow';
- }
- }
- window.onload = function(){
- var aBtn = document.getElementsByTagName('input');
-
- aBtn[0].abc = 123; //自定义属性
-
- // alert(aBtn[0].abc); 自定义属性的读
- // aBtn[0].abc = 456; 自定义属性的写
- }
JS可以为任何HTML元素添加任意个自定义属性
用自定义属性可以元素添加开关属性,作为控制开关。如下面这个例子:
- window.onload = function(){
- var aLi = document.getElementsByTagName('li');
- // var onOff = true; 一个onOff只能控制一个开关。要为多个元素设置各自的开关,就要给每个元素加个onOff开关。
-
- for(var i=0; i<aLi.length; i++) {
- aLi[i].onOff = true;
- aLi[i].onclick = function(){
- if (this.onOff){
- this.style.background = 'url(img/active.png)';
- this.onOff = false;
- } else {
- this.style.background = 'url(img/normal.png)';
- this.onOff = true;
- }
- }
- }
- }
在网页上设置三个按钮,默认值为0,每点击一次按钮,字母依次ABCD轮换。
- <input type="button" value="0" />
- <input type="button" value="0" />
- <input type="button" value="0" />
- var aBtn = document.getElementsByTagName('input');
- var arr = ['A', 'B', 'C', 'D'];
-
- for(var i=0; i<aBtn.length; i++){
- aBtn[i].num = 0;
- aBtn[i].onclick = function(){
- this.value = arr[this.num]
- this.num++;
- if(this.num === arr.length){
- this.num = 0;
- };
- };
- };
把三个按钮的value与数组里面的值依次进行匹配。
- <input type="button" value="btn1" />
- <input type="button" value="btn2" />
- <input type="button" value="btn3" />
- window.onload = function(){
- var aBtn = document.getElementsByTagName('input');
- var arr = ['莫涛','张森','杜鹏'];
-
- for(var i=0; i<aBtn.length; i++){
- aBtn[i].index = i; //自定义属性index,添加索引值
- aBtn[i].onclick = function(){
- //alert(i); //不会弹出1、2,直接弹出3,也就是aBtn的长度。也就是说,在基础阶段,在for循环所包的函数里面再用i是不靠谱的。
- this.value = arr[this.index];
- };
- };
- }
上面是通过索引值匹配数组值,匹配HTML中的元素也是同理。 想建立"匹配"、"对应"关系,就用索引值。
ECMAScript:标准、核心
typeof用来判断数据类型。 字符串方法charAt():通过字符串的下标获取子字符串。 对象可以添加自定义属性。如果把函数扔给了对象,就给该对象添加了一个方法。
把字符串转成数字的方法:
- var a = '100';
- alert(a + 100); //'100100'
-
- var b = '00100';
- alert(Number(b)); //100
-
- var c = '+100';
- alert(Number(c)); //100
-
- var d = '';
- alert(Number(d)); //0
-
- var e = ' ';
- alert(Number(e)); //0
-
- var f = true;
- alert(Number(f)); //1
-
- var g = false;
- alert(Number(g)); //0
-
- var i = [];
- alert(Number(i)); //0 空数组用Number转出来是0
-
- var j = [''];
- alert(Number(j)); //0
-
- var k = [123];
- alert(Number(k)); //123
-
- var l = ['123'];
- alert(Number(l)); //123
-
- var o = null;
- alert(Number(o)); //0
-
- ----------------------------
- var m = [1,2,3];
- alert(Number(m)); //NaN
-
- var json = {abc:123};
- alert(Number(json)); //NaN
-
- var json2 = {};
- alert(Number(json2)); //NaN 即使是空json,Number方法也转不了
-
- var h = function(){};
- alert(Number(h)); //NaN
-
- var p;
- alert(Number(p)); //undefined
-
- var q = '100px';
- alert(Number(q)); // NaN
- var a = '100px';
- alert(parseInt(a)); //100
-
- var b = '100px123456789';
- alert(parseInt(b)); //100
-
- var d = '-100px';
- alert(parseInt(d)); //-100 parseInt还是认加减号的
-
- var e = ' 100px';
- alert(parseInt(e)); //100 parseInt也是认空格的
-
- var f = '000000100px';
- alert(parseInt(f)); //100
-
- var g = '12.34元';
- alert(parseInt(g)); //12 parseInt只能转出整数
- ------------------------------
- var c = true;
- alert(parseInt(c)); //NaN
-
- //parseInt也不能用于转函数等
-
parseInt()方法还有一个参数,就是按照几进制来转,比如parseInt(a, 10);表示按照十进制来转;parseInt(b, 2);表示按照二进制来转。
- var a = '12.34元';
- alert(parseFloat(a)); //12.34
-
- var b = '12.3.4元';
- alert(parseFloat(b)); //12.3 parseFloat只认第一个小数点
parseInt和parseFloat的配合使用,可以来判断某个值是整数还是小数,如下:
- var num = '200.345';
- if(parseInt(num) == parseFloat(num)) {
- alert(num + '是整数');
- } else {
- alert(num + '是小数');
- }
显式类型转换(强制类型转换):
隐式类型转换:
- alert('200' - 3); //197
- alert(200 + '3'); //2003
-
- var a = '10';
- a++;
- alert(a); //11
-
- alert('10'>9); //true
- alert('1000000'>'9'); //false
- //注意:数字的比较和字符串的比较不同;字符串的比较是一位一位的比较。
-
- alert(!'ok'); //false
- alert(!100); //false
-
- alert('2' == 2); //true
- alert('2' === 2); //false 三个等号不仅判断值,还会先判断两者的类型
隐式类型转换转不出来,也会返回一个NaN,例如:alert('……' - 9);就会弹出NaN。
NaN: (not a number)。Nan是个不是数字的数字类型。所有的数字都是数字类型,但不是所有的数字类型都是数字。
- var a = Number('abc');
- //alert(a); //NaN
- //alert(typeof(a)); //number
-
- if(a) { //会弹出‘假’,说明NaN是false
- alert('真');
- } else {
- alert('假');
- }
-
- //alert(a === a); //false NaN比较,比出false
isNaN:is not a Number 是不是不是个数字(不是数字)。 isNaN();是个方法,用来干活的。
isNaN的判断过程,将括号里面的东西扔给Number,Number转出来数字,就返回false;转不出来就返回true。
- alert(isNaN('250'));
- //Number() '250' => 250 => false
-
- alert(isNaN(true));
- //Number() true => 1 => false
-
- alert(isNaN([]));
- //Number() [] => 0 => false
下面是一个isNaN的小应用:
- <input type="text" />
- <input type="button" value="判断输入值是不是数字" />
- window.onload = function(){
- var aInp = document.getElementsByTagName('input');
- var str = '';
-
- aInp[1].onclick = function(){
- str = aInp[0].value
- //alert(type of str); //总是返回string 从HTML中拿到的内容,类型都是字符串
-
- if(isNaN(str)){
- alert(str + '不是数字');
- } else {
- alert(str + '是数字');
- }
- }
- }
参数 = JS的数据类型:
- fn1(100);
- fn1('miaov');
- fn1(function(){alert(1);});
-
- function fn1(a){
- if(typeof a === 'number' && a === a) {
- alert(a+20);
- } else if (typeof a === 'string'){
- alert(a.charAt(2));
- } else if (typeof a === 'function'){
- a();
- }
- }
什么是作用域
"JS解析器":浏览器中专门用来读JS的程序。它至少做下面两件事(当然还有其他事情):
- alert(a); //未定义
- var a=1; //在库里面a的值由未定义换成1
- function fn1(){alert(2);}
- alert(a); //弹出:function a(){alert(4);}
- var a=1; //预解析中的a改为了1
- alert(a); //弹出1
- function a(){alert(2);}//函数声明,没有改变a的值。什么也没发生。
- alert(a); //继续弹出1,因为a在预处理库里面的值没有被改过。
- var a=3; //预处理中a的值变为3
- alert(a); //弹出3
- function a(){alert(4);} //函数声明,什么也没有发生
- alert(a); //继续弹出3
- a(); //报错 a is not a function
以上代码在预解析中的过程如下: 1)预解析: var function 参数 …… 读到 var a = 1 => a 未定义 读到 function a(){alert(2);} => a = functiona(){alert(2);} 变量与函数重名了,就只留下函数: a = function(){alert(2);} 读到 var a = 3 => a 未定义,这里与上面名为a的函数重名了,所以还是保留a = function(){alert(2);} 读到function a(){alert(4);} => a = function a(){alert(4);} 与前面的 a = function(){alert(2);}重名,根据上下文,后面的函数覆盖了前面的函数,所以预解析就只留下了 a = function(){alert(4);} 2)逐行解读代码 读到表达式,表达式可以修改预解析的值。参数也可以改变预解析的值。 遇到函数调用,又要做两件事:预解析、逐行解析代码 函数声明,不是表达式,不改变预解析里面的值。
作用域链:从子级作用域跳到父级作用域的过程
- <script>
- alert(a); //报错:a is not defined。因为在预解析里面压根就没有a这个东西
- </script>
-
- ...
-
- <script>
- var a = 1;
- </script>
- <script>
- alert(a); //不报错,会弹出undefined。因为预解析里面有a这个东西,但是由于执行的时候,还没有改变a的值,因此a的值为undefined
- var a = 1;
- </script>
-
- ...
-
- <script>
- </script>
- <script>
- var a = 1; //预解析里面存了a,并且a的值存为1
- </script>
-
- ...
-
- <script>
- alert(a); //弹出1
- </script>
- var a = 1; //预处理中的全局变量a的值改为1
- function fn1(){
- alert(a);
- var a = 2;
- } //函数声明,什么也不做
- fn1(); //遇到函数调用,开始进行预解析和逐行解读代码。在函数内,先预解析出一个局部的 a 是未定义(局部的a与全局的a一点关系都没有);然后读代码,alert(a)弹出的是undefined;然后继续执行,遇到表达式,将局部的变量a的值改为2。这时fn1的函数执行已经完成了。
- alert(a); //弹出全局变量a为1
以上代码在js解析器中的模拟如下: 1)预解析 var function 参数…… a = … fn1 = function fn1(){ alert(a); var a=2; } 2) 逐行解析代码 另外一段代码:
- var a = 1; //预处理中的全局变量a的值改为1
- function fn1(){
- alert(a);
- a = 2;
- } //函数声明,什么也不做
- fn1(); //遇到函数调用,开始进行预解析和逐行解读代码。在函数内,没有任何函数和变量声明,因此预解析里面没东西;然后读代码,alert(a),在局部没有找到预解析的a,于是从子级作用域跳到父级作用域去找,找到了全局的a,所以弹出的是全局变量a的值1;然后继续执行,遇到表达式,将全局变量a的值改为2。这时fn1的函数执行已经完成了。
- alert(a); //弹出全局变量a为2
- var a = 1; //预处理中的全局变量a的值改为1
- function fn1(a){ //参数本质上就是一个局部变量
- alert(a);
- a = 2;
- } //函数声明,什么也不做
- fn1(); //遇到函数调用,开始进行预解析和逐行解读代码。在函数内,找到参数a,因此预处理里面有个局部的a是未定义。;然后读代码,alert(a),弹出的是局部的a为undefined;然后继续执行,遇到表达式,将局部变量a的值改为2。这时fn1的函数执行已经完成了。
- alert(a); //弹出全局变量a为1
- var a = 1; //预处理中的全局变量a的值改为1
- function fn1(a){ //参数本质上就是一个局部变量
- alert(a);
- a = 2;
- } //函数声明,什么也不做
- fn1(a); //遇到函数调用,开始进行预解析和逐行解读代码。在函数内,找到局部参数a,因此预处理里面有个局部的a是未定义。;然后读代码,读到第一行function fn1(a),这时有参数进来,把全局的a的值1赋给了局部变量a,这时局部变量a的值变为1,alert(a),弹出的是局部的a为1;然后继续执行,遇到表达式,将局部变量a的值改为2。这时fn1的函数执行已经完成了。
- alert(a); //弹出全局变量a为1
- var str = '';
- function fn1(){
- var a = '大鸡腿~';
- str = a;
- }
- fn1();
- function fn2(){
- var a = '99999999克拉钻石';
- fn3(a);
- }
- fn2();
- function fn3(a){ //注意这个a是fn3里面的,与fn2里面的a毫无关系
- alert(a);
- }
注意事项函数的大括号是作用域;if(){}不是作用域;for(){}也不是作用域。只有作用域是先预解析、再执行。if和for的大括号没有预解析过程。
- alert(a); //弹出undefined。这说明if大括号中的a已经在全局就被预解析了,因此if的大括号并不是作用域
- if(true){
- var a=1;
- }
但是,需要注意:
- alert(fn1); //在火狐浏览器里面会报错说fn1 is not defined。但是在chrome浏览器里可以正常弹出fun1函数。
-
- if(true){
- var a = 1;
- function fn1(){
- alert(123);
- }
- }
只有火狐浏览器预解析时,不能对if或for的括号里括起来的函数进行预解析。因此存在兼容性问题。因此,如果想要定义全局函数或全局变量,尽量不要放到if和for的大括号里面,放到大括号外面。
- for(var i=0; i<aBtn.length; i++){
- aBtn[i].onclick = function(){
- alert(i); //弹出3。因为必须for循环全部执行完成之后,aBtn才能够点击。但是for循环执行完了,外面的i已经变成3;但是在function里面又没有i,自然找到了外面的i,也就是3.
- }
- }
- for(var i=0; i<aBtn.length; i++){
- aBtn[i].onclick = function(){
- alert(i); //这时候弹出的就不是3了,是undefined
-
- for(var i=0; i<aBtn.legnth; i++){
- aBtn[i].style.background = 'yellow';
- }
- }
- }
- for(var i=0; i<aBtn.length; i++){
- aBtn[i].onclick = function(){
- alert(i); //下面for循环的括号中的var删去了,function里面又找不到i了,所以到父级找到了i,又是个3。因此,此处会弹出3。
-
- for (i = 0; i<aBtn.length; i++){
- aBtn[i].style.background = 'yellow';
- }
- }
- }
- alert fn1();
- function fn1(){
- return function(){
- alert(1);
- }
- }
此时弹出的是:function(){alert(1);}
- alert fn1()();
- function fn1(){
- return function(){
- alert(1);
- }
- }
此时弹出的是1,也就是return的匿名函数执行的结果。
- alert fn1()(10);
- function fn1(){
- return function(a){
- alert(a);
- }
- }
此时弹出的是10。
- alert fn1(20)(10);
- function fn1(a){
- return function(b){
- alert(a + b);
- }
- }
此时弹出的是30。
fn1(1, 2, 3); //实参——实际传递的参数 function fn1(a, b, c) //形参——形式上,a、b、c这些名代表1、2、3 如果不写形参,1、2、3也能够传进来,都存在arguments的肚子里。 function fn1(){ //arguments => [1, 2, 3] —— 实参的集合(不是数组,但是类似数组,有length,也可以用下标找到其中的数据) } 当函数参数个数无法确定的时候,用arguments:
- alert(sum(1,2,3));
- function sum(){
- var n=0;
- for(var i=0; i<arguments.length; i++){
- n += arguments[i];
- }
- return n;
- }
- var a=1;
- function fn2(a){ //arguments的某个数值就相当于某个形参
- arguments[0]=3;
- alert(a); //弹出3
- var a=2;
- alert(arguments[0]); //弹出2
- }
- fn2(a);
- alert(a); //弹出1
属性判断法、版本检测法来解决浏览器间的兼容性问题 ~~~ js function getStyle( obj, attr) { return obj.currentStyle ? obj.currentStyle[attr]:getComputedStyle( obj )[attr]; } ~~~注意事项:
setInterval(函数, 毫秒); 重复执行(发动机)
- var i=0;
- function fn1(){
- document.title = i;
- i++;
- }
- setInterval(fn1, 1000);
事件调用的方法
clearInterval
- var timer = setInterval(函数, 毫秒); //重复执行
- clearInterval(timer); //清除定时器
- var i=0,
- timer = null;
- function fn1(){
- i++;
- document.title = i;
-
- if(i===10){
- clearInterval(timer);
- }
- }
- timer = setInterval(fn1, 1000);
注意定时器如果是由事件控制的,比如按钮的onclick控制的,那么一定要遵循一个原则,先关后开。这样可以避免连续点击多次按钮,重复设置定时器。另外,clearInterval()不论里面填的是一个timer,还是null还是未定义,都可以顺利运行。
var timer = setTimeout(函数, 毫秒); 执行一次(炸弹) clearTimeout(timer);
- <input id="btn1" type="button" value="走" />
- <div id="div1"></div>
- var oBtn1 = document.getElementById('btn1');
- var oDiv = document.getElementById('div1');
-
- oBtn1.onclick = function () {
-
- doMove ( oDiv, 'left', 12, 900, function () {
- doMove ( oDiv, 'top', 34, 500 );
- });
-
- };
-
- //doMove函数封装
-
- function doMove ( obj, attr, dir, target, endFn ) {
-
- dir = parseInt(getStyle( obj, attr )) < target ? dir : -dir;
-
- clearInterval( obj.timer );
-
- obj.timer = setInterval(function () {
-
- var speed = parseInt(getStyle( obj, attr )) + dir; // 步长
-
- if ( speed > target && dir > 0 || speed < target && dir < 0 ) {
- speed = target;
- }
-
- obj.style[attr] = speed + 'px';
-
- if ( speed == target ) {
- clearInterval( obj.timer );
-
- /*
- if ( endFn ) {
- endFn();
- }
- */
- endFn && endFn();
- }
-
- }, 30);
- }
-
- function getStyle ( obj, attr ) {
- return obj.currentStyle?obj.currentStyle[attr] : getComputedStyle( obj )[attr];
- }
- <img decoding="async" id="img1" src="img/4.jpg" />
- <img decoding="async" id="img2" src="img/5.jpg" />
- window.onload = function () {
- var oImg1 = document.getElementById('img1');
- var oImg2 = document.getElementById('img2');
-
- oImg1.onclick = fnShake;
- oImg2.onclick = fnShake;
-
- function fnShake() {
- var _this = this;
- shake( _this, 'left', function(){
- shake( _this, 'top' );
- });
- }
-
- };
-
- function shake ( obj, attr, endFn ) {
- var pos = parseInt( getStyle(obj, attr) ); //有隐患 需要解决
- var arr = []; // 20, -20, 18, -18 ..... 0
- var num = 0;
- var timer = null;
-
- for ( var i=20; i>0; i-=2 ) {
- arr.push( i, -i );
- }
- arr.push(0);
-
- clearInterval( obj.shake );
- obj.shake = setInterval(function (){
- obj.style[attr] = pos + arr[num] + 'px';
- num++;
- if ( num === arr.length ) {
- clearInterval( obj.shake );
- endFn && endFn();
- }
- }, 50);
- }
new Date(); //当前 系统的时间 对象
- var myTime = new Date(); //myTime的类型是object
- var iYear = myTime.getFullYear(); //获得年份
相关方法(以下得到的均为数字类型):
注意事项:
- var iNow = new Date();
- var iNew = new Date(2014, 10, 26, 21, 56, 0);
- var t = Math.floor((iNew - iNow)/1000);
- var str = Math.floor(t/86400) + '天' + Math.floor(t%86400/3600) + '时' + Math.floor(t%86400%3600/60) + '分' + t%60 + '秒';
- var iNow = new Date();
- var iNew = new Date('November 10, 2013 21:56:0');
- var t = Math.floor((iNew - iNow)/1000);
- var str = Math.floor(t/86400) + '天' + Math.floor(t%86400/3600) + '时' + Math.floor(t%86400%3600/60) + '分' + t%60 + '秒';
getTime(); 返回从1970年1月1日0点0分0秒0毫秒到现在的毫秒数
- alert(detectNum(' 1a23d456'));
- function detectNum(str){
- var n = 0;
- for(var i=0; i<str.length; i++){
- n = str.charAt(i);
- if( n < 48 || n > 57 ) {
- return false;
- }
- }
- return true;
- }
- var str = '菜鸟教程 - 学的不仅是技术,更是梦想!';
- var s = '菜鸟教程';
- var i = 0;
-
- for ( ; str.indexOf(s, i) != -1; ){
- alert(str.indexOf(s, i));
- i = str.indexOf(s, i) + s.length;
- }
-
- 或
-
- while(str.indexOf(s, i) != -1) {
- alert(str.indexOf(s, i));
- i = str.indexOf(s, i) + s.length;
- }
- var str = '菜鸟教程-www.cdsy.xyz';
-
- str.charAt(1); // 3
- str.charCodeAt(1); // 51
- String.fromCharCode(119, 51); // w3
-
- str.indexOf('c', 3); // 4
- str.lastIndexOf('o'); // 25
-
- '1000' < '2' // true
- '1000' > 2 // true
-
- str.substring(0, 4); // 菜鸟教程
- str.slice(-3); // .cc
-
- str.toUpperCase(); // 菜鸟教程-WWW.RUNOOB.COM
- str.toLowerCase(); // 菜鸟教程-www.cdsy.xyz
-
- str.split('.', 2); // ["菜鸟教程-www", "runoob"]
-
- var arr = ['www', 'runoob', 'com'];
- arr.join('.'); // www.cdsy.xyz
- var json = { name: 'leo', age: 32};
- alert(json.name);
-
- var imgData = {
- url: ['img/1.png', 'img/2.png'],
- text: ['图片一', '图片二']
- };
- alert(imgData.url[1]);
-
- var json2 = { 'name': 'miaov' }; //推荐的安全格式的写法
- alert(json2.name);
- alert(json2['name']);
- json2.name = 'abc';
- json2['name'] = '妙味'; //注意中括号里面要用引号
-
- var arr = [{'name': 'TM', 'age': 23}, {'name': 'leo', 'age': 32}];
- alert(arr[0].name);
- var json4 = { 'name': 'miaov', 'age': 3, 'fun': '前端开发'};
- for(var attr in json4){
- alert(attr);
- alert(json4[attr]);
- }
-
- var json5 = {
- url: ['img/1.png', 'img/2.png'],
- text: ['图片一', '图片二']
- };
-
- for(var attr in json5) {
- for(var i=0; i<json5[attr].length; i++){
- alert(json5[attr][i]);
- }
- }
for-in也可以遍历对象属性:
- var str = '';
- var num = 0;
- for(var attr in window){
- str += num + '. ' + attr + ' : ' + window[attr] + '<br/>';
- num ++;
- }
- document.body.innerHTML = str;
数组也可以用for-in来遍历:
- var arr = ['a', 'b', 'c'];
- for(var i in arr){
- alert(arr[i]);
- }
- // var arr = [1, 2, 3];
- // var arr = new Array(1, 2, 3);
-
- var arr = new Array(4);
- alert(arr.length); // 4 在new Array()里面写了一个数字,就是定义了arr的长度
- var arr = [1, 2, 3];
- arr.length = 1; //数组的length属性是可写的
- alert(arr);
- var arr = [1, 2, 3];
- arr.length = 0; //快速清空数组arr
- 或
- arr = []; //通过重新赋值来清空数组,效率更高
- var str = 'aaaaa';
- str.length = 1;
- alert(str); // 'aaaaa'
- //字符串的length属性不可写,但是数组的length属性可写
添加
删除
小技巧
- var arr = ['TM', '钟毅', '张森', '杜鹏', 'Leo'];
- arr.unshift(arr.pop()); //数组变为:['Leo', '钟毅', '张森', '杜鹏', 'TM']
- 或
- arr.push(arr.shift()); //数组变为:['钟毅', '张森', '杜鹏', 'Leo', 'TM']
splice方法
- var arr = ['TM', '钟毅', '张森', '杜鹏', 'Leo'];
- //删除
- //arr.splice(0, 1); //删掉第0位,删1个。两个参数第一个是从第几位开始,第二个是删掉几个。splice删除的时候有返回值,返回的是被删除的内容
- //替换
- //arr.splice(0, 1, '莫涛'); //替换第0位,替换1个,替换为'莫涛'。返回的还是删除的东西
- //添加
- arr.splice(1, 0, '李贤'); //在第1位那里,删除0个,添加了一个'李贤'到了第1位,'钟毅'就变成了arr[2]了。后面也可以添加多个。如果splice删除了0个,那么就没有返回值。
- var arr = [1, 2, 2, 4, 2];
- for ( var i=0; i<arr.length; i++ ) {
- for ( var j = i+1; j<arr.length; j++) {
- if( arr[i]==arr[j] ){
- arr.splice( j, 1 );
- j--;
- }
- }
- }
sort排序
- var arr = ['c', 'd', 'a', 'e'];
- arr.sort(); // 'a', 'c', 'd', 'e' 按照unicode编码排序
-
- var arr2 = [4, 3, 5, 76, 2, 0, 8];
- // arr2.sort(); // 0, 2, 3, 4, 5, 76, 8 sort默认是将数组中的每一个按照字符串来排序的,因此出现了76排在8前面的情况
-
- // arr2. sort(function( a, b ){
- return a - b; //如果a-b返回正数,就a、b两个数字换个序。如果a-b是负数,就不换序
- }) //返回数字从小到大 0, 2, 3, 4, 5, 8, 76
-
- // arr2. sort(function( a, b ){
- return b - a;
- }) //返回数字从大到小 76,, 8, 5, 4, 3, 2, 0
其他排序方法:
- var arrWidth = ['345px', '23px', '10px', '1000px'];
- arrWidth.sort(function(a, b){
- return parseInt(a) - parseInt(b);
- }); // ['10px', '23px', '345px', '1000px']
随机排序
- var arr = [1, 2, 3, 4, 5, 6, 7, 8];
- arr.sort(function(a, b){
- return Math.random(); - 0.5;
- });
Math.random(); 返回0~1之间随机的一个数 如果想要随机返回0和1之间的一个整数,可以用四舍五入的方法: Math.round(Math.random()); //注意,这里不能用Math.floor 如果想要返回0~10之间的一个随机数: Math.round(Math.random() * 10); //返回0~10之间的随机整数 返回从20~100之间的一个随机数: Math.round( Math.random()*80 + 20 ); //返回5~10之间的随机整数 如果想要返回一个x到y之间的整数,可以写成: Math.round( Math.random() * (y - x) + x ); 返回0~x的整数,可以写成 Math.round( Math.random() * x ); 返回1~x的整数,可以写成 Math.ceil( Math.random() * x ); //Math.ceil()是向上取整concat方法concat方法用于连接数组。
- var arr1 = [1, 2, 3];
- var arr2 = [4, 5, 6];
- var arr3 = [7, 8, 9];
-
- arr1.concat(arr2); //[1, 2, 3, 4, 5, 6] 新数组与原来数组没什么关系。
- arr1.concat(arr2, arr3); //[1, 2, 3, 4, 5, 6, 7, 8, 9]
reverse方法reverse方法是颠倒数组中的位置,会改变原数组
- var arr1 = [1, 2, 3];
- arr1.reverse();
- alert(arr1); // [3, 2, 1]
- var str = 'abcdef';
- alert(str.split('').reverse().join('')); //'fedcba'
更多教程可以访问我们的:JavaScript 教程。