1、判断 str 是否以aoeiu(大小写)结尾
<script>
// 'aoeiu'
// 法一 处理code code.some()
function check(str){
let code = 'aoeiu'.split('')
code = code.concat(code.map(r=>r.toUpperCase()))
return code.some(c=>str.endsWith(c))
}
//法二 处理str str.toLowerCase()
function check(str){
str=str.toLowerCase();
let code = 'aoeiu'.split('')
return code.some(c=>str.endsWith(c))
}
//法三 字符串是否包含 .includes()
function check(str){
let lastCode = str.toLowerCase()[str.length-1];
return 'aoeiu'.includes(lastCode)
}
//法四 正则表达式
function check(str){
return /[aoeiu]$/i.test(str);
}
console.log(check("aha"));
console.log(check("ahA"));
console.log(check("ahh"));
</script>
2、找出字符串中出现最多的字符
<script>
function getMaxCode(str){
let obj={};
let res = {code: '' , count: 0}
for(let i = 0 ; i < str.length ; i++){
//如果字符出现过 就++;
//如果没有出现过,就赋初值1
let code = str[i];
if(!obj[code]) obj[code]=1;
else obj[code]++;
}
for(let o in obj){ // Object.keys(obj).forEach(k => { });
let c = obj[o]
if(c > res.count){
res = {code: o , count: c}
}
// console.log(obj[o]);
}
return res
}
//优化 一个循环
function getMaxCode(str){
let obj={};
let res = {code: '' , count: 0}
for(let i = 0 ; i < str.length ; i++){
//如果字符出现过 就++;
//如果没有出现过,就赋初值1
let code = str[i];
if(!obj[code]) obj[code]=1;
else{
obj[code]++;
}
if(obj[code] > res.count){
res = {code , count: obj[code]}
}
}
return res
}
console.log(getMaxCode("ahahahahssxxxxxxsh"));
console.log(getMaxCode("ahA"));
console.log(getMaxCode("ahh"));
</script>
3、let const var
- var可以变量提升 - 为undefined let和const无,报错
- let和const有块级作用域
<script>
var a = 10
var b = 11
var c = 12
function test(a){ //相当于在函数里var a
a = 1
var b = 2
c = 3 //无块级作用域 直接用前面的
}
test(100)
console.log(a); //10
console.log(b); //11
console.log(c); //3
</script>
4、闭包
<script>
var n = 0
function a(){
var n = 10
function b(){ //b是a的闭包函数
n++; // 闭包引用的是外部的局部变量 非全局变量 “自己的小金库”
console.log(n);
}
b()
return b
}
var c=a() // 11
c() // 1× 11× 12 闭包维持了函数状态
console.log(n); //0
</script>
<script>
// 相当于
function a(){
var n = 10
return function b(){
n++
return n;
}
}
var c=a()
console.log(c()); //11
console.log(c()); //12
</script>
5、判断this指向
<script>
var obj2 = {
age : 18,
foo : function (func) {
console.log(this.age);
}
}
obj2.foo() // 1、18
let zz = obj2.foo
zz() //2、window. undefined
</script>
<script>
var obj = {
age : 18,
foo : function (func) {
console.log(this.age); // 3、18
func() // 2、window.temp() -> 10
arguments[0]() // 4、相当于argument对象的0属性再调用 argument.0()
//-> 指向argument 没有age 故打印undefined
let zz = arguments[0]
zz() // 3、即window.temp() -> 10
}
}
var age = 10;
function temp(){
console.log(this.age);
}
// temp() //1、普通函数 即window.temp() -> 10
obj.foo(temp)
<script>
<script>
var num = 10 // 全局 window.num
var obj = { num : 20 } // obj.num
obj.fn = (function (num){ //对象的方法 立即执行函数
//1、立即执行函数全局调用 传入值20 window.name=60 局部name = 21 返回一个函数
this.num = num * 3
num++ // obj.name
return function (n){ //闭包函数
this.num += n;
num++
console.log(num);
}
})(obj.num)
var fn = obj.fn
fn(5) // 2、window.fn(5) window.num += 5 =>60+5=65 局部name = 22 打印一个22
obj.fn(10) // 3、obj.fn(10) obj.name += 10 =>20+10=30 局部name = 23 打印一个23
console.log(num,obj.num); // 4、65 30
</script>
函数调用的关键在于观察最相邻的调用者 , 闭包情况另判断。。
?
<script>
var age = "20"
var Tom={
age: "18",
show:function(){
console.log(this.age);
},
wait:function(){
this.show // Tom.show() show中this指向Tom -> 18
//?结果没有打印结果??
// var fun = this.show
// fun() //window.fun() show中this指向window -> 20
}
}
Tom.wait()
</script>