码迷,mamicode.com
首页 > Web开发 > 详细

JS从头学

时间:2017-07-18 01:41:35      阅读:205      评论:0      收藏:0      [点我收藏+]

标签: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))

  

JS从头学

标签:lin   ++   default   define   也会   指示   hello   attr   typeof   

原文地址:http://www.cnblogs.com/leyi/p/7143648.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!