JavaScript语句/对象
块语句: {语句1;语句2;语句3...} 有函数作用域、全局作用域、value作用域,没有块级作用域 var a=b=1:a是局部变量,b是全局变量
try-catch语句
try{ try{ throw new Error("opps"); }finally{ console.log("finally"); } }catch(ex){ console.error("outer",ex.message); }
抛出顺序为:finally,outer,oops;
try{ try{ throw new Error("oops"); }catch(ex){ console.error("inner",ex.message); }finally{ console.log("finally"); } }catch(ex){ console.error("outer",ex.message); }
抛出顺序为:inner,oops,,finally; 异常在内部处理过了,所以不会抛出到外面再去处理。
.try{ try{ throw new Error("oops"); }catch(ex){ console.error("inner",ex.message); }finally{ console.log("finally"); } }catch(ex){ console.error("outer",ex.message); }
抛出顺序为:inner,oop,finally,outer,oops; 内部的异常没有处理需要到外面去处理,处理前需先执行finally;
! function (){}(1) 表示该函数是一个函数表达式而不是函数声明,后面的(1)是将参数1传递进去,前面的!,可以理解成它是将函数声明转化成函数表达式的一种方法。 !function (){}(1)也等同于(function (){})(1);,!也可换成+、-这样的一元运算符,都可以起到相同的作用。 函数也是一种对象,arguments是它的一个属性,函数的属性还包括name,length等等。 arguments是参数对象的意思,不用写形参在函数上,也可以获取到函数上放进来的实参,利用arguments.length来获取参数个数,arguments[0],来获取第一个实参.
创建对象,new/原型链
function foo(){} foo.prototype.z = 3; var obj = new foo(); obj.z; //3 typeof obj.toStirng; // 'function' 'z' in obj; // true; obj.hasOwnProperty('z'); // false
obj.z=5; // 若 obj 上没有 z 这个属性,就添加,有的话就修改值 obj.hasOwnProperty('z'); // true foo.prototype.z; // still 3 obj.z; // 5 obj.z = undefined; ojb.z; // undefined --> delete obj.z; // true 删除 obj 上的 z obj.z; // 3
Object.create创建对象
var obj = Object.create({x:1}); obj.x; // 1 typeof obj.toString // "function" obj.hasOwnProperty('x'); // false var obj = Object.create(null); obj.toString // undefined
设置属性值时,如果当前对象没有这个属性,则会通过原型链向上查找这个属性。 1 如果原型上是通过get/set方法来定义的这个属性,那么读写都只会通过get/set方法;这种情况下只能通过Object.defineProperty来为当前对象添加这个属性。 2 如果原型上就是普通的属性赋值,那么会给当前对象增加一个属性
属性标签:
不定义默认为false
value:值
writable:可修改性
enumerable:可枚举性 与for-in有关
configurable:可删除性 与delete有关
一次性定义多个属性的方法:Object.defineProperties(obj,{属性1:{属性标签们}, 属性2:{属性标签们}, ……})
Object.preventExtensions():设置对象的 extensible 标签为 false,不改变对象的属性的标签; Object.seal(): 设置对象的 extensible 标签为 false,同时改变对象的属性的 configurable 标签为 false; Object.freeze(): 设置对象的 extensible 标签为 false,同时改变对象的属性的 configurable 标签为 false 和 writable 标签为 false;