JavaScript基础之三

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));
  1. 老师写内容一般都写到一个方法里面去,而不是在全局写
  2. 居然可以 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();   //报错
  1. 函数表达式对外界来说是忽略函数名的!你在外界执行它是不管用的 a( )
  2. 但是又可以打印出函数名 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);
  1. 超出数组长度 打印出的结果不会报错而是undefined arr[100]
  2. 数组里头元素,你虽然占了一项 且是empty 但是打印出来还是 undefined
  3. 数组前面的,是认的。数组结尾的,是不认的
  4. 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严格模式

专业素养问题:

ECMAScript的历程
正常模式

严格模式 ‘use strict’

  1. 在脚本内部最上一行写,启动严格模式
  2. 在函数或者模块内部写 (这个是推荐的)

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时

垃圾回收机制

  1. 找出不再使用的变量
  2. 是放弃占用内存
  3. 固定时间间隔运行

闭包解除引用

function test1(){
    var a = 1;
    return function (){
        a++;
        console.log(a);
    }
}

var test = test1();
test();
test();
test();
// 闭包解除引用
test = null;
test();

标记清除 mark and sweep

每次来执行的时候,首先排除全局环境变量和闭包所形成的AO那些变量。排除以后仍然存在的变量视为要清除的变量(有离开环境标记的就会把它清除掉)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值