今天又从尘封的电脑角落文件夹看到了曾经写的长长的JavaScript学习笔记,用的word记录的,然而当自己上手框架后就没再更新过,也没再翻过。果然还是写博客靠谱,想不起来了就到博客看看。今天整理文件夹发现,先把资料mark在博客上,包含JavaScript的基础和相关的坑,还有当时刷的fcc的题目答案,立个flag,等忙完了,再分类整理:
Sort()方法排序,没有调用参数的情况下,会调用每个数组项的toString()转型方法,然后比较得到的字符串,以确定排序,默认从小到大;如果比较数值大小,则可接收一个比较函数作为参数:比较函数应该具有两个参数 a 和 b,其返回值如下:
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。
function sortNumber(a, b){
return a - b; //这里返回的是他们的差值,如果是小于0的值,就会将a排在前面,如果大于0,就会将b排在前面,如果是0的话,就随便。(冒泡排序法!!)
}
15.操作方法:(1)、concat()方法会先创建当前数组的一个副本,然后将接收到的参数添加到副本的末尾,最后返回新构建的数组。在没有给concat()方法传递参数的情况下,它复制当前数组并返回副本,如果传递的是一个或多个数组则该方法会将这些数组每一项都添加到结果数组中,如果传递的是值,这些值就会简单添加到数组中
(2)slice()能够基于当前数组项中的一个或多个项创建一个新数组。若接收一个参数,则slice()方法返回从参数指定位置开始到当前数组末尾的所有项;如果有两个参数,则该方法返回起始和结束位置之间的项(但是不包括结束位置的项)。PS:如果slice()方法的参数中有一个负数,则用数组长度加上该数来确定相应的位置:slice(-2,-1)与slice(3,4)得到的结果相同——数组长度为5。
(3)、splice()的主要用途是向数组的中部插入项:a、删除:可以删除任意数量的项,需提供三个参数——要删除的第一项的位置、要删除的项数
B、插入——提供三个参数:起始位置,0(要删除的项数)和要插入的项
C、替换——向指定位置插入任意数量的项,三个参数——起始位置、要删除的项数和要插入的任意数量的项。删除和插入的项数不一定要相等。
Splice()方法返回一个数组,该数组包含从原数组中删除的项,没删除则返回一个空数组
(2)filter():对数组中的每一项运行给定的函数,返回该函数会返回true的项组成的数组
(3)forEach():对数组中的每一项运行给定的函数,没有返回值
(4)map():对数组中的每一项运行给定的函数,返回每次函数调用的结果组成的数组
(5)some():对数组每一项运行给定的函数,如果该函数对其中至少一项返回true,则返回true。
17.归并方法——数组元素求和:reduce()方法和reduceRight()方法。
reduce()方法从数组第一项遍历到最后,而reduceRight()方法则从最后一项向前遍历。两种方法的函数接收四个参数:前一个值、当前值、项的索引和数组对象。可以实现对数组元素求和,以下对【1,2,3,4,5】求和
preValue curValue index array 返回值
第一次回调 5 0 0 [0,1,2,3,4] 5
第二次回调 5 1 1 [0,1,2,3,4] 6
第三次回调 6 2 2 [0,1,2,3,4] 8
第四次回调 8 3 3 [0,1,2,3,4] 11
第五次回调 11 4 4 [0,1,2,3,4] 15
18继承的方法:Date类型的toLocaleString()方法会按照与浏览器设置的的地区相适应的格式返回日期和时间;toString()方法通常返回带有时区信息的日期与时间。Date类型的valueof()方法不返回字符串,而是返回日期的毫秒值,可以用比较操作符来比较日期值。
19.ReExp类型——支持正则表达式;正则表达式的匹配模式支持下面三个标志:
1)g:表示全局模式,即模式将被应用于所有字符串
2)i表示不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写
3)m表示多行模式,即在到达一行文本末尾还会继续查找下一行中是否存在与模式匹配的项
20.正则表达式的元字符包括:( 【 { \ ^ $ | } ? * + . 】 )
可以用字面量形式定义正则表达式,也可以用ReExp构造函数来定义正则表达式,该函数接收两个参数:一个是要匹配的字符串模式,另一个是可选的标志字符串。
21.offsetWidth\offsetHeight 得到对象的宽度和高度(自己的与他人无关)
offsetWidth=width+padding+border;
offset常用属性: offsetLeft offsetTop
返回距离上级盒子(带有定位)左边的位置
如果父级都没有定位则以body 为准
offsetLeft 从父亲的padding 开始算 父亲的border 不算
22.百度免费新闻代码可以通过输入关键字获取相关新闻及代码。
23. var obj=document.createElement("p");
obj.innerHTML="这是一个大傻逼";
my$("dv").appendChild(obj);
创建元素p对象,添加到父级元素div中,同时用innerHTML添加p标签内容
24.onmouseOver 鼠标进入事件 onmouseOut 鼠标离开事件
25.为同一个元素绑定多个相同的事件:addEventListener(参数1,参数2 ,参数3)
参数1;事件的类型—事件的名字,字符串; 参数2:事件处理函数(命名或匿名) 参数3:布尔类型,用来控制事件阶段;true:捕获阶段 而false:冒泡阶段 火狐和谷歌支持,IE8不支持
在IE8 中用 attachEvent(参数1,参数2) ,两个参数跟 addEventListener 的前两个参数一样。(事件要在前加 on)
26.解绑事件:1.用什么方式绑定事件,就用什么方式解绑时间
a.对象.on事件名字=事件处理函数-----绑定事件
解绑:对象.on事件名字=null ------解绑事件;
b.用 addEventListener 方法绑定了事件,用 removeEventListener(三个参数) 解绑事件;
c.如果使用 attachEvent 方法绑定的事件,则用 detachEvent ()方法来解绑
27.事件冒泡:多个元素嵌套,有层次关系,这些元素都注册了相同的事件,如果里面的元素的事件触发了,则外面的元素的事件自动触发的现象叫事件冒泡。
window.event.cancelBubble=true; 这行代码可以阻止事件冒泡。(浏览器特有,谷歌也支持) e.stopPropagation(); ----这个方法谷歌和火狐支持;
28.arguments.length 可以找出函数的参数个数。
29.事件有三个阶段 1、事件捕获阶段 从外到里
2、事件目标阶段
3、事件冒泡阶段 从里到外
通过判断判断事件参数对象的属性值是数字几可以判断是什么阶段。事件参数对象.eventPhase 可以知道是什么阶段。比如得到该值是2,则是目标阶段。但是事件不可能同时出现冒泡和捕获阶段。
30.console.log(top)与console.log(window)输出一样的东西,都是window,也就是说window的别名是top;
31、window.onunload 事件——页面关闭后才触发的事件
window.onbeforeunload——页面关闭之前触发的事件
(两个都是浏览器才支持的事件)
32、location.href 设置跳转页面的地址,是一个属性,可后退
location.assign()设置跳转的页面,是个方法,不可后退。
location.reload() ---重新加载
location.replace(“url”)---跳转地址替代当前页面,也就是当前页面会关闭。
33.window.navigator.platform----判断浏览器所在的系统平台类型。
window.navigator.userAgent-----判断用户浏览器的版本。
34.setInterval(参数1,参数2)----参数1:函数 参数2:毫秒数
执行过程:页面加载完成后经过多少毫秒再执行函数的代码,就是定时器
clearInterval(要清除的定时器的ID),该ID就是setInterval的返回值。
34、opacity--- style属性中的透明度;为数值。
35、三种创建对象的方式:
(1)、字面量的方式 (2)、调用系统的构造函数 new object();(3)、自定义构造函数
36、判断一个对象的数据类型:
对象.constructor是否等于类型名 (2)用instanceof 属性判断
37、实例对象与构造函数的关系:实例对象是通过构造函数来创建的,创建的过程叫实例化;
38、如果创建的对象调用的是相同的方法,采用自定义构造函数会造成空间的浪费;
39.简单的原型写法
function Student(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
}
Student.prototype={
//手动修改构造器的指向
constructor: Student,
height:"188",
weight:"55kg",
study: function (){
console.log("学习使我快乐");
},
eat: function (){
console.log("我要吃好吃的");
},
};
40.实例对象的方法是可以相互调用的
function Person(age){
this.age=age;
this.sayHi=function(){
console.log("你好吗闰土");
};
this.eat=function(){
console.log("我怀念的是无话不说");
this.sayHi();
};
}
41.实例对象中的属性和方法先在实例对象中寻找,找到则直接使用,找不到则去实例对象的__proto__对应的原型对象中寻找,找到即用,再找不到则会报错。
42.内置对象添加原型方法
String.prototype.myReverse=function(){
for(var i=this.length-1;i>=0;i--){
console.log(this[i]);
}
};// 倒序输出数组
43.函数的自调用
//函数的自调用---一次性的函数---声明的同时直接调用了。
(function(){
console.log("函数自调用");
})();
44.原型链:是实例对象和原型对象之间的一种关系,该关系是通过原型(__proto__)来联系的
实例对象可以直接访问原型对象中的属性或方法。
原型:
原型链:
原型链指向改变:
原型指向后的图解:
原型链的最终改变:
45.apply与call方法可以改变this对象的指向:两者的参数不一样。
函数名字(方法).apply(对象,[参数1,参数2,… ]);
函数名字(方法).call(对象,参数1,参数2,…..);
46. var root=document.documentElement;//获取页面的根节点即是HTML标签。
47.正则表达式的作用:匹配字符串的;组成:由原字符或限定符组成的式子。
原字符: . 表示的是除了 \n 以外的任一个字符;
[ ] (1)表示的是范围 ; [0-9]表示的是0到9之间的任一个数字;[a-z]; [a-zA-Z]--表示的是所有的大小写的字母; [0-9a-zA-Z]----表示所有的数字或字母中的一个 (2)表示去掉正则表达式中原字符的意义,[.]表示的就是一个点。
| ----表示的是或者;
( )----表示的是分组,提升优先级;
50. 如果你需要通过变量来访问对象的属性值,请用中括号操作符,点操作符不支持变量。
51.Math.random();返回0到1之间的随机数,包括0但是不包括1.
52.在JavaScript中, 数字选择器类似于: /\d/g
。
在选择器后面添加一个加号标记(+
),例如:/\d+/g
,它允许这个正则表达式匹配一个或更多数字。
空白字符有 " "
(空格符)、\r
(回车符)、\n
(换行符)、\t
(制表符) 和 \f
(换页符)。
空白正则表达式类似于: /\s+/g
\S
匹配任何非空白字符。
53. map
方法会迭代数组中的每一个元素,并根据回调函数来处理每一个元素,最后返回一个新数组。注意,这个方法不会改变原始数组。
在我们的例子中,回调函数只有一个参数,即数组中元素的值 (val
参数) ,但其实,你的回调函数也可以支持多个参数,譬如:元素的索引index
、原始数组arr
。
54. 数组方法 reduce
用来迭代一个数组,并且把它累积到一个值中。
使用 reduce
方法时,你要传入一个回调函数,这个回调函数的参数是一个 累加器 (比如例子中的 previousVal
) 和当前值 (currentVal
)。
reduce
方法有一个可选的第二参数,它可以被用来设置累加器的初始值。如果没有在这定义初始值,那么初始值将变成数组中的第一项,而 currentVal
将从数组的第二项开始。
55. filter
方法用来迭代一个数组,并且按给出的条件过滤出符合的元素。
filter
方法传入一个回调函数,这个回调函数会携带一个参数,参数为当前迭代的项(我们叫它 val
)。
回调函数返回 true
的项会保留在数组中,返回 false
的项会被过滤出数组。
56. 使用 sort
方法,你可以很容易的按字母顺序或数字顺序对数组中的元素进行排序。
与我们之前用的数组方法仅仅返回一个新数组不同, sort
方法将改变原数组,返回被排序后的数组。
sort
可以把比较函数作为参数传入。比较函数有返回值,当 a
小于 b
,返回一个负数;当 a
大于 b
,返回一个正数;相等时返回0。
如果没有传入比较函数,它将把值全部转成字符串,并按照字母顺序进行排序。
56. 你可以使用 reverse 方法来翻转数组。
var myArray = [1, 2, 3];
myArray.reverse();
结果myArray 变成了 [3, 2, 1]
57. concat
方法可以用来把两个数组的内容合并到一个数组中。
concat
方法的参数应该是一个数组。参数中的数组会拼接在原数组的后面,并作为一个新数组返回。
58. 可以使用 split
方法按指定分隔符将字符串分割为数组。
但要给 split
方法传递一个参数,这个参数将会作为一个分隔符。
可以使用 join
方法来把数组转换成字符串,里面的每一个元素可以用你指定的连接符来连接起来,这个连接符就是你要传入的参数
58. replace()
方法返回一个由替换值替换一些或所有匹配的模式后的新字符串。模式可以是一个字符串或者一个正则表达式, 替换值可以是一个字符串或者一个每次匹配都要调用的函数
59. 检查回文字符串
如果给定的字符串是回文,返回true
,反之,返回false
。
如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。
注意你需要去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文。
60. 确保字符串的每个单词首字母都大写,其余部分小写。
61. 找出多个数组中的最大数
右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组。
62. 检查字符串结尾
判断一个字符串(str
)是否以指定的字符串(target
)结尾。
如果是,返回true;如果不是,返回false。
语法
str.substr(start[, length])
参数
start
开始提取字符的位置。如果为负值,则被看作 strLength + start,其中 strLength 为字符串的长度(例如,如果 start 为 -3,则被看作 strLength + (-3))。
length
可选。提取的字符数。
描述
start 是一个字符的索引。首字符的索引为 0,最后一个字符的索引为 字符串的长度减去1。substr 从 start 位置开始提取字符,提取 length 个字符(或直到字符串的末尾)。
如果 start 为正值,且大于或等于字符串的长度,则 substr 返回一个空字符串。
如果 start 为负值,则 substr 把它作为从字符串末尾开始的一个字符索引。如果 start 为负值且 abs(start) 大于字符串的长度,则 substr 使用 0 作为开始提取的索引。注意负的 start 参数不被 Microsoft JScript 所支持。
如果 length 为 0 或负值,则 substr 返回一个空字符串。如果忽略 length,则 substr 提取字符,直到字符串末尾。
解答代码:
63. 重复输出字符串
重复一个指定的字符串 num
次,如果num
是一个负数则返回一个空字符串。
64.截断字符串
截断字符串
如果字符串的长度比指定的参数num
长,则把多余的部分用...
来表示。
切记,插入到字符串尾部的三个点号也会计入字符串的长度。
但是,如果指定的参数num
小于或等于3,则添加的三个点号不会计入字符串的长度。
65. 把一个数组arr
按照指定的数组大小size
分割成若干个数组块。
例如:chunk([1,2,3,4],2)=[[1,2],[3,4]];
chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]];
66.返回截断n位后的数组;
语法
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
参数
start
指定修改的开始位置(从0计数)。如果超出了数组的长度,则从数组末尾开始添加内容;如果是负值,则表示从数组末位开始的第几位(从-1计数);若只使用start参数而不使用deleteCount、item,如:array.splice(start) ,表示删除[start,end]的元素。
deleteCount 可选
整数,表示要移除的数组元素的个数。如果 deleteCount 是 0,则不移除元素。这种情况下,至少应添加一个新元素。如果 deleteCount 大于start 之后的元素的总数,则从 start 后面的元素都将被删除(含第 start 位)。
如果deleteCount被省略,则其相当于(arr.length - start)。
item1, item2, ... 可选
要添加进数组的元素,从start 位置开始。如果不指定,则 splice() 将只删除数组元素。
splice方法使用deleteCount参数来控制是删除还是添加:
start参数是必须的,表示开始的位置(从0计数),如:start=0从第一个开始;start>= array.length-1表示从最后一个开始。
①、从start位置开始删除[start,end]的元素。
array.splice(start)
②、从start位置开始删除[start,Count]的元素。
array.splice(start, deleteCount)
③、从start位置开始添加item1, item2, ...元素。
array.splice(start, 0, item1, item2, ...)
返回值
由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。
67. 如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。
举例,["hello", "Hello"]
应该返回true,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。
indexOf( )
68. 删除数组中的所有假值。
在JavaScript中,假值有false
、null
、0
、""
、undefined
和 NaN
。
ES6最新解法:
69. 实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。
filter
不会改变原数组,它返回过滤后的新数组。
filter
为数组中的每个元素调用一次 callback
函数,并利用所有使得 callback
返回 true 或 等价于 true 的值 的元素创建一个新数组。callback
只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。那些没有通过 callback
测试的元素会被跳过,不会被包含在新数组中。
callback
被调用时传入三个参数:
filter
遍历的元素范围在第一次调用 callback
之前就已经确定了。在调用 filter
之后被添加到数组中的元素不会被 filter
遍历到。如果已经存在的元素被改变了,则他们传入 callback
的值是 filter
遍历到它们那一刻的值。被删除或从来未被赋值的元素不会被遍历到。
70. 数组排序并找出元素索引
先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引。
举例:where([1,2,3,4], 1.5)
应该返回 1
。因为1.5
插入到数组[1,2,3,4]
后变成[1,1.5,2,3,4]
,而1.5
对应的索引值就是1
。
arr.sort()
arr.sort(compareFunction)
compareFunction
可选。用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的各个字符的Unicode位点进行排序。
返回排序后的数组。原数组已经被排序后的数组代替。
如果没有指明 compareFunction
,那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序。例如 "Banana" 会被排列到 "cherry" 之前。当数字按由小到大排序时,9 出现在 80 之前,但因为(没有指明 compareFunction
),比较的数字会先被转换为字符串,所以在Unicode顺序上 "80" 要比 "9" 要靠前。
如果指明了 compareFunction
,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:
compareFunction(a, b)
小于 0 ,那么 a 会被排列到 b 之前;compareFunction(a, b)
等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);compareFunction(a, b)
大于 0 , b 会被排列到 a 之前。compareFunction(a, b)
必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。71. 移位密码也就是密码中的字母会按照指定的数量来做移位。
一个常见的案例就是ROT13密码,字母会移位13个位置。由'A' ↔ 'N', 'B' ↔ 'O',以此类推。
写一个ROT13函数,实现输入加密字符串,输出解密字符串。
所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,跳过它们。
静态 String.fromCharCode()
方法返回使用指定的Unicode值序列创建的字符串。
charCodeAt() 方法返回0到65535之间的整数,表示给定索引处的UTF-16代码单元 (在 Unicode 编码单元表示一个单一的 UTF-16 编码单元的情况下,UTF-16 编码单元匹配 Unicode 编码单元。但在——例如 Unicode 编码单元 > 0x10000 的这种——不能被一个 UTF-16 编码单元单独表示的情况下,只能匹配 Unicode 代理对的第一个编码单元) 。如果你想要整个代码点的值,使用 codePointAt
()。
72.通过浏览器获取当前位置
.shift()
的工作原理就像 .pop()
,但它移除的是第一个元素,而不是最后一个。 .unshift()
函数用起来就像 .push()
函数一样, 但不是在数组的末尾添加元素,而是在数组的头部添加元素
74.局部变量优于全局变量
75. 我们同样可以删除对象的属性,例如:
delete ourDog.bark;
76. 有时检查一个对象属性是否存在是非常有用的,我们可以用.hasOwnProperty(propname)
方法来检查对象是否有该属性。如果有返回true
,反之返回 false
。
对空格的严格判断,采用 === 或者!== 来判断,否则会出现难以解决的错误。
78. Profile Lookup
我们有一个对象数组,里面存储着通讯录。
函数 lookUp 有两个预定义参数:firstName值和prop属性 。
函数将会检查通讯录中是否存在一个与传入的 firstName 相同的联系人。如果存在,那么还需要检查对应的联系人中是否存在 prop属性。
如果它们都存在,函数返回prop属性对应的值。
如果firstName 值不存在,返回 "No such contact"。
如果prop 属性不存在,返回 "No such property"。
函数如下
要注意最后一个的return “No such contact”要在for循环外面,否则会每循环一次就出现一次错误结果。
79. Regular expressions 正则表达式被用来根据某种匹配模式来寻找strings中的某些单词。
举例:如果我们想要找到字符串The dog chased the cat中单词 the,我们可以使用下面的正则表达式: /the/gi
我们可以把这个正则表达式分成几段:
/ 是这个正则表达式的头部
the 是我们想要匹配的模式
/ 是这个正则表达式的尾部
g 代表着 global(全局),意味着返回所有的匹配而不仅仅是第一个。
i 代表着忽略大小写,意思是当我们寻找匹配的字符串的时候忽略掉字母的大小写。
\s
匹配任何空白字符,\S
匹配任何非空白字符。
80. map 方法会迭代数组中的每一个元素,并根据回调函数来处理每一个元素,最后返回一个新数组。注意,这个方法不会改变原始数组。
在我们的例子中,回调函数只有一个参数,即数组中元素的值 (val 参数) ,但其实,你的回调函数也可以支持多个参数,譬如:元素的索引index、原始数组arr
81. 数组方法 reduce 用来迭代一个数组,并且把它累积到一个值中。
使用 reduce 方法时,你要传入一个回调函数,这个回调函数的参数是一个 累加器 (比如例子中的 previousVal) 和当前值 (currentVal)。
reduce 方法有一个可选的第二参数,它可以被用来设置累加器的初始值。如果没有在这定义初始值,那么初始值将变成数组中的第一项,而 currentVal 将从数组的第二项开始。
filter 方法用来迭代一个数组,并且按给出的条件过滤出符合的元素。
filter 方法传入一个回调函数,这个回调函数会携带一个参数,参数为当前迭代的项(我们叫它 val )。
回调函数返回 true 的项会保留在数组中,返回 false 的项会被过滤出数组。
(2)使用 sort 方法,你可以很容易的按字母顺序或数字顺序对数组中的元素进行排序。
与我们之前用的数组方法仅仅返回一个新数组不同, sort 方法将改变原数组,返回被排序后的数组。
sort 可以把比较函数作为参数传入。比较函数有返回值,当 a 小于 b,返回一个负数;当 a 大于 b ,返回一个正数;相等时返回0。
如果没有传入比较函数,它将把值全部转成字符串,并按照字母顺序进行排序。
82. Sum All Numbers in a Range
我们会传递给你一个包含两个数字的数组。返回这两个数字和它们之间所有数字的和。
最小的数字并非总在最前面。
方法二
83. Diff Two Arrays
比较两个数组,然后返回一个新数组,该数组的元素为两个给定数组中所有独有的数组元素。换言之,返回两个数组的差异
84. Where art thou
写一个 function,它遍历一个对象数组(第一个参数)并返回一个包含相匹配的属性-值对(第二个参数)的所有对象的数组。如果返回的数组中包含 source 对象的属性-值对,那么此对象的每一个属性-值对都必须存在于 collection 的对象中。
85.
Sort()方法排序,没有调用参数的情况下,会调用每个数组项的toString()转型方法,然后比较得到的字符串,以确定排序,默认从小到大;如果比较数值大小,则可接收一个比较函数作为参数:比较函数应该具有两个参数 a 和 b,其返回值如下:
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。
function sortNumber(a, b){
return a - b; //这里返回的是他们的差值,如果是小于0的值,就会将a排在前面,如果大于0,就会将b排在前面,如果是0的话,就随便。(冒泡排序法!!)
}
15.操作方法:(1)、concat()方法会先创建当前数组的一个副本,然后将接收到的参数添加到副本的末尾,最后返回新构建的数组。在没有给concat()方法传递参数的情况下,它复制当前数组并返回副本,如果传递的是一个或多个数组则该方法会将这些数组每一项都添加到结果数组中,如果传递的是值,这些值就会简单添加到数组中
(2)slice()能够基于当前数组项中的一个或多个项创建一个新数组。若接收一个参数,则slice()方法返回从参数指定位置开始到当前数组末尾的所有项;如果有两个参数,则该方法返回起始和结束位置之间的项(但是不包括结束位置的项)。PS:如果slice()方法的参数中有一个负数,则用数组长度加上该数来确定相应的位置:slice(-2,-1)与slice(3,4)得到的结果相同——数组长度为5。
(3)、splice()的主要用途是向数组的中部插入项:a、删除:可以删除任意数量的项,需提供三个参数——要删除的第一项的位置、要删除的项数
B、插入——提供三个参数:起始位置,0(要删除的项数)和要插入的项
C、替换——向指定位置插入任意数量的项,三个参数——起始位置、要删除的项数和要插入的任意数量的项。删除和插入的项数不一定要相等。
Splice()方法返回一个数组,该数组包含从原数组中删除的项,没删除则返回一个空数组
(2)filter():对数组中的每一项运行给定的函数,返回该函数会返回true的项组成的数组
(3)forEach():对数组中的每一项运行给定的函数,没有返回值
(4)map():对数组中的每一项运行给定的函数,返回每次函数调用的结果组成的数组
(5)some():对数组每一项运行给定的函数,如果该函数对其中至少一项返回true,则返回true。
17.归并方法——数组元素求和:reduce()方法和reduceRight()方法。
reduce()方法从数组第一项遍历到最后,而reduceRight()方法则从最后一项向前遍历。两种方法的函数接收四个参数:前一个值、当前值、项的索引和数组对象。可以实现对数组元素求和,以下对【1,2,3,4,5】求和
preValue curValue index array 返回值
第一次回调 5 0 0 [0,1,2,3,4] 5
第二次回调 5 1 1 [0,1,2,3,4] 6
第三次回调 6 2 2 [0,1,2,3,4] 8
第四次回调 8 3 3 [0,1,2,3,4] 11
第五次回调 11 4 4 [0,1,2,3,4] 15
18继承的方法:Date类型的toLocaleString()方法会按照与浏览器设置的的地区相适应的格式返回日期和时间;toString()方法通常返回带有时区信息的日期与时间。Date类型的valueof()方法不返回字符串,而是返回日期的毫秒值,可以用比较操作符来比较日期值。
19.ReExp类型——支持正则表达式;正则表达式的匹配模式支持下面三个标志:
1)g:表示全局模式,即模式将被应用于所有字符串
2)i表示不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写
3)m表示多行模式,即在到达一行文本末尾还会继续查找下一行中是否存在与模式匹配的项
20.正则表达式的元字符包括:( 【 { \ ^ $ | } ? * + . 】 )
可以用字面量形式定义正则表达式,也可以用ReExp构造函数来定义正则表达式,该函数接收两个参数:一个是要匹配的字符串模式,另一个是可选的标志字符串。
21.offsetWidth\offsetHeight 得到对象的宽度和高度(自己的与他人无关)
offsetWidth=width+padding+border;
offset常用属性: offsetLeft offsetTop
返回距离上级盒子(带有定位)左边的位置
如果父级都没有定位则以body 为准
offsetLeft 从父亲的padding 开始算 父亲的border 不算
22.百度免费新闻代码可以通过输入关键字获取相关新闻及代码。
23. var obj=document.createElement("p");
obj.innerHTML="这是一个大傻逼";
my$("dv").appendChild(obj);
创建元素p对象,添加到父级元素div中,同时用innerHTML添加p标签内容
24.onmouseOver 鼠标进入事件 onmouseOut 鼠标离开事件
25.为同一个元素绑定多个相同的事件:addEventListener(参数1,参数2 ,参数3)
参数1;事件的类型—事件的名字,字符串; 参数2:事件处理函数(命名或匿名) 参数3:布尔类型,用来控制事件阶段;true:捕获阶段 而false:冒泡阶段 火狐和谷歌支持,IE8不支持
在IE8 中用 attachEvent(参数1,参数2) ,两个参数跟 addEventListener 的前两个参数一样。(事件要在前加 on)
26.解绑事件:1.用什么方式绑定事件,就用什么方式解绑时间
a.对象.on事件名字=事件处理函数-----绑定事件
解绑:对象.on事件名字=null ------解绑事件;
b.用 addEventListener 方法绑定了事件,用 removeEventListener(三个参数) 解绑事件;
c.如果使用 attachEvent 方法绑定的事件,则用 detachEvent ()方法来解绑
27.事件冒泡:多个元素嵌套,有层次关系,这些元素都注册了相同的事件,如果里面的元素的事件触发了,则外面的元素的事件自动触发的现象叫事件冒泡。
window.event.cancelBubble=true; 这行代码可以阻止事件冒泡。(浏览器特有,谷歌也支持) e.stopPropagation(); ----这个方法谷歌和火狐支持;
28.arguments.length 可以找出函数的参数个数。
29.事件有三个阶段 1、事件捕获阶段 从外到里
2、事件目标阶段
3、事件冒泡阶段 从里到外
通过判断判断事件参数对象的属性值是数字几可以判断是什么阶段。事件参数对象.eventPhase 可以知道是什么阶段。比如得到该值是2,则是目标阶段。但是事件不可能同时出现冒泡和捕获阶段。
30.console.log(top)与console.log(window)输出一样的东西,都是window,也就是说window的别名是top;
31、window.onunload 事件——页面关闭后才触发的事件
window.onbeforeunload——页面关闭之前触发的事件
(两个都是浏览器才支持的事件)
32、location.href 设置跳转页面的地址,是一个属性,可后退
location.assign()设置跳转的页面,是个方法,不可后退。
location.reload() ---重新加载
location.replace(“url”)---跳转地址替代当前页面,也就是当前页面会关闭。
33.window.navigator.platform----判断浏览器所在的系统平台类型。
window.navigator.userAgent-----判断用户浏览器的版本。
34.setInterval(参数1,参数2)----参数1:函数 参数2:毫秒数
执行过程:页面加载完成后经过多少毫秒再执行函数的代码,就是定时器
clearInterval(要清除的定时器的ID),该ID就是setInterval的返回值。
34、opacity--- style属性中的透明度;为数值。
35、三种创建对象的方式:
(1)、字面量的方式 (2)、调用系统的构造函数 new object();(3)、自定义构造函数
36、判断一个对象的数据类型:
对象.constructor是否等于类型名 (2)用instanceof 属性判断
37、实例对象与构造函数的关系:实例对象是通过构造函数来创建的,创建的过程叫实例化;
38、如果创建的对象调用的是相同的方法,采用自定义构造函数会造成空间的浪费;
39.简单的原型写法
function Student(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
}
Student.prototype={
//手动修改构造器的指向
constructor: Student,
height:"188",
weight:"55kg",
study: function (){
console.log("学习使我快乐");
},
eat: function (){
console.log("我要吃好吃的");
},
};
40.实例对象的方法是可以相互调用的
function Person(age){
this.age=age;
this.sayHi=function(){
console.log("你好吗闰土");
};
this.eat=function(){
console.log("我怀念的是无话不说");
this.sayHi();
};
}
41.实例对象中的属性和方法先在实例对象中寻找,找到则直接使用,找不到则去实例对象的__proto__对应的原型对象中寻找,找到即用,再找不到则会报错。
42.内置对象添加原型方法
String.prototype.myReverse=function(){
for(var i=this.length-1;i>=0;i--){
console.log(this[i]);
}
};// 倒序输出数组
43.函数的自调用
//函数的自调用---一次性的函数---声明的同时直接调用了。
(function(){
console.log("函数自调用");
})();
44.原型链:是实例对象和原型对象之间的一种关系,该关系是通过原型(__proto__)来联系的
实例对象可以直接访问原型对象中的属性或方法。
原型:
原型链:
原型链指向改变:
原型指向后的图解:
原型链的最终改变:
45.apply与call方法可以改变this对象的指向:两者的参数不一样。
函数名字(方法).apply(对象,[参数1,参数2,… ]);
函数名字(方法).call(对象,参数1,参数2,…..);
46. var root=document.documentElement;//获取页面的根节点即是HTML标签。
47.正则表达式的作用:匹配字符串的;组成:由原字符或限定符组成的式子。
原字符: . 表示的是除了 \n 以外的任一个字符;
[ ] (1)表示的是范围 ; [0-9]表示的是0到9之间的任一个数字;[a-z]; [a-zA-Z]--表示的是所有的大小写的字母; [0-9a-zA-Z]----表示所有的数字或字母中的一个 (2)表示去掉正则表达式中原字符的意义,[.]表示的就是一个点。
| ----表示的是或者;
( )----表示的是分组,提升优先级;
50. 如果你需要通过变量来访问对象的属性值,请用中括号操作符,点操作符不支持变量。
51.Math.random();返回0到1之间的随机数,包括0但是不包括1.
52.在JavaScript中, 数字选择器类似于: /\d/g
。
在选择器后面添加一个加号标记(+
),例如:/\d+/g
,它允许这个正则表达式匹配一个或更多数字。
空白字符有 " "
(空格符)、\r
(回车符)、\n
(换行符)、\t
(制表符) 和 \f
(换页符)。
空白正则表达式类似于: /\s+/g
\S
匹配任何非空白字符。
53. map
方法会迭代数组中的每一个元素,并根据回调函数来处理每一个元素,最后返回一个新数组。注意,这个方法不会改变原始数组。
在我们的例子中,回调函数只有一个参数,即数组中元素的值 (val
参数) ,但其实,你的回调函数也可以支持多个参数,譬如:元素的索引index
、原始数组arr
。
54. 数组方法 reduce
用来迭代一个数组,并且把它累积到一个值中。
使用 reduce
方法时,你要传入一个回调函数,这个回调函数的参数是一个 累加器 (比如例子中的 previousVal
) 和当前值 (currentVal
)。
reduce
方法有一个可选的第二参数,它可以被用来设置累加器的初始值。如果没有在这定义初始值,那么初始值将变成数组中的第一项,而 currentVal
将从数组的第二项开始。
55. filter
方法用来迭代一个数组,并且按给出的条件过滤出符合的元素。
filter
方法传入一个回调函数,这个回调函数会携带一个参数,参数为当前迭代的项(我们叫它 val
)。
回调函数返回 true
的项会保留在数组中,返回 false
的项会被过滤出数组。
56. 使用 sort
方法,你可以很容易的按字母顺序或数字顺序对数组中的元素进行排序。
与我们之前用的数组方法仅仅返回一个新数组不同, sort
方法将改变原数组,返回被排序后的数组。
sort
可以把比较函数作为参数传入。比较函数有返回值,当 a
小于 b
,返回一个负数;当 a
大于 b
,返回一个正数;相等时返回0。
如果没有传入比较函数,它将把值全部转成字符串,并按照字母顺序进行排序。
56. 你可以使用 reverse 方法来翻转数组。
var myArray = [1, 2, 3];
myArray.reverse();
结果myArray 变成了 [3, 2, 1]
57. concat
方法可以用来把两个数组的内容合并到一个数组中。
concat
方法的参数应该是一个数组。参数中的数组会拼接在原数组的后面,并作为一个新数组返回。
58. 可以使用 split
方法按指定分隔符将字符串分割为数组。
但要给 split
方法传递一个参数,这个参数将会作为一个分隔符。
可以使用 join
方法来把数组转换成字符串,里面的每一个元素可以用你指定的连接符来连接起来,这个连接符就是你要传入的参数
58. replace()
方法返回一个由替换值替换一些或所有匹配的模式后的新字符串。模式可以是一个字符串或者一个正则表达式, 替换值可以是一个字符串或者一个每次匹配都要调用的函数
59. 检查回文字符串
如果给定的字符串是回文,返回true
,反之,返回false
。
如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。
注意你需要去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文。
60. 确保字符串的每个单词首字母都大写,其余部分小写。
61. 找出多个数组中的最大数
右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组。
62. 检查字符串结尾
判断一个字符串(str
)是否以指定的字符串(target
)结尾。
如果是,返回true;如果不是,返回false。
语法
str.substr(start[, length])
参数
start
开始提取字符的位置。如果为负值,则被看作 strLength + start,其中 strLength 为字符串的长度(例如,如果 start 为 -3,则被看作 strLength + (-3))。
length
可选。提取的字符数。
描述
start 是一个字符的索引。首字符的索引为 0,最后一个字符的索引为 字符串的长度减去1。substr 从 start 位置开始提取字符,提取 length 个字符(或直到字符串的末尾)。
如果 start 为正值,且大于或等于字符串的长度,则 substr 返回一个空字符串。
如果 start 为负值,则 substr 把它作为从字符串末尾开始的一个字符索引。如果 start 为负值且 abs(start) 大于字符串的长度,则 substr 使用 0 作为开始提取的索引。注意负的 start 参数不被 Microsoft JScript 所支持。
如果 length 为 0 或负值,则 substr 返回一个空字符串。如果忽略 length,则 substr 提取字符,直到字符串末尾。
解答代码:
63. 重复输出字符串
重复一个指定的字符串 num
次,如果num
是一个负数则返回一个空字符串。
64.截断字符串
截断字符串
如果字符串的长度比指定的参数num
长,则把多余的部分用...
来表示。
切记,插入到字符串尾部的三个点号也会计入字符串的长度。
但是,如果指定的参数num
小于或等于3,则添加的三个点号不会计入字符串的长度。
65. 把一个数组arr
按照指定的数组大小size
分割成若干个数组块。
例如:chunk([1,2,3,4],2)=[[1,2],[3,4]];
chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]];
66.返回截断n位后的数组;
语法
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
参数
start
指定修改的开始位置(从0计数)。如果超出了数组的长度,则从数组末尾开始添加内容;如果是负值,则表示从数组末位开始的第几位(从-1计数);若只使用start参数而不使用deleteCount、item,如:array.splice(start) ,表示删除[start,end]的元素。
deleteCount 可选
整数,表示要移除的数组元素的个数。如果 deleteCount 是 0,则不移除元素。这种情况下,至少应添加一个新元素。如果 deleteCount 大于start 之后的元素的总数,则从 start 后面的元素都将被删除(含第 start 位)。
如果deleteCount被省略,则其相当于(arr.length - start)。
item1, item2, ... 可选
要添加进数组的元素,从start 位置开始。如果不指定,则 splice() 将只删除数组元素。
splice方法使用deleteCount参数来控制是删除还是添加:
start参数是必须的,表示开始的位置(从0计数),如:start=0从第一个开始;start>= array.length-1表示从最后一个开始。
①、从start位置开始删除[start,end]的元素。
array.splice(start)
②、从start位置开始删除[start,Count]的元素。
array.splice(start, deleteCount)
③、从start位置开始添加item1, item2, ...元素。
array.splice(start, 0, item1, item2, ...)
返回值
由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。
67. 如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。
举例,["hello", "Hello"]
应该返回true,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。
indexOf( )
68. 删除数组中的所有假值。
在JavaScript中,假值有false
、null
、0
、""
、undefined
和 NaN
。
ES6最新解法:
69. 实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。
filter
不会改变原数组,它返回过滤后的新数组。
filter
为数组中的每个元素调用一次 callback
函数,并利用所有使得 callback
返回 true 或 等价于 true 的值 的元素创建一个新数组。callback
只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。那些没有通过 callback
测试的元素会被跳过,不会被包含在新数组中。
callback
被调用时传入三个参数:
filter
遍历的元素范围在第一次调用 callback
之前就已经确定了。在调用 filter
之后被添加到数组中的元素不会被 filter
遍历到。如果已经存在的元素被改变了,则他们传入 callback
的值是 filter
遍历到它们那一刻的值。被删除或从来未被赋值的元素不会被遍历到。
70. 数组排序并找出元素索引
先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引。
举例:where([1,2,3,4], 1.5)
应该返回 1
。因为1.5
插入到数组[1,2,3,4]
后变成[1,1.5,2,3,4]
,而1.5
对应的索引值就是1
。
arr.sort()
arr.sort(compareFunction)
compareFunction
可选。用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的各个字符的Unicode位点进行排序。
返回排序后的数组。原数组已经被排序后的数组代替。
如果没有指明 compareFunction
,那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序。例如 "Banana" 会被排列到 "cherry" 之前。当数字按由小到大排序时,9 出现在 80 之前,但因为(没有指明 compareFunction
),比较的数字会先被转换为字符串,所以在Unicode顺序上 "80" 要比 "9" 要靠前。
如果指明了 compareFunction
,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:
compareFunction(a, b)
小于 0 ,那么 a 会被排列到 b 之前;compareFunction(a, b)
等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);compareFunction(a, b)
大于 0 , b 会被排列到 a 之前。compareFunction(a, b)
必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。71. 移位密码也就是密码中的字母会按照指定的数量来做移位。
一个常见的案例就是ROT13密码,字母会移位13个位置。由'A' ↔ 'N', 'B' ↔ 'O',以此类推。
写一个ROT13函数,实现输入加密字符串,输出解密字符串。
所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,跳过它们。
静态 String.fromCharCode()
方法返回使用指定的Unicode值序列创建的字符串。
charCodeAt() 方法返回0到65535之间的整数,表示给定索引处的UTF-16代码单元 (在 Unicode 编码单元表示一个单一的 UTF-16 编码单元的情况下,UTF-16 编码单元匹配 Unicode 编码单元。但在——例如 Unicode 编码单元 > 0x10000 的这种——不能被一个 UTF-16 编码单元单独表示的情况下,只能匹配 Unicode 代理对的第一个编码单元) 。如果你想要整个代码点的值,使用 codePointAt
()。
72.通过浏览器获取当前位置
.shift()
的工作原理就像 .pop()
,但它移除的是第一个元素,而不是最后一个。 .unshift()
函数用起来就像 .push()
函数一样, 但不是在数组的末尾添加元素,而是在数组的头部添加元素
74.局部变量优于全局变量
75. 我们同样可以删除对象的属性,例如:
delete ourDog.bark;
76. 有时检查一个对象属性是否存在是非常有用的,我们可以用.hasOwnProperty(propname)
方法来检查对象是否有该属性。如果有返回true
,反之返回 false
。
对空格的严格判断,采用 === 或者!== 来判断,否则会出现难以解决的错误。
78. Profile Lookup
我们有一个对象数组,里面存储着通讯录。
函数 lookUp 有两个预定义参数:firstName值和prop属性 。
函数将会检查通讯录中是否存在一个与传入的 firstName 相同的联系人。如果存在,那么还需要检查对应的联系人中是否存在 prop属性。
如果它们都存在,函数返回prop属性对应的值。
如果firstName 值不存在,返回 "No such contact"。
如果prop 属性不存在,返回 "No such property"。
函数如下
要注意最后一个的return “No such contact”要在for循环外面,否则会每循环一次就出现一次错误结果。
79. Regular expressions 正则表达式被用来根据某种匹配模式来寻找strings中的某些单词。
举例:如果我们想要找到字符串The dog chased the cat中单词 the,我们可以使用下面的正则表达式: /the/gi
我们可以把这个正则表达式分成几段:
/ 是这个正则表达式的头部
the 是我们想要匹配的模式
/ 是这个正则表达式的尾部
g 代表着 global(全局),意味着返回所有的匹配而不仅仅是第一个。
i 代表着忽略大小写,意思是当我们寻找匹配的字符串的时候忽略掉字母的大小写。
\s
匹配任何空白字符,\S
匹配任何非空白字符。
80. map 方法会迭代数组中的每一个元素,并根据回调函数来处理每一个元素,最后返回一个新数组。注意,这个方法不会改变原始数组。
在我们的例子中,回调函数只有一个参数,即数组中元素的值 (val 参数) ,但其实,你的回调函数也可以支持多个参数,譬如:元素的索引index、原始数组arr
81. 数组方法 reduce 用来迭代一个数组,并且把它累积到一个值中。
使用 reduce 方法时,你要传入一个回调函数,这个回调函数的参数是一个 累加器 (比如例子中的 previousVal) 和当前值 (currentVal)。
reduce 方法有一个可选的第二参数,它可以被用来设置累加器的初始值。如果没有在这定义初始值,那么初始值将变成数组中的第一项,而 currentVal 将从数组的第二项开始。
filter 方法用来迭代一个数组,并且按给出的条件过滤出符合的元素。
filter 方法传入一个回调函数,这个回调函数会携带一个参数,参数为当前迭代的项(我们叫它 val )。
回调函数返回 true 的项会保留在数组中,返回 false 的项会被过滤出数组。
(2)使用 sort 方法,你可以很容易的按字母顺序或数字顺序对数组中的元素进行排序。
与我们之前用的数组方法仅仅返回一个新数组不同, sort 方法将改变原数组,返回被排序后的数组。
sort 可以把比较函数作为参数传入。比较函数有返回值,当 a 小于 b,返回一个负数;当 a 大于 b ,返回一个正数;相等时返回0。
如果没有传入比较函数,它将把值全部转成字符串,并按照字母顺序进行排序。
82. Sum All Numbers in a Range
我们会传递给你一个包含两个数字的数组。返回这两个数字和它们之间所有数字的和。
最小的数字并非总在最前面。
方法二
83. Diff Two Arrays
比较两个数组,然后返回一个新数组,该数组的元素为两个给定数组中所有独有的数组元素。换言之,返回两个数组的差异
84. Where art thou
写一个 function,它遍历一个对象数组(第一个参数)并返回一个包含相匹配的属性-值对(第二个参数)的所有对象的数组。如果返回的数组中包含 source 对象的属性-值对,那么此对象的每一个属性-值对都必须存在于 collection 的对象中。