函数定义方法
- 静态方法
function 函数名([形参列表]){
函数体
[return【函数返回值;】]
}
- 动态匿名方法
var 函数名 = new Function([形参列表],“函数体”)
- 直接量方法
var 函数名 = function([形参列表]){
函数体;
}
调用方法
● 直接调用 函数名(实参列表)
● 在链接中调用
<a href='javascript:函数名()'>描述文字</a>
● 在事件中调用 事件类型 = “函数名()”
● 递归调用
a. 定义 在函数体内部调用函数自身
b. 格式
function 函数名(){
代码
函数名();
}
![](https://img.haomeiwen.com/i4465616/e6b98839069a2d3c.gif)
let treeArr = [
{id:12,name:'HTML',pid: 1},
{id:14,name:'HTML基础',pid: 12},
{id:164,name:'HTML基础2',pid: 14},
{id:124,name:'HTML5多媒体',pid: 12},
{id:134,name:'HTML5拖拽',pid: 12},
{id:141,name:'HTML网络状态与全屏',pid: 12},
{id:141,name:'CSS',pid: 1},
{id:41,name:'CSS基础',pid: 141},
{id:63,name:'CSS定位锚点与透明',pid: 141},
{id:203,name:'CSS滤镜',pid: 141},
{id:211,name:'JavaScript',pid: 1},
{id:121,name:'JavaScript基础',pid: 211},
{id:98,name:'JavaScript事件处理',pid: 211},
{id:19,name:'JavaScript面向对象',pid: 211},
];
let oWrapper = document.querySelector('.wrapper')
var str = '';
// 获取子节点结构
function getChilds(id,arr) {
let childs = new Array();
for(let i=0;i< arr.length;i++){
// 如果pid 等于父节点id
if(arr[i].pid === id){
childs.push({
value: arr[i].id,
name: arr[i].name
})
}
}
for(let k=0; k<childs.length; k++){
let childScope = getChilds(childs[k].value, arr)
if(childScope.length >0 ) {
childs[k].children = childScope;
}
}
return childs;
}
// 生成树形结构数据
function createTreeData(arr) {
let result = [];
let parent = {};
for(let i=0; i<arr.length;i++){
// 检查是否是顶级
if(arr[i].pid === 1) {
parent = {
value: arr[i].id,
name: arr[i].name
}
parent.children = getChilds(arr[i].id, arr)
result.push(parent)
}
}
// 生成节点
createDOM(result)
return result;
}
// 生成节点
function createDOM(data) {
str += '<ul>'
for(let i=0; i<data.length; i++){
if(data[i].children) {
str += `<li><span>> </span>${data[i].name}</li>`;
// 递归追加
createDOM(data[i].children)
}else {
str += `<li >${data[i].name}</li>`
}
}
str += '</ul>'
oWrapper.innerHTML = str;
}
let res = createTreeData(treeArr)
oWrapper.addEventListener('click', function(e){
console.log(e.target.nextSibling);
var isHide = e.target.nextSibling.classList.contains('hide');
if(isHide) {
e.target.children[0].style.transform = `rotate(0deg)`
e.target.nextSibling.classList.remove('hide')
}else {
e.target.children[0].style.transform = `rotate(90deg)`
e.target.nextSibling.classList.add('hide')
}
})
方法
● apply 将函数作为对象的方法来调用,将参数以数组形式传递给该方法
● call 将函数作为对象的方法来调用,将指定参数传递给该方法
● toString 返回函数的字符串表示
简单使用
function test(a,b){
console.log(a,b,this);
}
// 不传参
test.call() // undefined undefined window
test.apply(null) // undefined undefined window
test.call(null, 5,10) // 5 10 window
test.apply(null, [5,10]) // 5 10 window
改变指向
function test(a,b){
console.log(a,b, this.name);
}
let obj = {
name: '张三'
}
test.call(obj, 5, 10) // 5 10 张三
test.apply(obj, [5 ,10]) // 5 10 张三
arguments对象
● 功能 存放实参的参数列表
● 特性 (仅能在函数体内使用;带有下标属性,但并非数组;函数声明时自动初始化;)
● 属性
a. length 获取函数实参的长度
b. callee 返回当前正在指向的函数
c. caller 返回调用当前正在执行函数的函数名
![](https://img.haomeiwen.com/i4465616/a121075f4ef87245.gif)
var inp = document.querySelector("input");
var btn = document.querySelector("button");
var p = document.querySelector("p");
btn.onclick = function (){
// 转换为数组
var arrValue = inp.value.split(",");
p.innerHTML = calc(arrValue)
}
function calc (arr){
var result = 0;
for (var i = 0; i<arr.length; i++) {
// 取出数组中的每个值 累计
result += parseInt(arguments[0][i]);
}
return result;
}
函数参数
● 参数类型
a. 形参 定义函数时使用的参数,接受调用该函数时传递的参数
b. 实参 调用函数时传递给函数的实际参数
● 特性
a. 参数个数没有限制
b. 参数的数据类型没有限制
c. 通过arguments对象访问参数数组
d. 参数始终按值传递 (基本类型: 传值; 引用类型: 传址;)
![](https://img.haomeiwen.com/i4465616/142038875458f94a.gif)
//获取元素
var oBox = document.querySelector(".box");
var btns = document.querySelectorAll("button");
var showCode = document.querySelector('.show-code');
var oPropertyName = document.querySelector('#propertyName');
var oPropertyValue = document.querySelector('#propertyValue')
var styleArr = [];
//封装函数
function getValue (ele,prototype,value){
ele.style[prototype] = value;
}
// 绑定改变样式按钮
btns[0].onclick = function (){
changeStyle()
}
function changeStyle() {
//获取 input的值
var propertyName = document.querySelector('#propertyName').value;
var propertyValue = document.querySelector('#propertyValue').value;
styleArr.push({
name: propertyName,
value: propertyValue
})
getValue(oBox,propertyName,propertyValue);
clearValue();
showCodeFn();
}
//调用函数清除所有的样式
btns[1].onclick = function (){
clearValue();
getValue(oBox,"cssText","");
}
function clearValue() {
oPropertyName.value = '';
oPropertyValue.value = '';
showCode.innerHTML = '';
}
function showCodeFn() {
var str = "";
for(var i=0; i< styleArr.length; i++){
str += "<p style='text-indent: 2em;'>"+ styleArr[i].name + ": " + styleArr[i].value + ";" +"</p>"
}
showCode.innerHTML = "<p>"+ "." +oBox.className+ "{" + str +"</p>" + "<p>}</p>"
}
document.onkeydown= function(event){
if(event.keyCode === 13){
changeStyle()
}
}
指针标识
● this 指向当前操作对象
● callee 指向参数集合所属函数
● prototype 指向函数附带的原型对象
● constructor 指向创建该对象的构造函数
数组创建方式
● 空数组 var Obj = new Array()
● 指定长度数组 var Obj = new Array (size)
● 指定元素数组 var Obj = new Array (ele1,ele2,ele3)
● 单维数组 var Obj = [ele1,ele2,ele3]
● 多维数组 var Obj = new Array([el1],[el2],[el3])
![](https://img.haomeiwen.com/i4465616/66816c684224508d.gif)
var btn = document.getElementsByTagName("button");
var arr = [22,33,44,55];
var arr1 = new Array(22,33,44,55);
btn[0].onclick= function(){
alert("数组的长度为:"+arr.length);
}
btn[1].onclick= function (){
alert("数组的长度为:"+arr1.length);
}
基本操作
● 存取数组元素
a. 单维数组 数组名[下标索引];
b. 多维数组 数组名"[外层下标]"[内层下标]
c. 特性 (数组长度是弹性的; 数组的下标从0开始;下标的类型:数值或者非数值)
● 增加数组 使用“【】”运算符指定一个新下标
● 删除数组 delete 数组名[下标]
● 遍历数组 for...in
数组属性
● constructor 引用数组对象的构造函数
● length 返回数组的长度
● prototype 通过增加属性和方法扩展数组定义
ECMAScript3 数组方法
● 添加
a. push() 在数组末尾添加数组 (push-shift:队列方法,先进先出; push-pop: 栈方法,后进先出)
b. unshift() 在数组头部添加元素
c. concat()合并两个数组
● 删除
a. pop() 删除并返回数组的最后一个元素
b. shift() 删除并返回数组的第一个元素
![](https://img.haomeiwen.com/i4465616/ff39850d24cac9eb.gif)
var btn = document.getElementsByTagName("button");
var arr = [1,2,3,4,5,6,7];
btn[0].onclick = function(){
alert(arr.length);
}
btn[1].onclick = function(){
arr.length = 3;
alert(arr.length);
}
btn[2].onclick = function(){
arr.push("我来了");
alert(arr);
}
btn[3].onclick = function(){
arr.pop();
alert(arr);
}
btn[4].onclick = function(){
arr.unshift('我到前面来了');
alert(arr);
}
btn[5].onclick = function(){
arr.shift();
alert(arr);
}
btn[6].onclick = function(){
let res = arr.concat('合','并')
alert(res);
}
● 子数组
a. splice()
■ 删除任意数量的项 (要删除的起始下标,要删除的项数)
■ 在指定位置插入指定的项 (起始下标,0不要删除任何项,要插入的项)
■ 替换任意数量的项 (起始下标,要删除的项数,要插入的项)
b. slice()
■ 功能 从已有数组中选取部分元素构成新数组
■ 参数 (返回项的起始位置,返回项的结束位置)
![](https://img.haomeiwen.com/i4465616/6c39f57ed2f8dae8.gif)
var btn = document.getElementsByTagName("button");
var arr = [1,2,3,4,5,6,7]
btn[0].onclick= function(){
arr.splice(1,4);
alert(arr);
}
btn[1].onclick= function(){
arr.splice(2,0,"我要烟");
alert(arr);
}
btn[2].onclick= function(){
arr.splice(2,2,"b","c");
alert(arr);
}
btn[3].onclick= function(){
let res = arr.slice(0,4);
alert(res);
}
● 数组排序
a. reverse() 颠倒数组中元素的顺序
b. sort()
■ 功能 对字符数组或数字数组进行排序
■ 特性 默认为字符串比较,按数值大小比较,需函数支持
● 数组转换
a. toString() 转换为字符串并返回
b. toLocaleString()转换为本地格式字符串并返回
c. join() 使用指定分隔符分割数组并转换为字符串
![](https://img.haomeiwen.com/i4465616/a75cf0496642936e.gif)
var btn= document.getElementsByTagName("button");
btn[0].onclick=function(){
var a =[1,2,3];
var b = [4,5,6];
var c = a.concat(b);
alert(c)
}
btn[1].onclick=function(){
var a =[1,2,3,4,5,6,7];
var c= a.join("x");
alert(c)
}
btn[2].onclick = function(){
var yel = ["yellow","red","green","blue","orange"]
yel.sort();
alert(yel);
}
btn[3].onclick =function(){
var a = [22,15,65,198,23,55,3,42];
a.sort(function(x,y){
return y-x;
})
alert(a)
}
btn[4].onclick =function(){
var a = [22,15,65,198,23,55,3,42];
a.sort(function(x,y){
return x-y;
})
alert(a)
}
ECMAScript数组方法
● 位置方法
a. indexOf 从数组的起始位置开始查找(要查找的项,表示查找起点的位置索引)
b. lastIndexOf 从数组的结束位置开始查找
![](https://img.haomeiwen.com/i4465616/8c0231e530b51026.gif)
var btn= document.getElementsByTagName("button");
btn[0].onclick=function(){
var a = ['烟','雨','蒙蒙','唱','扬','州'];
var res = a.indexOf('唱')
alert(res)
}
btn[1].onclick=function(){
var a = ['烟','雨','蒙蒙','唱','扬','州'];
var res = a.lastIndexOf('唱')
alert(res)
}
● 迭代方法
a. every 如果该函数对每一项都返回true,则返回true
b. filter 返回值为true的所有数组成员
c. forEach 无返回值
d. map 返回每次函数调用的结果数组
e. some 有任意一项返回true,则返回true
![](https://img.haomeiwen.com/i4465616/f262012ac0b5e9e1.gif)
var btn= document.getElementsByTagName("button");
var a = [23,45,57,112,24,56,30]
btn[0].onclick=function(){
var res = a.every(function(item){
return item%2==0
})
alert(res)
}
btn[1].onclick=function(){
var res = a.filter(function(item){
return item%2 == 0;
})
alert(res)
}
btn[2].onclick=function(){
var res = a.map(function(item){
if(item%2==0) {
return item + '是偶数'
}else {
return item + '非偶数'
}
})
alert(res)
}
btn[3].onclick=function(){
var res = a.some(function(item){
return item%24
})
alert(res)
}
● 缩小方法
a. reduce 从数组起始位置开始遍历
b. reduceRight 从数组末尾开始遍历 (传入参数:前一个值prev,当前值cur,项的索引index,数组对象array)
![](https://img.haomeiwen.com/i4465616/b482d6cfbdc6e5a5.gif)
var btn= document.getElementsByTagName("button");
var a = [43,22,16,88,10,8];
btn[0].onclick=function(){
let res = a.reduce(function(prev,cur,index){
return prev+cur;
})
alert(res)
}
var fruits = ['苹果','西瓜','葡萄','梨子','苹果','香蕉','西瓜','西瓜','梨子']
btn[1].onclick=function(){
let res = fruits.reduce(function(result,name){
if(name in result){
result[name]++;
}else {
result[name] = 1;
}
return result;
},{})
alert(JSON.stringify(res))
}
btn[2].onclick=function(){
let res = fruits.reduce(function(result, name){
if(result.indexOf(name) === -1) {
result.push(name)
}
return result;
},[])
alert(res)
}
var userInfo = [
{name: '张三',sex: '女', age: 25},
{name: '王五',sex: '男', age: 43},
{name: '李八',sex: '男', age: 12},
{name: '赵四',sex: '女', age: 19},
{name: '刘二',sex: '女', age: 23},
{name: '孙九',sex: '男', age: 14},
]
btn[3].onclick=function(){
function groupData(objArray,property){
return objArray.reduce(function(result,obj){
var key = obj[property];
if(!result[key]) {
result[key] = [];
}
result[key].push(obj)
return result;
},{})
}
let res = groupData(userInfo, 'sex')
alert('女:'+JSON.stringify(res['女']))
alert('男:'+JSON.stringify(res['男']))
}
网友评论