Una

接下来的日子,陆续把未总结的问题补充起来......

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、数组去重

   对数组的操作总结如下:

   对数组无非就是要对数组进行元素的遍历、增加、删除、修改、插入、排序、查找(通过下标获取指定元素),对数组进行拼接、截取。  

         遍历: 直接采用for循环遍历;

         添加元素: push(value,value...)(在数组末尾添加)、unshift(value,value...)(在数组前面添加)

                       (这两个方法都返回新数组);

         删除元素: pop()(删除数组最后一个元素)、shift(删除数组第一个元素),

                        splice(index,count)(从指定位置的数组元素开始删除,删除count个元素)

                       (这三个方法都返回的都是删除的元素);             

        修改数组中某个元素的值并在该元素位置插入值: splice(index,1,value,value...)

                                                                       (如果第二个参数为0,则直接插入值不删除指定位置的元素);

        排序: reverse()(数组逆序排序,调用方法数组即改变),sort([function])(可以定义一个比较规则的function作为参数);

        查找: indexOf(value,[index])(找指定元素的下标,第二个参数代表查找起点位置的索引),lastIndexOf()和indexOf()的

                  区别是lastIndexOf是从最后一个元素往前找;

        拼接: join([value]) (value为拼接的规则,例如join(" , "), 调用方法数组立即改变),

                 concat(value,value...)(value可以是字符串也可以是数组,原数组不会变,返回的值才是新数组);

        截取: slice(index1,index2)。

 

       对字符串的操作总结如下:

       对字符串进行拼接、裁剪、替换(同时可用于删除元素),获取指定字符串中元素的下标,获取字符串中某个位置的元素,

       大小写转换,去除字符串中的首尾空格(trim())。

       拼接: cancat(value,value...),返回的是一个副本,和数组中的cancat用法类似。

       裁剪: slice(index1,[index2]), substring(index1,[index2]), substr(index1,[index2])。

       替换: replace(value1,value2),value1可以是要匹配的值,可以是字符串也可以是正则,value2是要替换的新元素。

       获取指定元素下标: indexOf(value,[下标])从前往后搜索/lastIndexOf(value,[下标])从后往前搜索,和数组中的方法类似;

       获取指定下标的元素: charAt(index),chatCodeAt(index)(获取的字符编码)。

       大小写转换方法: toLocaleUpperCase()/toUpperCase()   toLocalLowerCase()/toLowerCase();

       注:字符串和数组中都有cancat、slice、indexOf/lastIndexOf。

 

   去重的方法有很多种,indexOf()方法存在浏览器兼容的问题,所以下面的去重并不是万能的方法。以下两种只针对数组中元素为数值的情况

/*
 * 对数组去重
 */
Array.prototype.uniquel1 = function () {
	var i = this.length;
	var arr = [];
	
	while(i--) {
		if(arr.indexOf(this[i]) === -1) {
			arr.push(this[i]);
		}
	}
	return arr.sort();
}
var arr2 = [1,2,3,2,4,7,9,4];
console.log(arr2.uniquel1());

 这里列举第二种写法:

Array.prototype.uniquel2 = function () {
	var n = {},
	    r = [];
	    
	for(var i = 0, len = this.length; i < len; i++) {
		if(!n[this[i]]) {
			n[this[i]] = true;
			r.push(this[i]);
		}
	}
	return r;
};

 补充:

  对象通过点属性名的方式访问对象中的属性值,属性名不能为数字,数字是不合法的,只能通过[]来访问。

  var obj = {"1":"a","2":"b"};
  console.log(obj[1]+" "+obj["1"]);// a a

  javascript中[]中的数字会被javascript引擎调用toString()方法转化成一个String类型的变量。

 

二、关于闭包

 JavaScript中的闭包:http://www.cnblogs.com/yy95/diary/2016/08/28/5811375.html

 学了的知识需要融会贯通,举一反三。

 总结: 当函数第一次被调用时,会创建一个执行环境(全局环境和局部环境)及相应的作用域链,并把作用域链赋值给一个内部属性[scope](其实就是一个指针

          指向的是一个作用域列表),当函数中创建了一个闭包,这个闭包的执行环境包括:匿名函数中包含的局部变量对象、全局变量对象,父环境中的变量对象。

          对于存在闭包的函数,当函数被返回之后,其执行环境的作用域链会立即被销毁,但是活动对象不会立即被销毁,因为匿名函数的执行环境的作用域链是不会

          在函数被返回之后立即被销毁的,所以匿名函数的作用域链会一直引用着外部函数的活动对象,直到我们手动解除对匿名函数的引用(将匿名函数的引用设置

          为null)。

         下面的函数,f1、f2分别引用着匿名函数,当第一次调用f1的时候i打印为0,此时f1中已经包含了外部函数中的变量对象i,因为没有手动对解除f1对匿名函数的引用,

         所以f1中一直包含着变量i,第二次调用f1时便在原有i的基础上加1.

    

function bibao() {
	
  var i = 0;
  return function () {
  	 console.log(i++);
  }
}

var f1 = bibao();
var f2 = bibao();
f1();
f1();
f2();
//结果为0 1 0

 

 三、文档流

    窗体自上而下被分成一行行,并在每行中至上而下,从左到右排放元素,即文档流。

 

四、给行级元素设置宽高的问题

   为何img、input等内联元素可以设置宽、高:http://blog.csdn.net/jlds123/article/details/8647448

   元素可分为替换元素和不可替换元素,或块级元素和行内元素(也叫内联元素)。

   块级元素例如: <div>、<p>、<li> 、<h1>到<h6>等

   行级元素例如: <img>、<input>、<textarea>、<a>、<span>、<strong>等

   块级元素都是不可替换元素,可以设置元素高、宽。

   行内元素包含不可替换元素和可替换元素,只有行内可替换元素才可以设置高、宽(替换元素有一个内在的尺寸),例如:<img>、<input>、<textarea>,

   <a>等不可替换元素不可以设置宽、高。

   对于让一个不可设置宽高的行内元素能够设置宽高,可以将其display属性设置成:block、inline-block、list-item等值,让元素成为一个块级元素。

   补充:

      按照w3c标准,行内元素中是不能嵌套块级元素的。

 

posted on 2016-12-01 22:37  youyi2016  阅读(432)  评论(0)    收藏  举报