JavaScript初阶(八)---------- 类数组、错误类型、ES5严格模式
类数组
类数组本质上是对象,它的原型指向的是Object,而数字的原型指向的是Array。之所以叫它类数组是因为他长得确实像数组,不具备数组的一些方法,准确的来说它叫对象数组。
function test(){
arguments.push(1);
}
test(1,2,3,4,5,6)
//报错:arguments.push is not a function ;
它有三大特点:
1.可以利用属性名模拟数组的特性
2.可以动态的增长length属性
3.如果强行让类数组调用push方法,则会根据length属性值的位置进行属性的扩充。
最典型的类数组是arguments,实参列表。当我们手动创建一个类数组如下:
var obj = {
"0" : "a",
"1" : "b",
"2" : "c",
"length" : 4,
"push" : Array.prototype.push
"splice" : Array.prototype.push
}
当加上length的时候,形式上就会变成数组,但是这时候,数组的方法还不能够使用,当我们手动添加一个数组方法,他就具有数组的特性,这种东西就叫类数组,可以当做数组来操
作,然后,当我们加上splice这个属性的时候,它就会形式上也会变成数组的展现形式了。但是实际上也还是对象。
我们如果要使用类数组就得特别注意length,因为系统是根据length操作类数组。
var obj = {
"0" : "a",
"1" : "b",
"2" : "c",
"length" : 4,
"push" : Array.prototype.push,
"splice" : Array.prototype.push
}
obj.push("e");
看看最后obj是什么?
可以发现当我们设置length为4的时候,再往类数组里面添加东西,length也会变化,并且空位用empty补上
当我们把length变成2,obj会变成什么样,我们再来看看
此时length变为3,类数组第三位被取代。
类数组的优点是既能当数组用,又能当对象用,操作范围广。
将类数组转换为数组可以添加一个方法slice( ),在对象obj里加上
slice : Array.prototype.slice
然后通过obj.slice( )转变为数组。
这里顺便简单说一下splice( )与slice( )的区别
slice( )
slice( ) 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。不会影响原数组
splice( )
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。会改变原数组。
错误类型
Error.name的六种值对应的信息: 1.EvalError ------> eval() 的使用与定义不一致
2.RangeError ---------> 数值越界
3.ReferenceError ----------> 非法或不能识别的引用数值
4.SyntaxError ------------> 语法解析错误
5.TypeError -----------> 操作类型错误
6.URLError -----------> URL处理函数使用不当
try.....catch
由于js是单线程,当遇到逻辑错误的时候就会阻塞后面的程序运行,有时候我们需要及时报错,也能继续往下执行,不发生阻塞,这时候就要用到try....catch了
try{
console.log(123);
console.log(a);//不报错 跳到catch。如果没错,就直接跳过catch
console.log(234);
}catch(e){//捉住报错信息。
console.log(e)
}
我们来看看结果
报错信息被捕捉到送给catch并且被打印出来。
try catch对于一些低级错误(例如:语法错误)不能捉住。当报错的时候,系统会把错误信息作为一个实参,传到catch里面,这个实参有两个属性,分别是name,和message,错误
的名称,和错误的信息。但是实际开发中,可见性的错误都要利用兼容解决。
ES5严格模式
ES5是ES3的升级版,现在快到ES8了。现在讲的东西都是ES3的,每次升级,都是在原有的基础上进行功能的增删改,所以有时候会产生兼容性的问题,产生冲突。当产生冲突时,
默认的是优先使用ES3的。但是我们需要使用ES5的功能时,我们需要使用严格模式。在逻辑的最前写”use strict”,就会进入ES5严格模式。为什么要使用”use strict”的形式呢?因为这
种写法兼容性是最好的,在ES3引擎也能解析。
function exp(){
"use strict";
//code
}
两种用法 1.全局严格模式 2.局部函数内严格模式
在严格模式下,不支持with , arguments.callee , func.caller,变量赋值前必须声明,局部this必须被赋值(Person.call(null/undefined) 赋值什么就是什么),拒绝重复属性和参数。
1.with语句,可以改变作用域链,直接看到最顶端,提供一个执行上下文。很浪费效率,很浪费性能。如果指向的顶层作用域,没有需要的变量,又会在自己的作用域进行查找。当然,with
可以与命名空间进行联合使用
var obj = {
a : "ooo"
}
var a = "global";
function test(){
var a = "test";
with(obj){
console.log(a);//ooo 这个时候,with直接到了obj中取索要a变量。
}
}
test();
2.不能使用未声明的变量,this也必须说明是什么指向。
3.拒绝重复的参数和属性。