标签:lin ++ default define 也会 指示 hello attr typeof
如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为 null 而不是其他值,这样 一来,只要直接检查 null 值就可以知道相应的变量是否已经保存了一个对象的引用 console.info(typeof null) //object var a=null; if(a!=null){ // } console.info(Number.MAX_VALUE,Number.MIN_VALUE) console.info(Number.MAX_VALUE+Number.MAX_VALUE) //+Infinity console.info(isFinite(Number.MAX_VALUE+Number.MAX_VALUE)) //是否在最大最小之间 var str=new String() console.info(str.__proto__===String.prototype) console.info(str.hasOwnProperty(‘length‘)) console.info(str.__proto__.hasOwnProperty(‘trim‘)) //constructor 保存着用于创建当前对象的函数 console.info(str.constructor===String) //执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的 //后置递增和递减操作是在包含它们的语句被求值之后才执行的 var x=10; console.info(--x-20) //-11 console.info(--x)//8 console.info(x++ +2)//10 console.info(x)//9 //逗号操作符 var x=1,y=2,z=3; //执行多个操作 //逗号操作符还可以用于赋值。在用于赋值时,逗号操作符总会返回表达式中的最后一项 var m=(1,2,3,4,5) console.info(m) //5 //ECMAScript 中的所有参数传递的都是值,不可能通过引用传递参数。 //即使参数变量是按值传递的, obj 也会按引用来访问同一个对象 //错误的说法:在局部作用域中修改的对象会在全局作用域中反映出来,就说明参数是按引用传递的是 function a(halo){ halo.name="leyi"//按引用开访问obj } var obj=new Object();//ojbj={} a(obj); console.info(obj.name)//leyi function b(halo){ halo.name=2; halo=new Object(); halo.name=4; } var obj2=new Object();//json={} b(obj2) console.info(obj2.name) //2 //检测基本类型 undefined boolean string number console.info(typeof 123) //number console.info(typeof "123") //string console.info(typeof true) //boolean console.info(typeof null) //object //检测确定一个值是哪种引用类型可以使用instanceof 操作符。 var a={} var b=[1,2,3] var reg=/.+?/ console.info(a instanceof Object) //true console.info(b instanceof Array) //true console.info(reg instanceof RegExp) //true //这个方法的目的是最终确定某个值到底是不是数组 console.info(Array.isArray([1,2,3,4])) Es5 为数组定义了5个迭代方法 filter forEach map every //对数组中的每一项运行给定函数,如果该函数对每一项都返回 true ,则返回 true some //对数组中的每一项运行给定函数,如果该函数对任一项返回 true ,则返回 true 。 //Es5 还新增了两个归并数组的方法 /* reduce() 和 reduceRight() 。这两个方法都会迭 代数组的所有项,然后构建一个最终返回的值。其中, reduce() 方法从数组的第一项开始,逐个遍历 到最后。而 reduceRight() 则从数组的最后一项开始,向前遍历到第一项*/ var arr=[1,2,3,4,5] var allinone=arr.reduce(function(prev,cur,index,array){ /*函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第 一个参数是数组的第一项(prev),第二个参数就是数组的第二项*/ return prev+cur }) console.info(allinone) //数据属性的4个特性 数据属性包含一个数据值的位置。在这个位置可以读取和写入值。 //修改默认特性用Object.defineProperty(obj, prop, descriptor) descriptor包含下面四个配置参数 //Configurable 能否通过 delete 删除属性从而重新定义属性或者能否把属性修改为访问器属性 Defaults to false //Enumerable 表示能否通过 for-in 循环返回属性 Defaults to false //Writable 表示能否修改属性的值 Defaults to false //Value 包含这个属性的数据值 Defaults to undefined var obj={}; Object.defineProperty(obj,‘name‘,{ configurable:false, value:"leyi" }) console.info(obj) //{name: "leyi"} delete obj.name console.info(obj) //{name: "leyi"} //访问器属性的4个特性 访问器属性不包含数据值;它们包含一对儿 getter 和 setter 函数(这两个函数都不是必需的)。 //这是使用访问器属性的常见方式,即设置一个属性的值会导致其他属性发生变化 //Configurable //Enumerable //Get 在读取属性时调用的函数。默认值为 undefined //Set 在写入属性时调用的函数。默认值为 undefined var obj2={ attr1:‘qieizi‘, attr2:"jiucai" } Object.defineProperty(obj2,"attr3",{ get:function(){ return this.attr1 }, set:function(newVal){ if( newVal== "qieizi"){ this.attr2="hello world!" } } }) obj2.attr3="qieizi" console.info(obj2) //{attr1: "qieizi", attr2: "hello world!"} //创建访问器属性,一般都使用两个非标准的方法:__defineGetter__() 和 __defineSetter__() //只指定 getter 意味着属性是不能写 只指定 setter 函数的属性也不能读 var obj3={ _flag:1000, date:2017 } obj3.__defineGetter__("flag",function(){ return this._flag }) obj3.__defineSetter__("flag",function(newVal){ if(newVal>1000){ this._flag=newVal this.date=2018 } }) obj3.flag=1001 console.info(obj3) //定义多个属性 Object.defineProperties() var obj4={ } Object.defineProperties(obj4,{ /*定义数据属性*/ name:{ value:"leyi" }, flag:{ value:100 }, /*定义访问器属性*/ date:{ get:function(){ return this.name }, set:function(newVal){ this.flag+=1 } } }) //Object {name: "leyi", flag: 100} console.info(obj4) //{value: 100, writable: false, enumerable: false, configurable: false} console.info(Object.getOwnPropertyDescriptor(obj4,"flag")) //isPrototypeOf()函数用于指示对象是否存在于另一个对象的原型链中。如果存在,返回true,否则返回false。 console.info(Array.prototype.isPrototypeOf([1,2,3])) console.info(Object.prototype.isPrototypeOf([1,2,3])) //所有的的实例的原型链都指向Object.prototype // Object.getPrototypeOf() 访问原型 console.info(Object.getPrototypeOf([])) //Object.prototype //会报错 function halo(num){ if(num<4){ return halo(num+1) }else{ return num } } var world =halo; halo=null; console.info(world(0)) //halo is not a function // arguments.callee 是一个指向正在执行的函数的指针 ,因此可以用它来实现对函数的递归调用 function haha(num){ if(num<4){ return arguments.callee(num+1) }else{ return num } } console.info(haha(0)) //在严格模式下会报错,可以使用命名函数表达式来达成相同的结果 var hehe=function h(num){ if(num<4){ return h(num+1) }else{ return num } } console.info(hehe(0))
标签:lin ++ default define 也会 指示 hello attr typeof
原文地址:http://www.cnblogs.com/leyi/p/7143648.html