1.等于与不全等的区别
1.1、等于(==):比较两个值是否相等,如果两个值类型不一致,会做强制转换;
1.2、全等(===):比较两个值是否相等,但是不会对值得类型做转换。
55 == "55" //返回true,字符串“55”会被转换成数值55;
55 === "55" //返回false,不会做类型转换;
建议:不等于、不全等情况类似。等于、不等于会涉及到数据类型转换,会破坏数据类型的完整性,建议使用全等、不全等。
2、利用逻辑或来给变量复制
给变量复制的时候,通常为避免给变量赋值为null或undefined,通常这样做
var a = b || c;
逻辑或操作有如下定义:当两个操作数都不是布尔值时,如果第一个操作数是对象,则返回第一个值,如果第一个操作数求值结果返回false,则返回第二个操作数;则返回undefined。如果b为null或者undefined时,转换成Boolean值后为false,此时输出c,如果c 也是undefined或者null,则输出对应的值。
3、js 没有代码块作用域的概念
如下代码:输出结果为10,因为js没有代码块作用域的概念,所以i 不管定义在if块里还是for块里,代码块外都能访问。
if(true){ for (var i = 0; i < 10; i++) { //doSomeThing } } alert(i) //10<span style="font-size:14px;"> </span>
4、数组比较函数sort()
数组自带的sort方法,会按升序排列数组元素大小,但是经常会出现排列结果与预想的不一致。例如
var arr = [0 ,1 ,5, 10 ,15 ]
调用sort方法之后,返回的排序结果是:0, 1, 10, 15, 5 ,显然这个与我们预期的不一致。这是因为,sort方法在排序时,会调用每个数组项的toString()方法,然后比较对应的字符串。虽然数值5在数值10前边,但是转换成字符串之后,“10”则位于“5”前边(注:如果两个字符串进行对比,则比较两个字符串对应的字符的编码值)。解决方案:sort()可以接受一个比较函数作为参数,该函数的第一个的参数如果位于第二个参数之后则返回1,相等的话返货0,小于的话返回-1。
function compare(value1,value2){ if(value1 < value2){ return -1; } else if (value1 > value2 ){ return 1; } else { return 0; } }
重新调用sort()方法:
arr.sort(compare); alert(arr) ; // 0,1,5,10,15
当然,也可以实现降序排列,只要讲compare函数中的逻辑变为相反; 对于数值型数值,也可以简单写成如下方式:
function compare(value1,value2){ return value1- value2 ; // 降序 return value2- value1 ; }
注:这里的compare函数会返回 -1, 0,1 ,确定排序策略 ,这些值传入到sort方法内部,由sort根据排序策略确定如何排序。
5,数组实现队列、栈、反队列的
判断某一个对象是不是数组常用的方法是:
if(a instanceof Array) { // doSomeThing }
数组模拟队列、栈的执行过程,用到以下四种方法,其中:
队列:队列的数据结构访问顺序是先进先出(FIFO),可以类比于火车过隧道;
栈
:栈的数据结构访问顺序是先进后出,或者说后进先出,可以类比于子弹夹装弹。
对应的数组有四个方法:
push
:向数组尾部添加元素,并返回数组长度;
pop:从数组尾部删除元素,并减少数组长度,返回删除的元素;
shift:从数组首部删除元素,并减少数组长度,返回被删除的元素;
unshift:向数组首部添加元素,并返回最新的长度。
//利用push和pop方法,可以实现类似栈的行为: var colors = [red,blue,green]; var length = colors.push("black"); //4 var item = colors.pop(); alert(item); //black //利用shift,push可以是模拟队列的行为: var colors = [red,blue,green]; var length = colors.push("black"); //4 var item = colors.shift(); alert(item); //red //利用unshift,pop可以模拟相反方向的队列; var colors = [red,blue,green]; var length = colors.unshfit("black"); //4 var item = colors.pop(); alert(item); //green
6,数组的迭代算法
迭代算法
every():对数组中的每一项运行给定函数 ,如果数组中的每一项运行结果都是true,则返回true;
some():对数组中每一项运行给定函数 ,只要有一项运行结果为true,则返回true;
filter():过滤函数,对数组中的每一项执行给定函数,返回执行true的元素,重新组成新的数组;
map();对数组中的每一项执行给定函数,返回执行结果组成的数组;
forEach();对数组中的每一项执行给定函数,么有返回值;
var arr = [1,2,3,4,6,5,8,9]; var everyResult = arr.every(function(item, index ,array ){ return item > 2; }); // everyResult = false var someResult = arr.some(function(item, index ,array ){ return item > 2; }); // everyResult = true var filterResult = arr.filter(function(item, index ,array ){ return item > 2; }); // filterResult = [3,4,6,5,8,9 ] var mapResult = arr.map(function(item, index ,array ){ return item * 2; }); // mapResult = [2,4,6,8,12,10,16,18 ] arr.forEach (function(item, index ,array ){ // dosomething ,么有返回值 });
注:这里应该还有jquery的each方法也是数组的常用方法。
7、js 的函数function
在js中函数其实是对象,每个函数其实是Function的实例。因此函数名可以理解为指向函数的对象。函数定义常用的有两种,
//方法一 function sum (a, b){ return a + b; } //方法二 var sum = function (a, b){ return a + b; }
两种方式定义,第一种称为函数声明,第二种称为函数表达式,二者的区别:js引擎在执行代码是,会首先读取函数声明,并将它添加到执行环境中,使其在任何地方都可以使用;而函数表达式只有在程序运行在所在的代码行时,才会被真正的运行。如下所示;
sum(10,20) function sum (a, b){ return a + b; }<span style="font-size:14px;"> </span>
可以运行,结果为30;
<span style="font-size:12px;">sum(10,20); var sum = function (a, b){ return a + b; }</span>
程序会报错,这是因为在执行到函数所在的语句之前,sum不会保存任何对函数的引用,在执行第一句时会报错 “ sum is not a function”