类数组本质上是对象,它的原型指向的是Object,而数字的原型指向的是Array。之因此叫它类数组是由于他长得确实像数组,不具有数组的一些方法,准确的来讲它叫对象数组。数组
function test(){
arguments.push(1);
}
test(1,2,3,4,5,6)
//报错:arguments.push is not a function ;
它有三大特色:函数
1.能够利用属性名模拟数组的特性性能
2.能够动态的增加length属性 this
3.若是强行让类数组调用push方法,则会根据length属性值的位置进行属性的扩充。spa
最典型的类数组是arguments,实参列表。当咱们手动建立一个类数组以下:prototype
var obj = {
"0" : "a",
"1" : "b",
"2" : "c",
"length" : 4,
"push" : Array.prototype.push
"splice" : Array.prototype.push
}
当加上length的时候,形式上就会变成数组,可是这时候,数组的方法还不可以使用,当咱们手动添加一个数组方法,他就具备数组的特性,这种东西就叫类数组,能够当作数组来操线程
做,而后,当咱们加上splice这个属性的时候,它就会形式上也会变成数组的展示形式了。可是实际上也仍是对象。code
咱们若是要使用类数组就得特别注意length,由于系统是根据length操做类数组。对象
var obj = {
"0" : "a",
"1" : "b",
"2" : "c",
"length" : 4,
"push" : Array.prototype.push,
"splice" : Array.prototype.push
}
obj.push("e");
看看最后obj是什么?blog
能够发现当咱们设置length为4的时候,再往类数组里面添加东西,length也会变化,而且空位用empty补上
当咱们把length变成2,obj会变成什么样,咱们再来看看
此时length变为3,类数组第三位被取代。
类数组的优势是既能当数组用,又能当对象用,操做范围广。
将类数组转换为数组能够添加一个方法slice( ),在对象obj里加上
slice : Array.prototype.slice
而后经过obj.slice( )转变为数组。
这里顺便简单说一下splice( )与slice( )的区别
slice( ) 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。不会影响原数组
splice() 方法向/从数组中添加/删除项目,而后返回被删除的项目。会改变原数组。
Error.name的六种值对应的信息: 1.EvalError ------> eval() 的使用与定义不一致
2.RangeError ---------> 数值越界
3.ReferenceError ----------> 非法或不能识别的引用数值
4.SyntaxError ------------> 语法解析错误
5.TypeError -----------> 操做类型错误
6.URLError -----------> URL处理函数使用不当
因为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是ES3的升级版,如今快到ES8了。如今讲的东西都是ES3的,每次升级,都是在原有的基础上进行功能的增删改,因此有时候会产生兼容性的问题,产生冲突。当产生冲突时,
默认的是优先使用ES3的。可是咱们须要使用ES5的功能时,咱们须要使用严格模式。在逻辑的最前写”use strict”,就会进入ES5严格模式。为何要使用”use strict”的形式呢?由于这
种写法兼容性是最好的,在ES3引擎也能解析。
function exp(){
"use strict";
//code
}
在严格模式下,不支持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.拒绝重复的参数和属性。