17时
自定义原型方法、去重、封装typeof
考题:
在下面的字符串中找出第一次出现的不重复的字母
‘truaiwrtwtruibowrtpoiwrcutwopirut’
var str = 'truaiwrtwtruibowrtpoiwrcutwopirut';
// 计算出现的次数
//------------------------------
// var obj = {};
// for(var i=0; i<str.length;i++){
// if(!obj.hasOwnProperty(str[i])){
// obj[str[i]] = 1;
// }else{
// obj[str[i]]++;
// }
// }
// console.log(obj);
// for(var key in obj){
// if(obj[key] == 1){
// console.log(key);
// break;
// }
// }
//----------------老师写的------------------
function test(str){
var temp = {};
for(var i = 0; i <str.length; i++){
if(temp.hasOwnProperty(str[i])){
temp[str[i]]++;
}else{
temp[str[i]] = 1;
}
}
for(var key in temp){
if(temp[key] === 1){
return key;
}
}
}
console.log(test(str));
- 老师写内容一般都写到一个方法里面去,而不是在全局写
- 居然可以 str[ i ],是包装类了嘛?待解决
闭包题:
function Test(a,b,c){
var d = 0;
this.a = a;
this.b = b;
this.c = c;
function e(){
d++;
console.log(d);
}
this.f = e;
}
var test1 = new Test();
test1.f();
test1.f();
var test2 = new Test();
test2.f();
1 2 1
题:
function test(){
console.log(typeof(arguments));
}
test(); // object
题:
var test = function a(){
return 'a';
}
console.log(typeof(a)); // undefined
a(); //报错
- 函数表达式对外界来说是忽略函数名的!你在外界执行它是不管用的 a( )
- 但是又可以打印出函数名 console.log(test.name);
如果是匿名函数就打印test(声明的变量名称),如果是有名字就答应出它的名字
(立即执行函数那的课还要听听)
题:
function test(day){
switch(day){
case 1:
console.log('Mon');
break;
case 2:
console.log('Tue');
break;
case 3:
console.log('Wed');
break;
case 4:
console.log('Thu');
break;
case 5:
console.log('Fri');
break;
case 6:
console.log('Sat');
break;
case 7:
console.log('Sun');
break;
default:
console.log('i don\'t konw' ); // 斜瞥转义了一下
}
}
// 如何化简?
function test(day){
var weekday = [
'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'
];
weekday[day-1] !== undefined ? console.log(weekday[day-1]) : 'i don\'t konw'
}
test(5);
// 不允许使用 day-1 直接weekday[day] 要怎么修改?
function test(day){
var weekday = [
,'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'
];
weekday[day] !== undefined ? console.log(weekday[day]) : 'i don\'t konw'
}
test(5);
- 超出数组长度 打印出的结果不会报错而是undefined arr[100]
- 数组里头元素,你虽然占了一项 且是empty 但是打印出来还是 undefined
- 数组前面的,是认的。数组结尾的,是不认的
- empty并不是值,它只是给你标识里头有元素是空的
var arr = [,1,2,,,4,5,];
console.log(arr[0]); //undefined
console.log(arr.length);
18时
(理解就行)
1. 错误信息类型
1.1 SyntaxError 语法错误
- 变量名不规范
- 关键字赋值
- 基本的语法错误
1.2 ReferenceError 引用错误
- 变量或者函数未被声明
- 给无法被赋值的对象赋值的时候
console.log(a) = 1;
1.3 RangeError 范围错误
- 数组长度赋值为负数
- 对象方法参数超出可行范围
var num = new Number(66.66);
console.log(num.toFixed(-1));
1.4 TypeErroe 类型错误
- 调用不存在的方法
123();
var obj = {};
obj.say();
obj.say 没有括号的时候是不报错的,js认为这只是一个属性没有赋值,但是一旦加了括号,它认为你是一个属性后面做了一个执行,所以报类型错误
- 实例化原始值
var a = new 'string';
var b = 123;
new 一定是要跟函数的
1.5 URIError URI错误
-
URI(统一资源标识符): UNIFORM RESOURCE IDENTIFIER
-
URL(统一资源定位符): UNIFORM RESOUCE LOCATOR
-
URN(统一资源名称): UNIFORM RESOUCE NAME
// URL:http://www.baidu.com/news#today
// ftp://www.baidu.com/ftp#developer
// URN:www.baidu.com/news#today -> ID
// href = "tel:13400000000"
// href = 'mailto:123455@qq.com'
encodeURI( ) 将url中的中文字转成中文编码字符
decodeURI( ) 将url中的中文编码字符转成中文字
这两个方法是js内置的方法
var myUrl = 'http://www.baidu.com?name=行行酱';
var newUrl = encodeURI(myUrl);
console.log(newUrl);
var newNewUrl = decodeURI(newUrl);
console.log(newNewUrl);
不按规则乱写 会报 URI malformed (畸形、怪异的)
var str = decodeURI('%ASDKFNA%')
1.6 EvalError eval函数执行错误
最大的最用:把json字符串转换成json对象,可循环的json对象然后把它们遍历出来
json对象的属性一般是用双引号的
json对象和json字符串里头是没有方法的
es3开始弃用,
1.7 记住还有一个总的 Error构造器
var error = new Error();
手动抛出错误的方法
try catch finally throw
throw可以自定义错误信息
2. ES5严格模式
专业素养问题:
正常模式
严格模式 ‘use strict’
- 在脚本内部最上一行写,启动严格模式
- 在函数或者模块内部写 (这个是推荐的)
IE9及以下IE不支持严格模式
- with( )
改变作用域 (会消耗性能)
-严格模式下用不了
callee 、caller 严格模式下不可以用
在严格模式下,不写var 会报错
严格模式下,函数中的this要赋值的,否则就是undefined 且严格模式下,this要通过call来赋值
a = 1; // 会报错
var a = b = 1; //会报错
function test(){
var a = b = 1; //会报错
}
// 和b ‘较上劲了’
function test(){
console.log(this);
}
test();
test.call(1);
new test(); // 这个的返回值要好好捋一下
//------------非严格模式---------------------
function test(){
console.log(this);
}
test.call(1); // 里头填的是原始值的话它会给你包装类一下
函数的参数不能重复
ES5拒绝你重复对象的属性名,但是它不会报错!
(笔试题很可能会出的哦,问你在严格模式下的结果)
//------------非严格模式---------------------
function test(a,a){
console.log(a);
}
test(1,2); //2
var obj = {
a:1,
a:2
}
console.log(obj.a); // 2
//------------严格模式---------------------
function test(a,a){
console.log(a);
}
test(1,2); //报错
var obj = {
a:1,
a:2
}
console.log(obj.a); // 2
严格模式下,eval有独立的作用域
//------------严格模式---------------------
eval(‘var a = 1; console.log(a)’);
console.log(a);
命名空间
- 用原生js做模块化
window.onload = function(){
init();
}
function init(){
initSlider;
initSideBar;
}
var initSlider = (function(){
var a = 1;
console.log(1);
})()
var initSideBar = (function(){
var a = 2;
console.log(a);
})()
- 用webpack
19时
垃圾回收机制
- 找出不再使用的变量
- 是放弃占用内存
- 固定时间间隔运行
闭包解除引用
function test1(){
var a = 1;
return function (){
a++;
console.log(a);
}
}
var test = test1();
test();
test();
test();
// 闭包解除引用
test = null;
test();
标记清除 mark and sweep
每次来执行的时候,首先排除全局环境变量和闭包所形成的AO那些变量。排除以后仍然存在的变量视为要清除的变量(有离开环境标记的就会把它清除掉)