JavaScript day013

101 阅读3分钟

Error错误对象

以后工作/学习中目的:
	1、快速找错
	2、记得有的时候可能要防一手用户

1、*浏览器自带4种错误类型,可以快速找到自己的错误:

	语法错误:SyntaxError - 多半都是语法/符号错了
	引用错误:ReferenceError - 没有创建过就去使用了
	类型错误:TypeError - 不是你的方法/属性,你却使用了
	范围错误:RangeError - 只有一个API:num.toFixed(d);//d取值范围的,0~100之间

2、只要发生错误,就会报错

只要发生错误,就会报错,会导致后续代码终止执行了(后面代码没效果、如果你做的是APP、软件发生报错,则会闪退,体验感差),我们不希望

错误处理:就算发现错误,我们也不希望报错,而是给一个错误提示,后续代码依然可以继续执行
     语法:
	try{
		只放可能出错的代码
	}catch(err){
		只有发生错误后才会执行
	}

     try...catch...的性能非常差,几乎是所有代码中效率最差的
     *可用一个技术代替:if...else...
     *开发经验:提前预判用户:记住一切的客户端输入/用户输入都是坏人 - 你也不必担心,只要做好你该做的防护即可(!isNaN、正则);

try...catch...用if...else...代替案例

    <script>
        //程序员甲:自定义了一个toFixed方法,但是要求传入的必须要是数字或可以被隐式转为数字的东西,但凡传入了别的就会报错!
        function round(num, d) {
            if (!isNaN(num) && !isNaN(d)) {
                num *= 10 ** d;
                num = Math.round(num)
                num /= 10 ** d;
                return num;
            } else {
                throw new Error("傻逼,传入的必须是两个数字");
            }
        }
        //2、程序员乙:结账系统,允许用户输入收款金额和应收金额,计算找零,但是为了解决舍入误差,他使用了程序员甲提供的方法,实现错误处理(两种方式:try...catch...  if...else...)
        var money = prompt("收款金额");
        var total = prompt("应收金额");
        /* try {
            console.log("找零:" + round(money - total, 2))
        } catch (err) { 
            alert(err);
        } */
        if (!isNaN(money) && !isNaN(total)) {
            console.log("找零:" + round(money - total, 2));
        } else {
            alert("傻逼,传入的必须是两个数字")
        }


        console.log("后续代码")
    </script>

3、抛出自定义错误:

throw new Error("自定义错误描述");

*Function

1、*创建:3种

*声明方式:function 函数名(形参列表){函数体 return 返回值} - 具有完整的声明提前

直接量方式:var 函数名=function(形参列表){函数体 return 返回值} - 只提前函数名部分,函数名其实就是一个变量名

*构造函数:var 函数名=new Function("形参1","形参2",.....,"函数体");
何时:如果你的函数体不是固定的,而是动态拼接的(函数体现在毕竟是一个字符串)

2、调用:var 接住结果=函数名(实参列表);

3、考点

1、***如何创建(之前笔记)
2、***什么是作用域(之前笔记)
3、***什么是声明提前(之前笔记)
4、***什么是按值传递(之前笔记)

5、*重载

什么是重载:相同的函数名,传入不同的实参,可以自动选择对应的函数执行
为什么:减轻程序员的压力

问题:JS的语法不支持重载的!
JS不允许多个同名函数同时存在,如果同时存在,最后的会覆盖之前所有的

解决:在【函数中】有一个对象 - arguments对象
什么是arguments:自动创建的,是一个类数组对象,不是数组!作用:***接受住所有的实参***,

以后有没有形参无所谓了,变相的实现了重载,可以在函数内部判断arguments的不同,执行不同的操作
			只有3个点和数组相同:
				1、都有下标
				2、都有length
				3、都可以遍历

正式开发中,开发结束后,需要做代码的优化,可能就会将多个函数整合为一个函数

6、*匿名函数(2种)

匿名函数:没有名字的函数,理论上来说我们无法调用	

1、自调:函数自己调用自己
			语法:
				(function(){
					//代替全局代码
				})();

			特点:自调的代码只能执行一次 === 全局代码
			为什么:节约内存,因为匿名函数,没有变量引用着,用完后,就会立刻释放
			
2、回调:将函数作为了实参,传递给其他函数使用
				1、学习回调的目的:让你们知道哪些叫回调,匿名函数,只要不是自调,就是回调
					arr.sort(function(a,b){return a-b})
					str.replace(reg,function(){})
					btn.onclick=function(){}

				2、以后ES6有一个技术:箭头函数:简化一切的【回调函数】

				3、了解了以下回调函数的原理 - 其实不是没调,只是我们没调用,前辈们早就帮我们调用好了