function hump(str){
var newStr = "", flag = false;
for(var i = 0 ; i<str.length; i++){
if(str[i]==='-'){
flag = true;
}else{
if(flag){
newStr += str[i].toUpperCase();
flag = false;
}else{
newStr += str[i];
}
}
}
return newStr;
}
var numberArray = [3,6,2,4,1,5]; 实现倒排,排序。
//顺排,倒排
var numberArray = [3,6,2,4,1,5];
//sort实现
var sortArr = numberArray.sort(function(a,b){
return a - b;
})
//倒排
var sortArr = numberArray.sort(function(a,b){
return b - a;
})
//2、变量问题
(function(){
var a = b = 3;
//a是局部变量,b是全局变量
//等价于 var a = b ,b = 3 ;
})();
console.log("a defined? " + (typeof a !== 'undefined'));
console.log("b defined? " + (typeof b !== 'undefined'));
var a = {
n:1
},
b = a ;
a.x = a = {n:2}
/*
(先寻找变量再赋值)第一阶段初始化的时候值已经保存下来了 a.x是a的引用指向x,此时x未声明所以此时指向null,a已经声明了,a指向堆中的常量{n:1},
第二阶段赋值, a指向堆中的常量{n:2},a.x指向a即指向常量{n:2}
需要注意的是此时a.x在第一阶段保存的引用是一开始a的变量位置,跟赋值过来的a已经不是一个变量了
*/
console.log(b)//{n:1}
console.log(a)//{n:2}
console.log(a.x)//undefined
var a = 2, b=1;
function temp(a){
//a有声明所以作为局部变量处理
a = 4 ;
console.log(a)//4
//b无声明所以当做全局变量
b = 4
console.log(b)//4
//全局变量处理
c = 5
console.log(c)//5
}
// temp()
// temp(4)
//如果将所在函数注释后会如何?ReferenceError: c is not defined
console.log(a)//2
console.log(b)//4
console.log(c)//5
写一个按照下面方式调用都能正常工作的 sum 方法
console.log(sum(2,3)); // Outputs 5
console.log(sum(2)(3)); // Outputs 5
function sum(){
var sum =0;
if(arguments.length<=1){
sum = arguments[0];
//只有一个情况下需要储存当前参数用作下次累加
return function(value){
sum += value
return sum;
}
}else{
return [].reduce.call(arguments,function(sum,value){
return sum+value;
},0)
}
}
//由此引出
/*
由此延伸call apply call,apply的不同点
call(context,arguments...) //arguments... 是若干个参数
apply(context,arguments) //arguments 是 数组
call的调用速度比apply快
相同点 改变函数执行的环境
第一次参数为null的时候指向windows
模拟实现call,apply?
见https://github.com/mqyqingfeng/Blog 获益良多
最关键的是
模拟的步骤可以分为:
将函数设为对象的属性
执行该函数
删除该函数
*/
IIFE (Immediately-Invoked Function Expression)
for(var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
//输出的是5个5
//解决方式
for(var i = 0; i < 5; i++) {
(function(i){
setTimeout(function() {
console.log(i);
}, 1000);
})(i)
}
//1 2 3 4 5
//那这个呢?
for(var i = 0; i < 5; i++) {
(function(){
setTimeout(function() {
console.log(i);
}, 1000);
})(i)
}
//i此时使用的还是外部的i 因为这样就是提供参数,但是函数本身没有形参
//es6解决办法?
for(let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
//可以延伸到什么部分?
console.log(5)
for(let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
console.log(5)
//执行顺序 5->5->1~4
//原因?eventLoop,再看一个
var start = new Date();
setTimeout(function(){
console.log(4)
var time = start - new Date();
console.log(`time is `)
},2)
setTimeout(function(){
console.log(4)
var time = start - new Date();
console.log(`time2 is `)
},0)
//time 是多少? 还有这个又是多少?
//基于 chrome 版本 59.0.3071.115(正式版本) (64 位)
/* 像定时器、计时器 Promise 这类的异步操作 是放在任务队列中的,只有js主进程栈中的任务执行完才会执行。详情见 http://www.ruanyifeng.com/blog/2014/10/event-loop.html
(基于0秒的setTimeout立即执行已过期)
*/
/*在nodejs中进行实验
hello
4
time2 is
4
time is
结果相同
但是在nodejs中 eventloop的运行机制与浏览器不一样(暂未深入了解,详情见阮老师的文章)
*/
js算法与应用
排序部分
快速排序
优化过的冒泡排序
数组去重
编写一个JavaScript函数,输入指定类型的选择器(仅需支持id,class,tagName三种简单CSS选择器,无需兼容组合选择器)可以返回匹配的DOM节点,需考虑浏览器兼容性和性能。
实现对象的clone
小题合集
生成[x,y]范围的随机整数
小数精度问题 0.2+0.1?
已知数组var stringArray = [“This”, “is”, “Baidu”, “Campus”],Alert出”This is Baidu Campus”
已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”
var numberArray = [3,6,2,4,1,5]; 实现倒排,排序。
怎样添加、移除、移动、复制、创建和查找节点
将一个#fffff类型的数据转换为rgb(255,255,255)形式
遍历ul中li的内容
查找一个对象是否具有某个属性
请写出以下执行结果
请写出以下执行结果
关于NaN ,NaN是一个数字吗? 判断NaN
变量问题
写一个按照下面方式调用都能正常工作的 sum 方法
IIFE (Immediately-Invoked Function Expression)
IIFE还有用处? 防止变量污染
类型问题
简便的类型转换
真假值
极假(falsy) false null undefined ' ' 0 NaN 其他都是真值