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