第五讲 函数
写一个获取非行间样式的函数
/**
*获取非行内样式
*
* @param {element} ele 需要获取样式的元素
* @param {string} attr 获取的样式属性名
* @returns
*/
function getCss(ele,attr){
if(!ele.currentStyle){
return getComputedStyle(ele)[attr];
}else{
return ele.currentStyle[attr];
}
}
说说你对作用域链的理解?
函数执行时会产生私有作用域,函数内部的函数执行又会产生一个子级作用域,这样一级一级形成作用域链的关系。函数内部使用变量时,先从当前作用域查找,如果没有,就逐级向上级作用域查找,一直找到全局作用域,如果没有就报错。
var x=1,y=z=0;
function add(n){n=n+1};y=add(x);
function add(x){n=n+2};z=add(x);
console.log(x,y,z);
1 undefined undefined
函数重名,最后变量都会覆盖函数,并且函数内部并没有返回值
请解释变量提提升(预解析)?
js代码运行之前,会先进行预解析
找到var的变量提前声明,先不赋值;找到function,声明并且赋值
函数内部预解析:①先进行函数作用域内部的预解析(var ,形参 ,function) ②形参赋值 ③从上往下执行代码
函数声明和函数表达式声明的区别?
函数声明预解析,声明并赋值,可以在创建之前调用
表达式声明,只声明变量不会赋值,不能在创建之前调用
Javascript两种变量范围有什么不同?
全局变量:直接声明在全局作用域的变量,在任何地方都能访问
私有变量:在函数内部声明的变量,私有变量在函数以外不能访问,函数的形参也是私有变量
第六讲 定时器与函数封装
定时器的分类?他们的区别及用法是什么?
//等待一段时间,执行一段代码,只执行一次
setTimeout(function(){},间隔时间)
//每隔一段时间执行一个函数,反复运行
setInterval(function(){},间隔时间)
第七讲 时间对象&字符串对象
js有哪些内置对象?
String 字符串对象 | Array 数组 | Boolean 布尔对象 |
Number 数值对象 | Object 基础对象 | Arguments 函数参数集合 |
Error 异常对象 | Function 函数构造器 | Math 数学对象 |
RegExp 正则表达式对象 |
把下面的字符串去重,并去掉特殊字符按照数字在前字母在后的顺序排序字符串,如下:‘1233fddfd&3434fdsa&454545&4545444rfdsfd&545gdsgs’
var str = '1233fddfd&3434fdsaff&454545&4545444rfdsfds&545gdsgs';
var str1 = str.split('&').join('');
var obj = {};
for(var i=0;i<str1.length;i++){
obj[str1[i]] = str1[i];
}
var ary1 = [];
for(var key in obj){
ary1.push(key);
}
console.log(ary1.join(''))
截取字符串‘abcdefg’中的def。
var str = 'abcdefg';
str = str.substring(3,6);
console.log(str);
有这样一个url:http://item.taobao.com/item?a=1&b=2&c=&d=xxx&e,请写一段js程序提取url中各个get参数(参数名和参数个数不确定),将其key-value形式返回到一个json结构中,如{a:'1',b:'2',c:'',d:'xxx',e:undefined}
var str1 = 'url:http://item.taobao.com/item?a=1&b=2&c=&d=xxx&e';
function format(str){
var obj = {};
str = str.substring(str.indexOf('?')+1);
str = str.split('&');
for(var i=0;i<str.length;i++){
var ary = str[i].split('=');
obj[ary[0]] = ary[1];
}
return obj;
}
console.log(format(str1));
判断一个字符串中出现次数最多的字符,并且统计次数。
/**
*判断一个字符串中出现次数最多的字符,并且统计次数
*
* @param {string} str 自定义字符串
* @returns ary 数组中返回次数最多的字符
*/
function numString(str){
// 取出字符串中每一个字符,作为对象的属性,如果第一次添加,值设为1;若已存在值+1
var obj = {};
for(var i=0;i<str.length;i++){
if(obj[str[i]]){
obj[str[i]] += 1;
}else{
obj[str[i]] = 1;
}
}
// 判断次数出现最多的属性
var max = 0;
for(var key in obj){
if(obj[key]>max){
max = obj[key];
}
}
console.log(max);
//将出现最多的添加到数组中,并在数组中输出
var ary = [];
for(var key in obj){
if(obj[key] == max){
ary.push(key);
// console.log(key+'出现次数最多,出现'+max+'次');
}
}
return ary,max;
}
第八讲 数组&Math
数组方法pop() push() unshift() shift()?
pop() | push() | unshift() | shift() | |
---|---|---|---|---|
功能 | 在数组末尾删除一项 | 在数组末尾添加项 | 在数组的开头添加项 | 在数组的开头删除项 |
参数 | 不需要 | 添加到数组的项,多项逗号隔开 | 添加到数组的项,多项逗号隔开 | 不需要 |
返回值 | 删除的项 | 数组的新长度 | 数组的新长度 | 删除的项 |
原数组是否改变 | 改变 | 改变 | 改变 | 改变 |
split() join()的区别?
(1)split()用于分割字符串,返回一个数组
split()只有一个参数时:分割的字符串或正则表达式;两个参数时,第二个参数是指返回的数组中元素的个数;
(2)join()把数组的每一项以指定的连接符连成字符串,返回值为一个字符串;
参数是连接符,默认是逗号,空字符串表示没有连接符
编写一个数组去重的方法。
//数组去重
//方法一,利用对象
/* var obj = {};
for(var i=0;i<arr.length;i++){
obj[arr[i]] = arr[i];
}
var arr1=[];
for(var key in obj){
arr1.push(key);
} */
//方法二,双循环
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--;
}
}
}
console.log(arr);
['1','2','3'].map(parseInt)答案是多少?
[1,2,3].map(parseInt)返回[1,NaN,NaN]
冒泡算法排序?
//冒泡算法 数组排序
var arr=[3,4,1,1,1,6,7,1,0,1,3,11,2,4,2,4];
for(var i=0;i<arr.length-1;i++){
for(var j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
var temp = arr[j];
arr[j]=arr[j+1];
arr[j+1] = temp;
}
}
}
//选择排序
/* for(var i=0;i<arr.length;i++){
for(var j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
console.log(arr); */
第九讲 DOM
DOM怎么添加、移除、移动、复制、创建和查找节点
①创建:document.creatElement('li')
②添加:parentNode.appendChild(childNode)
③在指定元素之前插入节点:refNode.parentNode.insertBefore(newNode,refNode)
④替换:oldNode.parentNode.replaceChild(newNode,oldNode)
⑤移除,删除:
delNode.parentNode.removeChild(delNode)
delNode.remove();//不兼容
⑥查找:
getElementsByTagName() //通过标签名称
getElementsByName() //通过元素的Name属性的值
getElementById() //通过元素Id,唯一性
⑦复制:
Node.cloneNode() //浅克隆,只复制标签本身
Node.cloneNode(true) //深克隆,复制标签本身以及所有后代
appendChild()、insertBefore()、replaceChild()这三个方法如果操作的是页面上已经存在的节点,那么就是进行位置的移动。